<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="pl-pl">
<link rel="self" type="application/atom+xml" href="https://forum.atnel.pl/feed.php?f=4&amp;t=23288&amp;mode" />

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2020-08-06T23:02:15+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=4&amp;t=23288&amp;mode</id>
<entry>
<author><name><![CDATA[SylwekK]]></name></author>
<updated>2020-08-06T23:02:15+01:00</updated>
<published>2020-08-06T23:02:15+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=23288&amp;p=228537#p228537</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=23288&amp;p=228537#p228537"/>
<title type="html"><![CDATA[Re: Przełączanie Switch/Case  Button switch]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=23288&amp;p=228537#p228537"><![CDATA[
Czy KEY_DOWN w warunki nie powinno być zanegowane?<br />Problem rozwiązał by się też w kilku liniach bez tych wszystkich ifów w case gdyby reakcja była na puszczenie przycisku (krótki wcisk). Nie mam teraz kompa przy sobie, a na telefonie nie będę rzeźbił programu. Wykorzystaj Mirka odczyt klawiszy (lub mój - jest tu gdzieś na forum).<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1922">SylwekK</a> — 6 sie 2020, o 23:02</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[dmx1970]]></name></author>
<updated>2020-08-06T21:27:34+01:00</updated>
<published>2020-08-06T21:27:34+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=23288&amp;p=228535#p228535</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=23288&amp;p=228535#p228535"/>
<title type="html"><![CDATA[Re: Przełączanie Switch/Case  Button switch]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=23288&amp;p=228535#p228535"><![CDATA[
<div class="quotetitle">SylwekK napisał(a):</div><div class="quotecontent"><br />Uzależnij Case od dodatkowej flagi, która zezwoli na przełączenie, a flagę czyść po puszczeniu przycisku. Oczywiście o eliminacji drgań styków już wspomniano - jest niezbędna.<br /></div><br /><br />napisałem tak i nic to nie zmienia ( jak przycisk wciśnięty to przełączają się szybko, jak puszczam to się zatrzymuje) <br />może jeszcze jakaś podpowiedz<br /><br />[syntax=c]switch ( program ) {<br /><br />    case 0:<br /><br />        mode_0();<br /><br />        if ( KEY_DOWN )zezwolenie = 1;<br />        else zezwolenie = 0;<br />        if(zezwolenie == 1)<br />        {<br />            BEEP;  <br />            program = 1; <br />        }                                                 <br />        <br />                     <br />        break;<br /><br />    case 1:<br /><br />       <br />            mode_1();<br />            R_OFF;<br /><br />        if ( KEY_DOWN )zezwolenie = 1;<br />        else zezwolenie = 0;<br />        if(zezwolenie == 1)<br />        {<br />            BEEP;<br />            program = 2; <br />        }                                                 <br />        <br />   <br />        break;<br /><br />    case 2:<br /><br />            mode_2();<br />            G_OFF;<br />        if ( KEY_DOWN )zezwolenie = 1;<br />        else zezwolenie = 0;<br />        if(zezwolenie == 1)<br />        {<br />            BEEP;<br />            program = 0;<br />        }                                                 <br />        <br />   <br />        break;   <br />        }[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=5527">dmx1970</a> — 6 sie 2020, o 21:27</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[SylwekK]]></name></author>
<updated>2020-08-06T19:44:16+01:00</updated>
<published>2020-08-06T19:44:16+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=23288&amp;p=228534#p228534</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=23288&amp;p=228534#p228534"/>
<title type="html"><![CDATA[Re: Przełączanie Switch/Case  Button switch]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=23288&amp;p=228534#p228534"><![CDATA[
Uzależnij Case od dodatkowej flagi, która zezwoli na przełączenie, a flagę czyść po puszczeniu przycisku. Oczywiście o eliminacji drgań styków już wspomniano - jest niezbędna.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1922">SylwekK</a> — 6 sie 2020, o 19:44</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[fofex]]></name></author>
<updated>2020-08-06T07:25:32+01:00</updated>
<published>2020-08-06T07:25:32+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=23288&amp;p=228530#p228530</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=23288&amp;p=228530#p228530"/>
<title type="html"><![CDATA[Re: Przełączanie Switch/Case  Button switch]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=23288&amp;p=228530#p228530"><![CDATA[
Musisz dodać dwie rzeczy: eliminację dzwonienia styków oraz maszynę stanów dla przycisku.<br />Na przykład:<br /><br />[syntax=c]/* button.h */<br /> <br />#ifndef BUTTON_H_<br />#define BUTTON_H_<br /> <br />#define DEBOUNCE_MS 10<br /> <br />typedef struct ButtonConfigSet {<br />        volatile uint8_t *port;<br />        uint8_t mask;<br />        void (*onFunction)(void);<br />        void (*offFunction)(void);<br />} ButtonConfigSet;<br /> <br />typedef struct Button {<br />        uint16_t debounceTicks;<br />        uint8_t state;<br />        __flash const ButtonConfigSet *config;<br />} Button;<br /> <br /> <br />void Button_init(Button * const me, __flash const ButtonConfigSet *config);<br />void Button_service(Button * const me);<br /> <br />#endif /* BUTTON_H_ */[/syntax]<br /><br /><br />[syntax=c]/* button.c */<br /> <br />#include &quot;led.h&quot;<br />#include &quot;button.h&quot;<br /> <br />#define DEBOUNCE_TICKS ((unsigned long)TICKS_PER_SEC * DEBOUNCE_MS / 1000)<br /> <br />static void doFunction(Button * const me);<br /> <br />static inline uint8_t rawState(Button * const me)<br />{<br />        return *me-&gt;config-&gt;port &amp; me-&gt;config-&gt;mask;<br />}<br /> <br /> <br />void Button_init(Button * const me, __flash const ButtonConfigSet *config)<br />{<br />        me-&gt;config = config;<br />        me-&gt;debounceTicks = DEBOUNCE_TICKS;<br />        me-&gt;state = rawState(me);<br /> <br />        doFunction(me);<br />}<br /> <br /> <br />void Button_service(Button * const me)<br />{<br /> <br />        uint8_t tmp = rawState(me);<br /> <br />        if(tmp==me-&gt;state)<br />        {<br />                me-&gt;debounceTicks = DEBOUNCE_TICKS;<br />        }<br />        else<br />        {<br />                if(!me-&gt;debounceTicks || !--me-&gt;debounceTicks)<br />                {<br />                        me-&gt;state = tmp;<br />                        doFunction(me);<br />                }<br />        }<br /> <br />}<br /> <br /> <br />void doFunction(Button * const me)<br />{<br />        if(!me-&gt;state) /* low depressed */<br />        {<br />                if(me-&gt;config-&gt;onFunction)<br />                        (*me-&gt;config-&gt;onFunction)();<br />        }<br />        else<br />        {<br />                if(me-&gt;config-&gt;offFunction)<br />                        (*me-&gt;config-&gt;offFunction)();<br />        }<br />}[/syntax]<br /><br />[syntax=c]/* main.c */<br /> <br /><br />#include &quot;button.h&quot;<br /> <br />static void onFunction(void);<br />static bool getButton(void); <br />static bool buttonState; <br /> <br />static __flash const ButtonConfigSet buttonConfig = {<br />                                &amp;PINA,                          /* volatile uint8_t *port; */<br />                                (1&lt;&lt;PA2),      /* uint8_t mask; */<br />                                onFunction,            /* void (*onFunction)(void); */<br />                                NULL            /* void (*offFunction)(void); */<br />};<br /> <br />static Button button;<br /> <br />__attribute__((OS_main))<br />int main()<br />{<br />        Button_init(&amp;button, &amp;buttonConfig);<br />...<br />}<br /><br />void onFunction(void)<br />{<br />   buttonState = true;<br />}<br /><br />bool getButton(void)<br />{<br />   bool tmp = buttonState;<br />   buttonState = false;<br />   return tmp;<br />}[/syntax]<br /><br /><br /><br />[syntax=c]ISR(TIMER2_OVF_vect){           // ciało procedury obsługi przerwania TIMER 2 (100hz)<br /> <br />TCNT2 = 198;<br /><br />Button_service(&amp;button); <br /><br />        switch(program){<br /> <br />        case 0:<br /> <br />                mode_0();<br /> <br />                if(y &gt;= 12000)<br />                {<br />                        R_OFF;<br />                        G_OFF;<br />                        BEEP1L;<br />                        V_START_OFF;    // atm off<br />                }<br /> <br />                if(getButton()){<br /> <br />                        BEEP;<br />                        program = 1;<br />                }<br />        break;<br />...<br /> }[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=21072">fofex</a> — 6 sie 2020, o 07:25</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[dmx1970]]></name></author>
<updated>2020-08-05T22:45:58+01:00</updated>
<published>2020-08-05T22:45:58+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=23288&amp;p=228528#p228528</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=23288&amp;p=228528#p228528"/>
<title type="html"><![CDATA[Przełączanie Switch/Case  Button switch]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=23288&amp;p=228528#p228528"><![CDATA[
Witam, mam problem z przełączaniem case przyciskiem button switch, zapętla się jak trzymam przycisk, jak to zapisać żeby przełączył na kolejny case dopiero jak puszcze przycisk i wcisnę ponownie<br />Atmega 32, 12mhz zewnetrzyny, Timer2 100hz<br /><br />[syntax=c]#define KEY_PIN      (1&lt;&lt;PA2)          // Start/Mode<br />#define KEY_DOWN    !(PINA &amp; KEY_PIN)<br /><br />void mode_0 (void);// Pomiar Baterii i wylacznik zasilania po 2 min.<br />void mode_1 (void);// 1_MODE<br />void mode_2 (void);// 2_MODE<br /><br />// Zmienne dla TIMERA2<br />volatile uint16_t x;<br />volatile uint16_t y;[/syntax]<br /><br /><br />[syntax=c]ISR(TIMER2_OVF_vect){// ciało procedury obsługi przerwania TIMER 2 (100hz)<br /><br />TCNT2 = 198;<br /><br />switch(program){<br /><br />case 0:<br /><br />mode_0();<br /><br />if(y &gt;= 12000)<br />{<br />R_OFF;<br />G_OFF;<br />BEEP1L;<br />V_START_OFF;// atm off<br />}<br /><br />if(KEY_DOWN){<br /><br />BEEP;<br />program = 1;<br />}<br />break;<br /><br />case 1:<br /><br />if(program == 1){<br />mode_1();<br /><br />R_OFF;<br /><br />if(z &gt;= 12000)<br />{<br />G_OFF;<br />BEEP3S;<br />program = 0;<br />}<br /><br />if(KEY_DOWN){<br /><br />BEEP;<br />program = 2;<br />}<br />}<br /><br />break;<br /><br />case 2:<br /><br />if(program == 2){<br />mode_2();<br />G1_OFF;<br /><br />if(KEY_DOWN){<br /><br />BEEP;<br />program = 0;<br />}<br />}<br />break;<br /><br />}[/syntax]<br /><br /><br />[syntax=c]void mode_0 (void){<br />if(V_START_ON)<br />{<br /><br />// instrukcje<br /><br />}<br />}<br /><br /><br /><br />void mode_1 (void){<br />if(V_START_ON)<br />{<br />// instrukcje<br /><br />}<br />}<br /><br />void mode_2 (void){<br /><br />if(V_START_ON)<br />{<br /><br />// instrukcje<br /><br />}<br />}[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=5527">dmx1970</a> — 5 sie 2020, o 22:45</p><hr />
]]></content>
</entry>
</feed>