<?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=58&amp;t=19592&amp;mode" />

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2018-04-26T09:12:05+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=58&amp;t=19592&amp;mode</id>
<entry>
<author><name><![CDATA[Tom92]]></name></author>
<updated>2018-04-26T09:12:05+01:00</updated>
<published>2018-04-26T09:12:05+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=19592&amp;p=207155#p207155</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=19592&amp;p=207155#p207155"/>
<title type="html"><![CDATA[Re: Obsługa klawiszy]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=19592&amp;p=207155#p207155"><![CDATA[
Metodą prób i błędów rozwiązałem problem.<br /><br />Wydaje mi się, że było tak jak mówiłem czyli Timery sobie tak jakby przeszkadzały. Nie wiem czy dobrze myślę, ale właśnie tak myśląc podszedłem do tego inaczej.<br /><br />Zainicjowałem timer wewnątrz funkcji &quot;void change_color(void);&quot; i teraz nie ma żadnych mignięć diody, tylko normalnie świeci z zadanym wypełnieniem zmiennych pwm_r, pwm_g, pwm_b 0-255. Przy krótkim wciśnięciu przycisku zmieniają się kolory oraz przy długim wciśnięciu zeruję zmienne pwm_r, pwm_g, pwm_b tak jak zaproponował rskup.<br /><br />Wszystko działa tak jak chciałem. Dziękuję za zaangażowanie w temat <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=11336">Tom92</a> — 26 kwi 2018, o 09:12</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[rskup]]></name></author>
<updated>2018-04-22T23:12:03+01:00</updated>
<published>2018-04-22T23:12:03+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=19592&amp;p=207061#p207061</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=19592&amp;p=207061#p207061"/>
<title type="html"><![CDATA[Re: Obsługa klawiszy]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=19592&amp;p=207061#p207061"><![CDATA[
W długim naciśnięciu wywołujesz funkcję  change_ON_OFF() a ona robi LEDS_ON / LEDS_OFF. Tylko że w przerwaniu Timer1 zmieniasz stany tych LEDów cyklicznie na OFF i ON. Więc Twoje wyłączenie zadziała tylko do czasu następnego przelotu pwm-a.<br />Jak chcesz wyłączać LEDy to wyzeruj wartości w zmiennych pwm_r, pwm_g, pwm_b lub dodaj dodatkową zmienną pwm_on_off (lub zamień istniejącą statyczną zmiennej flaga) i ją zmieniaj w momencie zmiany stanu ON/OFF oraz sprawdzaj na jej podstawie w przerwaniu Timer1 czy możesz zmieniać stan LEDów.<br /><br />-- <br />Pozdrawiam,<br />Robert<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=3427">rskup</a> — 22 kwi 2018, o 23:12</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Tom92]]></name></author>
<updated>2018-04-20T09:24:56+01:00</updated>
<published>2018-04-20T09:24:56+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=19592&amp;p=206986#p206986</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=19592&amp;p=206986#p206986"/>
<title type="html"><![CDATA[Re: Obsługa klawiszy]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=19592&amp;p=206986#p206986"><![CDATA[
Nie da się tak jak bym chciał?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=11336">Tom92</a> — 20 kwi 2018, o 09:24</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Tom92]]></name></author>
<updated>2018-04-19T08:41:20+01:00</updated>
<published>2018-04-19T08:41:20+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=19592&amp;p=206962#p206962</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=19592&amp;p=206962#p206962"/>
<title type="html"><![CDATA[Re: Obsługa klawiszy]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=19592&amp;p=206962#p206962"><![CDATA[
<div class="quotetitle">rskup napisał(a):</div><div class="quotecontent"><br />Zrób nowy projekt i wrzuć w nim obsługę Timer1 i miganie jedna diodą. Dzięki temu sprawdzisz sobie czy na pewno dobrze inicjalizujesz Timer1<br /></div><br />Sorki, ale nie mam takiego doświadczenia dlatego nie przyszło mi na myśl, żeby tak sobie to sprawdzić. Dobrze, więc zrobiłem jak zasugerowałeś i faktycznie, źle inicjowałem Timer1. Powinno być tak:<br /><br />[syntax=c]/* Timer1 - PWM */<br />TCCR1B |= (1&lt;&lt;WGM12);// tryb CTC<br />TCCR1B |= (1&lt;&lt;CS10);// preskaler = 1<br />OCR1A = 40000;// przerwanie co ok. 5 ms (200Hz)<br />TIMSK = (1&lt;&lt;OCIE1A);// Odblokowanie przerwania CompareMatch[/syntax]<br /><br />oraz wektor A, a nie B:<br /><br />[syntax=c]/* przerwanie Timer0 CompareM */<br />ISR(TIMER1_COMPA_vect) {<br /><br />// przykładowy kod<br /><br />}[/syntax]<br /><br />Teraz wrzuciłem ten Timer do mojego projektu i kolory się wyświetlają, mogę przyciskiem je przełączać, ALE zauważyłem, że co ok. 1 sekunde dioda RGB lekko mrugnie i jest brak reakcji na dłuższe przytrzymanie klawisza.<br /><br />Mam wrażenie jakby Timery przeszkadzały sobie na wzajem? Nie wiem jak to rozwiązać. Poniżej zamieszczam aktualny kod jakby ktoś był miły zerknąć.<br /><br />[syntax=c]#include &lt;avr/io.h&gt;<br />#include &lt;avr/interrupt.h&gt;<br />#include &lt;util/delay.h&gt;<br /><br />/* konfiguracja pinów podłączonej diody LED RGB */<br />#define LEDR (1&lt;&lt;PB2)// definicja pinu R<br />#define LEDG (1&lt;&lt;PB0)// definicja pinu G<br />#define LEDB (1&lt;&lt;PB1)// definicja pinu B<br />#define LEDR_OFF PORTB |= LEDR// makrodefinicja - wyłączenie pinu R<br />#define LEDG_OFF PORTB |= LEDG// makrodefinicja - wyłączenie pinu G<br />#define LEDB_OFF PORTB |= LEDB// makrodefinicja - wyłączenie pinu B<br />#define LEDR_ON PORTB &amp;= ~LEDR// makrodefinicja - załączenie pinu R<br />#define LEDG_ON PORTB &amp;= ~LEDG// makrodefinicja - załączenie pinu G<br />#define LEDB_ON PORTB &amp;= ~LEDB// makrodefinicja - załączenie pinu B<br />#define LEDS_OFF PORTB |= (LEDR|LEDG|LEDB)// makrodefinicja - wyłączenie całej taśmy<br />#define LEDS_ON PORTB &amp;= ~(LEDR|LEDG|LEDB)// makrodefinicja - załączenie całej taśmy<br /><br />/* konfiguracja pinu podłączonego klawisza */<br />#define KEY1 (1&lt;&lt;PD5)<br />// **********************************************************<br /><br />/* struktura danych */<br />typedef struct {<br />volatile uint8_t *KPIN;<br />uint8_t key_mask;<br />uint8_t wait_time_s;<br />void (*kfun1)(void);<br />void (*kfun2)(void);<br />uint16_t klock;<br />uint8_t flag;<br />} TBUTTON;<br /><br />TBUTTON button; // definicja KLAWISZA<br /><br />/* timer programowy */<br />volatile uint16_t Timer0;<br /><br />volatile uint8_t pwm_r, pwm_g, pwm_b;<br /><br />/* definicje funckcji */<br />void change_color(void);// funkcja zmieniająca kolor taśmy LED RGB<br />void change_ON_OFF(void);// funkcja załączająca i wyłączająca taśmę LED<br />void key_press( TBUTTON * btn );// funkcja obsługi pojedynczych klawiszy<br />void set_color(uint8_t red, uint8_t green, uint8_t blue);<br /><br />//------------------------------------------------------------------<br /><br />int main(void) {<br /><br />PORTD |= KEY1;  // podciągamy linie klawiszy do VCC<br />DDRB |= LEDR|LEDG|LEDB;   // piny LED jako WYjścia<br /><br />/* Timer0 – konfigurcajca silnika timerów programowych */<br />TCCR0A  |= (1&lt;&lt;WGM01);   // tryb pracy CTC<br />TCCR0B  |= (1&lt;&lt;CS02)|(1&lt;&lt;CS00); // preskaler = 1024<br />OCR0A  = 78;   // przerwanie porównania co ok. 10ms (100,16Hz)<br />TIMSK  = (1&lt;&lt;OCIE0A); // Odblokowanie przerwania CompareMatch<br /><br />/* Timer1 - PWM */<br />TCCR1B |= (1&lt;&lt;WGM12);// tryb CTC<br />TCCR1B |= (1&lt;&lt;CS10);// preskaler = 1<br />OCR1A = 40000;// przerwanie co ok. 5 ms (200Hz)<br />TIMSK = (1&lt;&lt;OCIE1A);// Odblokowanie przerwania CompareMatch<br /><br />button.KPIN = &amp;PIND;<br />button.key_mask = KEY1;<br />button.wait_time_s = 1;<br />button.kfun1 = change_color;<br />button.kfun2 = change_ON_OFF;<br /><br />sei();<br /><br />while(1) {<br /><br />key_press( &amp;button );<br /><br />}<br />}<br />//------------------------------------------------------------------<br /><br /><br /><br />/* przerwanie Timer0 CompareM */<br />ISR(TIMER0_COMPA_vect) {<br /><br />uint16_t n;<br /><br />n = Timer0;  /* 100,16Hz Timer1 */<br />if (n) Timer0 = --n;// odliczanie czasu wciśniętego klawisza<br /><br />}<br /><br /><br /><br />/* przerwanie Timer1 CompareM */<br />ISR(TIMER1_COMPA_vect) {<br /><br />static uint8_t cnt;// definicja zmiennej statycznej licznika PWM<br /><br />// bezpośrednie sterowanie wyjściami kanałów PWM<br />if(cnt&gt;=pwm_r) LEDR_OFF; else LEDR_ON;<br />if(cnt&gt;=pwm_g) LEDG_OFF; else LEDG_ON;<br />if(cnt&gt;=pwm_b) LEDB_OFF; else LEDB_ON;<br /><br />cnt++;// zwiększanie licznika o 1<br /><br />}<br /><br /><br /><br />/* funkcja do obsługi pojedynczych klawiszy */<br />void key_press( TBUTTON * btn )<br />{<br />        register uint8_t key_press = (*btn-&gt;KPIN &amp; btn-&gt;key_mask);<br /><br />        if( !btn-&gt;klock &amp;&amp; !key_press )<br />        {<br />                btn-&gt;klock=50000;<br />                btn-&gt;flag=1;<br />                Timer0 = (btn-&gt;wait_time_s*1000)/10;<br />        }<br />        else if( btn-&gt;klock &amp;&amp; key_press )<br />        {<br />                (btn-&gt;klock)++;<br />                if( !btn-&gt;klock &amp;&amp; btn-&gt;flag )<br />                {<br />                        // reakcja na krótkie wcinięcie klawisza - reakcja po zwolnieniu przycisku<br />                        if(btn-&gt;kfun1) btn-&gt;kfun1();<br />                        Timer0=0;<br />                        btn-&gt;flag=0;<br />                }<br />        } else if( btn-&gt;flag &amp;&amp; !Timer0 )<br />        {<br />          // reakcja na dłuższe wciniecie klawisza<br />          if(btn-&gt;kfun2) btn-&gt;kfun2();<br />          btn-&gt;flag=0;<br />        }<br />}<br /><br /><br /><br />/* własna funkcja - zmiana koloru taśmy */<br />void change_color(void) {<br />// stan=0, zmienna statyczna czyli zachowuje się jak zmienna globalna, ale dostępna jest tylko w tej funkcji<br />static uint8_t stan;// zmienna statyczna<br />stan++;// zwiększanie o 1<br />if (stan&gt;6) stan=0;// zmienna stan może przyjąc wortości od 0 do 6<br /><br />if (stan==0) {// biały<br />set_color( 255, 255, 255 );<br />}<br />else if (stan==1) {// czerwony<br /><br />set_color( 255, 0, 0 );<br />}<br />else if (stan==2) {// zielony<br />set_color( 0, 255, 0 );<br />}<br />else if (stan==3) {// niebieski<br />set_color( 0, 0, 255 );<br />}<br />else if (stan==4) {// fioletowy<br />set_color( 255, 0, 255 );<br />}<br />else if (stan==5) {// żółty<br />set_color( 255, 255, 0 );<br />}<br />else {// błękitny<br />set_color( 0, 255, 255 );<br />}<br />}<br /><br /><br /><br />/* własna funkcja - wyłączenie/załączenie taśmy */<br />void change_ON_OFF(void) {<br />// flaga=0, zmienna statyczna czyli zachowuje się jak zmienna globalna, ale dostępna jest tylko w tej funkcji<br />static uint8_t flaga;<br />if (flaga) {// jeżeli flaga jest równa 1 (lub różna od 0) to włącz diody i wyzeruj tą flagę (flaga=0)<br />LEDS_ON;<br />flaga=0;<br />}<br />else {// natomiast jeżeli flaga jest równa 0 to wyłącz diody i ustaw flagę (flaga=1)<br />LEDS_OFF;<br />flaga=1;<br />}<br />}<br /><br /><br /><br />/* funkcja ustawiająca wybrany kolor diody RGB */<br />void set_color(uint8_t red, uint8_t green, uint8_t blue)<br />{<br /> if ( pwm_r &gt; red ) while (pwm_r &gt; red) {pwm_r--;}<br />else if ( pwm_r &lt; red ) while (pwm_r &lt; red) {pwm_r++;}<br /><br /> if ( pwm_g &gt; green ) while (pwm_g &gt; green) {pwm_g--;}<br />else if ( pwm_g &lt; green ) while (pwm_g &lt; green) {pwm_g++;}<br /><br /> if ( pwm_b &gt; blue ) while (pwm_b &gt;  blue) {pwm_b--;}<br />else if ( pwm_b &lt; blue ) while (pwm_b &lt;  blue) {pwm_b++;}<br />}[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=11336">Tom92</a> — 19 kwi 2018, o 08:41</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2018-04-18T14:49:14+01:00</updated>
<published>2018-04-18T14:49:14+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=19592&amp;p=206936#p206936</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=19592&amp;p=206936#p206936"/>
<title type="html"><![CDATA[Re: Obsługa klawiszy]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=19592&amp;p=206936#p206936"><![CDATA[
<div class="quotetitle">rskup napisał(a):</div><div class="quotecontent"><br />Zrób nowy projekt i wrzuć w nim obsługę Timer1 i miganie jedna diodą. Dzięki temu sprawdzisz sobie czy na pewno dobrze inicjalizujesz Timer1 (używasz dobre rejestry i wartości w nich) i korzystasz z jego przerwań. Jak Ci zadziała to należy szukać dalej w kolejnych częściach kodu.<br /></div><br />I to trzeba powtarzać młodym adeptom programowania do znudzenia ... <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=54">mirekk36</a> — 18 kwi 2018, o 14:49</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[rskup]]></name></author>
<updated>2018-04-18T14:45:01+01:00</updated>
<published>2018-04-18T14:45:01+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=19592&amp;p=206935#p206935</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=19592&amp;p=206935#p206935"/>
<title type="html"><![CDATA[Re: Obsługa klawiszy]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=19592&amp;p=206935#p206935"><![CDATA[
<div class="quotetitle">Tom92 napisał(a):</div><div class="quotecontent"><br />Timerze1 też mi nic nie chciało działać<br /></div>Jest taki prosty sprawdzony sposób do rozwiązywania takich problemów. O nim Mirek też ciągle wspomina ...<br />Zrób nowy projekt i wrzuć w nim obsługę Timer1 i miganie jedna diodą. Dzięki temu sprawdzisz sobie czy na pewno dobrze inicjalizujesz Timer1 (używasz dobre rejestry i wartości w nich) i korzystasz z jego przerwań. Jak Ci zadziała to należy szukać dalej w kolejnych częściach kodu.<br /><br />-- <br />Pozdrawiam,<br />Robert<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=3427">rskup</a> — 18 kwi 2018, o 14:45</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Tom92]]></name></author>
<updated>2018-04-18T09:53:30+01:00</updated>
<published>2018-04-18T09:53:30+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=19592&amp;p=206930#p206930</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=19592&amp;p=206930#p206930"/>
<title type="html"><![CDATA[Re: Obsługa klawiszy]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=19592&amp;p=206930#p206930"><![CDATA[
Witam!<br />Wróciłem do tego projektu, ponieważ chciałem go trochę ulepszyć o sterowanie PWM diodą RGB. Gdy do przerwania dodałem sterowanie wyjściami tak:<br /><br />[syntax=c]/* przerwanie Timer0 CompareM */<br />ISR(TIMER0_COMPA_vect) {<br /><br />uint16_t n;<br /><br />n = Timer0;  /* 100,16Hz Timer1 */<br />if (n) Timer0 = --n;// odliczanie czasu wciśniętego klawisza<br /><br />        static uint8_t cnt;// definicja zmiennej statycznej licznika PWM<br /><br />// bezpośrednie sterowanie wyjściami kanałów PWM<br />if(cnt&gt;=pwm_r) LEDR_OFF; else LEDR_ON;<br />if(cnt&gt;=pwm_g) LEDG_OFF; else LEDG_ON;<br />if(cnt&gt;=pwm_b) LEDB_OFF; else LEDB_ON;<br /><br />cnt++;// zwiększanie licznika o 1<br /><br />}[/syntax]<br /><br />to jest brak reakcji na dłuższe przytrzymanie klawisza oraz dioda co jakiś czas mignie. Natomiast jak dodałem kolejny Timera1 to teraz nic nie działa. Możliwe, że może mieć to związek z tym, że wcześniej w tym temacie na Timerze1 też mi nic nie chciało działać? Ale dlaczego? Może ktoś będzie miał pomysł dlaczego tak jest? Poniżej zamieszczam cały kod:<br /><br />[syntax=c]#include &lt;avr/io.h&gt;<br />#include &lt;avr/interrupt.h&gt;<br />#include &lt;util/delay.h&gt;<br /><br />/* konfiguracja pinów podłączonej diody LED RGB */<br />#define LEDR (1&lt;&lt;PB2)// definicja pinu R<br />#define LEDG (1&lt;&lt;PB0)// definicja pinu G<br />#define LEDB (1&lt;&lt;PB1)// definicja pinu B<br />#define LEDR_OFF PORTB |= LEDR// makrodefinicja - wyłączenie pinu R<br />#define LEDG_OFF PORTB |= LEDG// makrodefinicja - wyłączenie pinu G<br />#define LEDB_OFF PORTB |= LEDB// makrodefinicja - wyłączenie pinu B<br />#define LEDR_ON PORTB &amp;= ~LEDR// makrodefinicja - załączenie pinu R<br />#define LEDG_ON PORTB &amp;= ~LEDG// makrodefinicja - załączenie pinu G<br />#define LEDB_ON PORTB &amp;= ~LEDB// makrodefinicja - załączenie pinu B<br />#define LEDS_OFF PORTB |= (LEDR|LEDG|LEDB)// makrodefinicja - wyłączenie całej taśmy<br />#define LEDS_ON PORTB &amp;= ~(LEDR|LEDG|LEDB)// makrodefinicja - załączenie całej taśmy<br /><br />/* konfiguracja pinu podłączonego klawisza */<br />#define KEY1 (1&lt;&lt;PD5)<br />// **********************************************************<br /><br />/* struktura danych */<br />typedef struct {<br />volatile uint8_t *KPIN;<br />uint8_t key_mask;<br />uint8_t wait_time_s;<br />void (*kfun1)(void);<br />void (*kfun2)(void);<br />uint16_t klock;<br />uint8_t flag;<br />} TBUTTON;<br /><br />TBUTTON button; // definicja KLAWISZA<br /><br />/* timer programowy */<br />volatile uint16_t Timer0;<br /><br />volatile uint8_t pwm_r, pwm_g, pwm_b;<br /><br />/* definicje funckcji */<br />void change_color(void);// funkcja zmieniająca kolor taśmy LED RGB<br />void change_ON_OFF(void);// funkcja załączająca i wyłączająca taśmę LED<br />void key_press( TBUTTON * btn );// funkcja obsługi pojedynczych klawiszy<br />void set_color(uint8_t red, uint8_t green, uint8_t blue);<br /><br />//------------------------------------------------------------------<br /><br />int main(void) {<br /><br />PORTD |= KEY1;  // podciągamy linie klawiszy do VCC<br />DDRB |= LEDR|LEDG|LEDB;   // piny LED jako WYjścia<br /><br />/* Timer0 – konfigurcajca silnika timerów programowych */<br />TCCR0A  |= (1&lt;&lt;WGM01);   // tryb pracy CTC<br />TCCR0B  |= (1&lt;&lt;CS02)|(1&lt;&lt;CS00); // preskaler = 1024<br />OCR0A  = 78;   // przerwanie porównania co ok. 10ms (100,16Hz)<br />TIMSK  = (1&lt;&lt;OCIE0A); // Odblokowanie przerwania CompareMatch<br /><br />/* Timer1 - PWM */<br />TCCR1B |= (1&lt;&lt;WGM12);// tryb CTC<br />TCCR1B |= (1&lt;&lt;CS10);// preskaler = 1<br />OCR1BL = 200;<br />TIMSK = (1&lt;&lt;OCIE1B);// Odblokowanie przerwania CompareMatch<br /><br />button.KPIN = &amp;PIND;<br />button.key_mask = KEY1;<br />button.wait_time_s = 1;<br />button.kfun1 = change_color;<br />button.kfun2 = change_ON_OFF;<br /><br />sei();<br /><br />while(1) {<br /><br />key_press( &amp;button );<br /><br />// przykładowy niezależny i nieblokujący proces<br />//  if( !Timer1 ) {<br />//   Timer1=50;<br />//   PORTC ^= LED4;<br />//  }<br />}<br />}<br />//------------------------------------------------------------------<br /><br /><br /><br />/* przerwanie Timer0 CompareM */<br />ISR(TIMER0_COMPA_vect) {<br /><br />uint16_t n;<br /><br />n = Timer0;  /* 100,16Hz Timer1 */<br />if (n) Timer0 = --n;// odliczanie czasu wciśniętego klawisza<br /><br />}<br /><br /><br /><br />/* przerwanie Timer0 CompareM */<br />ISR(TIMER1_COMPB_vect) {<br /><br />static uint8_t cnt;// definicja zmiennej statycznej licznika PWM<br /><br />// bezpośrednie sterowanie wyjściami kanałów PWM<br />if(cnt&gt;=pwm_r) LEDR_OFF; else LEDR_ON;<br />if(cnt&gt;=pwm_g) LEDG_OFF; else LEDG_ON;<br />if(cnt&gt;=pwm_b) LEDB_OFF; else LEDB_ON;<br /><br />cnt++;// zwiększanie licznika o 1<br /><br />}<br /><br /><br /><br />/* funkcja do obsługi pojedynczych klawiszy */<br />void key_press( TBUTTON * btn )<br />{<br />        register uint8_t key_press = (*btn-&gt;KPIN &amp; btn-&gt;key_mask);<br /><br />        if( !btn-&gt;klock &amp;&amp; !key_press )<br />        {<br />                btn-&gt;klock=50000;<br />                btn-&gt;flag=1;<br />                Timer0 = (btn-&gt;wait_time_s*1000)/10;<br />        }<br />        else if( btn-&gt;klock &amp;&amp; key_press )<br />        {<br />                (btn-&gt;klock)++;<br />                if( !btn-&gt;klock &amp;&amp; btn-&gt;flag )<br />                {<br />                        // reakcja na krótkie wcinięcie klawisza - reakcja po zwolnieniu przycisku<br />                        if(btn-&gt;kfun1) btn-&gt;kfun1();<br />                        Timer0=0;<br />                        btn-&gt;flag=0;<br />                }<br />        } else if( btn-&gt;flag &amp;&amp; !Timer0 )<br />        {<br />          // reakcja na dłuższe wciniecie klawisza<br />          if(btn-&gt;kfun2) btn-&gt;kfun2();<br />          btn-&gt;flag=0;<br />        }<br />}<br /><br /><br /><br />/* własna funkcja - zmiana koloru taśmy */<br />void change_color(void) {<br />// stan=0, zmienna statyczna czyli zachowuje się jak zmienna globalna, ale dostępna jest tylko w tej funkcji<br />static uint8_t stan;// zmienna statyczna<br />stan++;// zwiększanie o 1<br />if (stan&gt;6) stan=0;// zmienna stan może przyjąc wortości od 0 do 6<br /><br />if (stan==0) {// biały<br />set_color( 255, 255, 255 );<br />}<br />else if (stan==1) {// czerwony<br /><br />set_color( 255, 0, 0 );<br />}<br />else if (stan==2) {// zielony<br />set_color( 0, 255, 0 );<br />}<br />else if (stan==3) {// niebieski<br />set_color( 0, 0, 255 );<br />}<br />else if (stan==4) {// fioletowy<br />set_color( 255, 0, 255 );<br />}<br />else if (stan==5) {// żółty<br />set_color( 255, 255, 0 );<br />}<br />else {// błękitny<br />set_color( 0, 255, 255 );<br />}<br />}<br /><br /><br /><br />/* własna funkcja - wyłączenie/załączenie taśmy */<br />void change_ON_OFF(void) {<br />// flaga=0, zmienna statyczna czyli zachowuje się jak zmienna globalna, ale dostępna jest tylko w tej funkcji<br />static uint8_t flaga;<br />if (flaga) {// jeżeli flaga jest równa 1 (lub różna od 0) to włącz diody i wyzeruj tą flagę (flaga=0)<br />LEDS_ON;<br />flaga=0;<br />}<br />else {// natomiast jeżeli flaga jest równa 0 to wyłącz diody i ustaw flagę (flaga=1)<br />LEDS_OFF;<br />flaga=1;<br />}<br />}<br /><br /><br /><br />/* funkcja ustawiająca wybrany kolor diody RGB */<br />void set_color(uint8_t red, uint8_t green, uint8_t blue)<br />{<br /> if ( pwm_r &gt; red ) while (pwm_r &gt; red) {pwm_r--;}<br />else if ( pwm_r &lt; red ) while (pwm_r &lt; red) {pwm_r++;}<br /><br /> if ( pwm_g &gt; green ) while (pwm_g &gt; green) {pwm_g--;}<br />else if ( pwm_g &lt; green ) while (pwm_g &lt; green) {pwm_g++;}<br /><br /> if ( pwm_b &gt; blue ) while (pwm_b &gt;  blue) {pwm_b--;}<br />else if ( pwm_b &lt; blue ) while (pwm_b &lt;  blue) {pwm_b++;}<br />}[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=11336">Tom92</a> — 18 kwi 2018, o 09:53</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[anshar]]></name></author>
<updated>2017-11-13T20:22:50+01:00</updated>
<published>2017-11-13T20:22:50+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=19592&amp;p=198884#p198884</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=19592&amp;p=198884#p198884"/>
<title type="html"><![CDATA[Re: Obsługa klawiszy]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=19592&amp;p=198884#p198884"><![CDATA[
Zmień jeszcze deklarację:<br />[syntax=c]uint8_t klock;[/syntax]<br />na <br />[syntax=c]uint16_t klock;[/syntax]<br />skoro inicjujesz ją w ten sposób:<br />[syntax=c]btn-&gt;klock=50000;[/syntax]<br /><br />Wartość 50000 raczej się nie zmieści w zmiennej 8 bitowej.  <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=7157">anshar</a> — 13 lis 2017, o 20:22</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Tom92]]></name></author>
<updated>2017-11-13T20:16:22+01:00</updated>
<published>2017-11-13T20:16:22+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=19592&amp;p=198883#p198883</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=19592&amp;p=198883#p198883"/>
<title type="html"><![CDATA[Re: Obsługa klawiszy]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=19592&amp;p=198883#p198883"><![CDATA[
Panowie poradziłem sobie z problemem. Ustawiłem Timer0:<br /><br />[syntax=c]/* Timer0 – konfigurcajca silnika timerów programowych */<br /> TCCR0A  |= (1&lt;&lt;WGM01);   // tryb pracy CTC<br /> TCCR0B  |= (1&lt;&lt;CS02)|(1&lt;&lt;CS00); // preskaler = 1024<br /> OCR0A  = 78;   // przerwanie porównania co ok. 10ms (100,16Hz)<br /> TIMSK  = (1&lt;&lt;OCIE0A); // Odblokowanie przerwania CompareMatch[/syntax]<br /><br />Teraz działa prawidłowo. Ale jestem ciekawy dlaczego na Timerze1 nie chciało działać? Źle skonfigurowałem czy coś innego miało na to wpływ np. pin do którego podłączyłem klawisz?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=11336">Tom92</a> — 13 lis 2017, o 20:16</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Tom92]]></name></author>
<updated>2017-11-13T17:37:59+01:00</updated>
<published>2017-11-13T17:37:59+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=19592&amp;p=198876#p198876</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=19592&amp;p=198876#p198876"/>
<title type="html"><![CDATA[Re: Obsługa klawiszy]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=19592&amp;p=198876#p198876"><![CDATA[
Ok zaczęło mi reagować na dłuższe przytrzymanie klawisza, diody zgasną, ale jak ponownie nacisnę to odrazu wszystkie się zapalą i już nie reaguje na dłuższe przytrzymanie klawisza, dziwne bo na atmedze32 działało normalnie <img src="https://forum.atnel.pl/images/smilies/icon_e_sad.gif" alt=":(" title="Smutny" /><br /><br />Nie rozumiem, ten sam kod na atmedze32 działa normalnie a natomiast na attiny2313 nie chce działać, dziwne rzeczy się dzieją. Jedyne co zmieniałem to Timer1:<br /><br />[syntax=c]#include &lt;avr/io.h&gt;<br />#include &lt;avr/interrupt.h&gt;<br />#include &lt;util/delay.h&gt;<br /><br /><br />//// *************   definicje dla preprocesora<br />// dioda LED RGB<br />#define LED1 (1&lt;&lt;PB0)// definicja pinu do którego podłączona jest dioda R<br />#define LED2 (1&lt;&lt;PB1)// definicja pinu do którego podłączona jest dioda G<br />#define LED3 (1&lt;&lt;PB2)// definicja pinu do którego podłączona jest dioda B<br />#define LED1_OFF PORTB |= LED1// makrodefinicja - wyłączenie diody<br />#define LED2_OFF PORTB |= LED2<br />#define LED3_OFF PORTB |= LED3<br />#define LED1_ON PORTB &amp;= ~LED1// makrodefinicja - załączenie diody<br />#define LED2_ON PORTB &amp;= ~LED2<br />#define LED3_ON PORTB &amp;= ~LED3<br />#define LEDS_OFF PORTB |= (LED1|LED2|LED3)// makrodefinicja - wyłączenie całej taśmy<br />#define LEDS_ON PORTB &amp;= ~(LED1|LED2|LED3)// makrodefinicja - załączenie całej taśmy<br /><br />// klawisz K1<br />#define KEY1 (1&lt;&lt;PD5)<br /><br />typedef struct {<br /> volatile uint8_t *KPIN;<br /> uint8_t key_mask;<br /> uint8_t wait_time_s;<br /> void (*kfun1)(void);<br /> void (*kfun2)(void);<br /> uint8_t klock;<br /> uint8_t flag;<br />} TBUTTON;<br /><br />// timery programowe<br />volatile uint16_t Timer1;<br /><br />// własne funkcje użytkownika<br />void change_led1(void) {<br />// flaga=0, zmienna statyczna czyli zachowuje się jak zmienna globalna, ale dostępna jest tylko w tej funkcji<br />static uint8_t stan;<br />stan++;<br />if (stan&gt;3) stan=0;<br />if (stan==0) {<br />LED1_ON;<br />LED2_OFF;<br />LED3_OFF;<br />}<br />else if (stan==1) {<br />LED1_OFF;<br />LED2_ON;<br />LED3_OFF;<br />}<br />else if (stan==2) {<br />LED1_OFF;<br />LED2_OFF;<br />LED3_ON;<br />}<br />else if (stan==3) {<br />LED1_ON;<br />LED2_ON;<br />LED3_ON;<br />}<br />}<br /><br />void change_led2(void) {<br />// flaga=0, zmienna statyczna czyli zachowuje się jak zmienna globalna, ale dostępna jest tylko w tej funkcji<br />static uint8_t flaga;<br /><br />if (flaga) {// jeżeli flaga jest równa 1 (lub różna od 0) to włącz diody i wyzeruj tą flagę (flaga=0)<br />LEDS_ON;<br />flaga=0;<br />}<br />else {// natomiast jeżeli jest równa 0 to wyłącz diody i ustaw flagę (flaga=1)<br />LEDS_OFF;<br />flaga=1;<br />}<br />}<br />// LUB TAK //<br />//static uint8_t flaga;<br />//<br />//if(flaga) LEDS_ON;<br />//else LEDS_OFF;<br />//<br />//flaga = !flaga;<br /><br /><br />// funkcja obsługi pojedynczych klawiszy<br />void key_press( TBUTTON * btn );<br /><br /><br />TBUTTON button; // definicja KLAWISZA<br /><br />//------------------------------------------------------------------<br />int main(void) {<br /><br /> PORTD |= KEY1;  // podciągamy linie klawiszy do VCC<br /> DDRB |= LED1|LED2|LED3;   // piny LED jako WYjścia<br /><br /> /* Timer1 – konfigurcajca silnika timerów programowych */<br /> TCCR1B  |= (1&lt;&lt;WGM12);   // tryb pracy CTC<br /> TCCR1B  |= (1&lt;&lt;CS12)|(1&lt;&lt;CS10); // preskaler = 1024<br /> OCR1B  = 78;   // przerwanie porównania co ok. 10ms (100,16Hz)<br /> TIMSK  = (1&lt;&lt;OCIE1A); // Odblokowanie przerwania CompareMatch<br /><br /> button.KPIN = &amp;PIND;<br /> button.key_mask = KEY1;<br /> button.wait_time_s = 5;<br /> button.kfun1 = change_led1;<br /> button.kfun2 = change_led2;<br /><br /> sei();<br /><br /> while(1) {<br /><br />  key_press( &amp;button );<br /><br />  // przykładowy niezależny i nieblokujący proces<br />//  if( !Timer1 ) {<br />//   Timer1=50;<br />//   PORTC ^= LED4;<br />//  }<br /><br /> }<br /><br />}<br />//------------------------------------------------------------------<br /><br />void key_press( TBUTTON * btn )<br />{<br />        register uint8_t key_press = (*btn-&gt;KPIN &amp; btn-&gt;key_mask);<br /><br />        if( !btn-&gt;klock &amp;&amp; !key_press )<br />        {<br />                btn-&gt;klock=50000;<br />                btn-&gt;flag=1;<br />                Timer1 = (btn-&gt;wait_time_s*1000)/10;<br />        }<br />        else if( btn-&gt;klock &amp;&amp; key_press )<br />        {<br />                (btn-&gt;klock)++;<br />                if( !btn-&gt;klock &amp;&amp; btn-&gt;flag )<br />                {<br />                        // reakcja na krótkie wcinięcie klawisza - reakcja po zwolnieniu przycisku<br />                        if(btn-&gt;kfun1) btn-&gt;kfun1();<br />                        Timer1=0;<br />                        btn-&gt;flag=0;<br />                }<br />        } else if( btn-&gt;flag &amp;&amp; !Timer1 )<br />        {<br />          // reakcja na dłuższe wciniecie klawisza<br />          if(btn-&gt;kfun2) btn-&gt;kfun2();<br />          btn-&gt;flag=0;<br />        }<br />}<br /><br />//*** przerwanie Timer1 CompareM<br />ISR(TIMER1_COMPA_vect) {<br /><br /> uint16_t n;<br /><br /> n = Timer1;  /* 100,16Hz Timer1 */<br /> if (n) Timer1 = --n;<br />// n = Timer2;  /* 100Hz Timer2 */<br />// if (n) Timer2 = --n;<br />}[/syntax]<br /><br /><strong><span style="color: #808000">------------------------ [ Dodano po: 53 minutyach ]</span></strong><br /><br />Czy powodem może być rezonator kwarcowy?<br /><br />Teraz mam ustawione wewnętrzne taktowanie 8MHz, mam wlutować rezonator 11,0592MHz i tak ustawić timer na przerwania co równe 100Hz tak jak w kodzie superdebounce na blogu Pana Mirka? Bo teraz jak liczyłem to mam 100,16Hz. Ale to chyba znaczenia nie ma? Bo jak wgrywałem kod do Atmegi32 to mam ustawione 8MHz i działa. A jak przeniose do Attiny2313 to głupoty się dzieją.<br /><br />Nie mam już pomysłów <img src="https://forum.atnel.pl/images/smilies/icon_e_sad.gif" alt=":(" title="Smutny" /><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=11336">Tom92</a> — 13 lis 2017, o 17:37</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Marhef]]></name></author>
<updated>2017-11-13T17:02:40+01:00</updated>
<published>2017-11-13T17:02:40+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=19592&amp;p=198872#p198872</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=19592&amp;p=198872#p198872"/>
<title type="html"><![CDATA[Re: Obsługa klawiszy]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=19592&amp;p=198872#p198872"><![CDATA[
Linia 93 OCR1B? Masz OCR0B<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=12752">Marhef</a> — 13 lis 2017, o 17:02</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Tom92]]></name></author>
<updated>2017-11-13T16:41:55+01:00</updated>
<published>2017-11-13T16:41:55+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=19592&amp;p=198870#p198870</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=19592&amp;p=198870#p198870"/>
<title type="html"><![CDATA[Re: Obsługa klawiszy]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=19592&amp;p=198870#p198870"><![CDATA[
Panowie znowu pojawił się problem przy zmianie mikrokontrolera na Attiny2313. Nie działa wyłączenie diod przy dłuższym przytrzymaniu przycisku. Myślę że dobrze ustawiłem Timer1:<br /><br />[syntax=c]#include &lt;avr/io.h&gt;<br />#include &lt;avr/interrupt.h&gt;<br />#include &lt;util/delay.h&gt;<br /><br /><br />//// *************   definicje dla preprocesora<br />// dioda LED RGB<br />#define LED1 (1&lt;&lt;PB0)// definicja pinu do którego podłączona jest dioda R<br />#define LED2 (1&lt;&lt;PB1)// definicja pinu do którego podłączona jest dioda G<br />#define LED3 (1&lt;&lt;PB2)// definicja pinu do którego podłączona jest dioda B<br />#define LED1_OFF PORTB |= LED1// makrodefinicja - wyłączenie diody<br />#define LED2_OFF PORTB |= LED2<br />#define LED3_OFF PORTB |= LED3<br />#define LED1_ON PORTB &amp;= ~LED1// makrodefinicja - załączenie diody<br />#define LED2_ON PORTB &amp;= ~LED2<br />#define LED3_ON PORTB &amp;= ~LED3<br />#define LEDS_OFF PORTB |= (LED1|LED2|LED3)// makrodefinicja - wyłączenie całej taśmy<br />#define LEDS_ON PORTB &amp;= ~(LED1|LED2|LED3)// makrodefinicja - załączenie całej taśmy<br /><br />// klawisz K1<br />#define KEY1 (1&lt;&lt;PD5)<br /><br />typedef struct {<br />volatile uint8_t *KPIN;<br />uint8_t key_mask;<br />uint8_t wait_time_s;<br />void (*kfun1)(void);<br />void (*kfun2)(void);<br />uint8_t klock;<br />uint8_t flag;<br />} TBUTTON;<br /><br />// timer programowy<br />volatile uint16_t Timer1;<br /><br />// własne funkcje użytkownika<br />void change_led1(void) {<br />// stan=0, zmienna statyczna czyli zachowuje się jak zmienna globalna, ale dostępna jest tylko w tej funkcji<br />static uint8_t stan;<br />stan++;<br />if (stan&gt;3) stan=0;<br />if (stan==0) {<br />LED1_ON;<br />LED2_OFF;<br />LED3_OFF;<br />}<br />else if (stan==1) {<br />LED1_OFF;<br />LED2_ON;<br />LED3_OFF;<br />}<br />else if (stan==2) {<br />LED1_OFF;<br />LED2_OFF;<br />LED3_ON;<br />}<br />else if (stan==3) {<br />LED1_ON;<br />LED2_ON;<br />LED3_ON;<br />}<br />}<br /><br />void change_led2(void) {<br />// flaga=0, zmienna statyczna czyli zachowuje się jak zmienna globalna, ale dostępna jest tylko w tej funkcji<br />static uint8_t flaga;<br /><br />if (flaga) {// jeżeli flaga jest równa 1 (lub różna od 0) to włącz diody i wyzeruj tą flagę (flaga=0)<br />LEDS_ON;<br />flaga=1;<br />}<br />else {// natomiast jeżeli jest równa 0 to wyłącz diody i ustaw flagę (flaga=1)<br />LEDS_OFF;<br />flaga=0;<br />}<br />}<br /><br />// funkcja obsługi pojedynczych klawiszy<br />void key_press( TBUTTON * btn );<br /><br /><br />TBUTTON button; // definicja KLAWISZA<br /><br />//------------------------------------------------------------------<br />int main(void) {<br /><br /> PORTD |= KEY1;  // podciągamy linie klawiszy do VCC<br /> DDRB |= LED1|LED2|LED3;   // piny LED jako WYjścia<br /><br /> /* Timer1 – konfigurcajca silnika timerów programowych */<br /> TCCR1A  |= (1&lt;&lt;WGM12);   // tryb pracy CTC<br /> TCCR1B  |= (1&lt;&lt;CS12)|(1&lt;&lt;CS10); // preskaler = 1024<br /> OCR0B  = 78;   // przerwanie porównania co ok. 10ms (100,16Hz)<br /> TIMSK  = (1&lt;&lt;OCIE1A); // Odblokowanie przerwania CompareMatch<br /><br /> button.KPIN = &amp;PIND;<br /> button.key_mask = KEY1;<br /> button.wait_time_s = 1;<br /> button.kfun1 = change_led1;<br /> button.kfun2 = change_led2;<br /><br /> sei();<br /><br /> while(1) {<br /><br />  key_press( &amp;button );<br /><br /><br /> }<br /><br />}<br />//------------------------------------------------------------------<br /><br />void key_press( TBUTTON * btn )<br />{<br />        register uint8_t key_press = (*btn-&gt;KPIN &amp; btn-&gt;key_mask);<br /><br />        if( !btn-&gt;klock &amp;&amp; !key_press )<br />        {<br />                btn-&gt;klock=500;<br />                btn-&gt;flag=1;<br />                Timer1 = (btn-&gt;wait_time_s*1000)/10;<br />        }<br />        else if( btn-&gt;klock &amp;&amp; key_press )<br />        {<br />                (btn-&gt;klock)++;<br />                if( !btn-&gt;klock &amp;&amp; btn-&gt;flag )<br />                {<br />                        // reakcja na krótkie wcinięcie klawisza - reakcja po zwolnieniu przycisku<br />                        if(btn-&gt;kfun1) btn-&gt;kfun1();<br />                        Timer1=0;<br />                        btn-&gt;flag=0;<br />                }<br />        } else if( btn-&gt;flag &amp;&amp; !Timer1 )<br />        {<br />          // reakcja na dłuższe wciniecie klawisza<br />          if(btn-&gt;kfun2) btn-&gt;kfun2();<br />          btn-&gt;flag=0;<br />        }<br />}<br /><br />//*** przerwanie Timer1 CompareM<br />ISR(TIMER1_COMPA_vect) {<br /><br /> uint16_t n;<br /><br /> n = Timer1;  /* 100,16Hz Timer1 */<br /> if (n) Timer1 = --n;<br /><br />}[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=11336">Tom92</a> — 13 lis 2017, o 16:41</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Tom92]]></name></author>
<updated>2017-11-13T14:22:38+01:00</updated>
<published>2017-11-13T14:22:38+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=19592&amp;p=198860#p198860</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=19592&amp;p=198860#p198860"/>
<title type="html"><![CDATA[Re: Obsługa klawiszy]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=19592&amp;p=198860#p198860"><![CDATA[
<div class="quotetitle">anshar napisał(a):</div><div class="quotecontent"><br />Można to rozwiązać inaczej, na przykład do tego celu powołac dodatkową zmienną i na niej operować.<br />Jeżeli flaga jest równa 1 (lub różna od 0) to włącz diody i wyzeruj tą flagę (flaga=0).<br />Natomiast jeżeli jest równa 0 to wyłącz diody i ustaw flagę (flaga=1).<br /></div><br /><br />Dzięki za dobre wytłumaczenie, zrobiłem tak i działa <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /> Dzięki temu podobnie zrobiłem w drugiej funkcji, powołałem sobie zmienną statyczną o nazwie &quot;stan&quot;, zwiększam go o jeden &quot;stan++&quot; i sprawdzam sobie jaki jest aktualnie stan i na tej podstawie zapalam sobie odpowiednie diody.<br /><br />Dzięki za podpowiedzi <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=11336">Tom92</a> — 13 lis 2017, o 14:22</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Marhef]]></name></author>
<updated>2017-11-13T12:35:44+01:00</updated>
<published>2017-11-13T12:35:44+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=19592&amp;p=198848#p198848</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=19592&amp;p=198848#p198848"/>
<title type="html"><![CDATA[Re: Obsługa klawiszy]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=19592&amp;p=198848#p198848"><![CDATA[
A może zamiast flagi sprawdzić stan portu. A konkretnie tych pinów, do których podłączone są LEDy<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=12752">Marhef</a> — 13 lis 2017, o 12:35</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[SylwekK]]></name></author>
<updated>2017-11-12T18:50:12+01:00</updated>
<published>2017-11-12T18:50:12+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=19592&amp;p=198804#p198804</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=19592&amp;p=198804#p198804"/>
<title type="html"><![CDATA[Re: Obsługa klawiszy]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=19592&amp;p=198804#p198804"><![CDATA[
Aaa, faktycznie... Umknęło mi, że WSZYSTKIE mają się zgasić albo zapalić <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1922">SylwekK</a> — 12 lis 2017, o 18:50</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[anshar]]></name></author>
<updated>2017-11-12T18:36:10+01:00</updated>
<published>2017-11-12T18:36:10+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=19592&amp;p=198799#p198799</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=19592&amp;p=198799#p198799"/>
<title type="html"><![CDATA[Re: Obsługa klawiszy]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=19592&amp;p=198799#p198799"><![CDATA[
<div class="quotetitle">SylwekK napisał(a):</div><div class="quotecontent"><br />Równie dobrze zamiast flagi (chociaż umiejętność ich stosowania jest jak najbardziej pożądana) wystarczy zrobić nowe makro, np. LEDS_TOGGLE <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><br /></div><br />No nie dokońca...<br />Powiedzmy, że zapaliliśmy sobie diodę LED1 i LED3 czyli LED2 będzie zgaszona.<br />Teraz chcemy zgasić wszystkie diody.<br />Proponujesz:<br />[syntax=c]#define LEDS_TOGLE PORTC ^= (LED1 | LED2 | LED3)[/syntax]<br /><br />Gdy teraz nasza funkcja będzie wyglądała tak:<br />[syntax=c]void change_led2(void) {<br />         LEDS_TOGLE;<br />    }[/syntax]<br />i zostanie wywołana, to jak myślisz czy wszystkie diody zostaną zgaszone? <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=7157">anshar</a> — 12 lis 2017, o 18:36</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[SylwekK]]></name></author>
<updated>2017-11-12T18:22:04+01:00</updated>
<published>2017-11-12T18:22:04+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=19592&amp;p=198797#p198797</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=19592&amp;p=198797#p198797"/>
<title type="html"><![CDATA[Re: Obsługa klawiszy]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=19592&amp;p=198797#p198797"><![CDATA[
Równie dobrze zamiast flagi (chociaż umiejętność ich stosowania jest jak najbardziej pożądana) wystarczy zrobić nowe makro, np. LEDS_TOGGLE <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1922">SylwekK</a> — 12 lis 2017, o 18:22</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[anshar]]></name></author>
<updated>2017-11-12T17:08:27+01:00</updated>
<published>2017-11-12T17:08:27+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=19592&amp;p=198793#p198793</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=19592&amp;p=198793#p198793"/>
<title type="html"><![CDATA[Re: Obsługa klawiszy]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=19592&amp;p=198793#p198793"><![CDATA[
<div class="quotetitle"><b>Quote:</b></div><div class="quotecontent"><br />Mam zagwozdkę jak je teraz zaświecić po ponownym długotrwałym wciśnięciu klawisza bo już kombinuje długo i narazie nie wychodzi mi to, nie rozumiem czemu nie działa mi taki zapis:<br /><br />[syntax=c]void change_led2(void) {<br />     if( LEDS_ON ) LEDS_OFF;<br />     else if( LEDS_OFF ) LEDS_ON;<br />    }[/syntax]<br /><br />Diody zgasną, ale już się nie zaświecą...<br /></div><br /><br />Dzieje się tak dla tego, że sprawdzasz czy LEDS_ON jest różne od zera, prawda?<br />Jest to makro, coś w tym stylu:<br />#define LEDS_ON PORTC |= LED1 | LED2 | LED3<br />lub<br />#define LEDS_ON PORTC &amp;= ~(LED1 | LED2 | LED3)<br />Czyli sprawdzasz czy PORTC |= LED | LED2 | LED3; jest różne od zera.<br />A kiedy będzie równe 0? Pomyśl nad tym.<br /><br />Można to rozwiązać inaczej, na przykład do tego celu powołac dodatkową zmienną i na niej operować.<br />Jeżeli flaga jest równa 1 (lub różna od 0) to włącz diody i wyzeruj tą flagę (flaga=0).<br />Natomiast jeżeli jest równa 0 to wyłącz diody i ustaw flagę (flaga=1).<br /><br /><br />[syntax=c]void change_led2(void) {<br />//flaga = 0, zmienna statyczna czyli zachowuje się jak zmienna globalna, ale dostępna jest tylko w tej funkcji<br />static uint8_t flaga; <br /><br />if(flaga)<br />{<br />LEDS_ON;<br />flaga=0;<br />}<br />else<br />{<br />LEDS_OFF;<br />flaga = 1;<br />}<br />}[/syntax]<br /><br />lub tak:<br />[syntax=c]void change_led2(void) {<br /><br />static uint8_t flaga;<br /><br />if(flaga) LEDS_ON;<br />else LEDS_OFF;<br /><br />flaga = !flaga;<br />}[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=7157">anshar</a> — 12 lis 2017, o 17:08</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Tom92]]></name></author>
<updated>2017-11-12T13:34:00+01:00</updated>
<published>2017-11-12T13:34:00+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=19592&amp;p=198776#p198776</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=19592&amp;p=198776#p198776"/>
<title type="html"><![CDATA[Obsługa klawiszy]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=19592&amp;p=198776#p198776"><![CDATA[
Witam!<br /><br />Mam problem z obsługą klawiszy z bloga Pana Mirka. Chodzi o to, że chciałbym sobie napisać własne funcje do obsługi jednego klawisza, ale gdy robię zmiany w funkcji:<br />[syntax=c]void change_led2(void) {<br /> PORTC ^= LED2;<br />}[/syntax]<br />to niestety nie działa tak jak bym chciał.<br /><br />Mam trzy diody i niezależnie jakie teraz świecą to chcę żeby po dłuższym przytrzymaniu klawisza wszystkie zgasły, a po ponownym przytrzymaniu klawisza wszystkie się zaświeciły. I krótkotrwałym wciskaniem zmieniać świecące diody (ale to już druga funkcja). Zrobiłem sobie tak:<br />[syntax=c]void change_led2(void) {<br /> LEDS_OFF;<br />}[/syntax]<br />Mam zagwozdkę jak je teraz zaświecić po ponownym długotrwałym wciśnięciu klawisza bo już kombinuje długo i narazie nie wychodzi mi to, nie rozumiem czemu nie działa mi taki zapis:<br />[syntax=c]void change_led2(void) {<br /> if( LEDS_ON ) LEDS_OFF;<br /> else if( LEDS_OFF ) LEDS_ON;<br />}[/syntax]<br />Diody zgasną, ale już się nie zaświecą...<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=11336">Tom92</a> — 12 lis 2017, o 13:34</p><hr />
]]></content>
</entry>
</feed>