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

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2012-07-11T22:38:25+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=4&amp;t=1257&amp;mode</id>
<entry>
<author><name><![CDATA[szopler]]></name></author>
<updated>2012-07-11T22:38:25+01:00</updated>
<published>2012-07-11T22:38:25+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=1257&amp;p=9598#p9598</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=1257&amp;p=9598#p9598"/>
<title type="html"><![CDATA[Re: Czy takie podejście jest poprawne? [TIMER2 + debounce +]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=1257&amp;p=9598#p9598"><![CDATA[
Heh... no tak ekhm... <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> nic na wyświetlaczu nie mam, jak po za warunkami dam lcd_hex(_FLAGA) to cały czas mam 0...<br /><br />Edit:<br />Powodem była źle postawiona klamerka na końcu pętli głównej - było tak:<br />[syntax=c]<br />int main(void)<br />{<br />for(;;)<br />{<br /><br />kod pętli...<br /><br />    return 0;<br />}<br />return powinien być tutaj!<br />}[/syntax]<br /><br /><img src="https://forum.atnel.pl/images/smilies/icon_rolleyes.gif" alt=":roll:" title="Udaje, że to nie on" /> <img src="https://forum.atnel.pl/images/smilies/icon_evil.gif" alt=":evil:" title="Zły" /> <img src="https://forum.atnel.pl/images/smilies/icon_neutral.gif" alt=":|" title="Średnio zadowolony" /><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=82">szopler</a> — 11 lip 2012, o 22:38</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2012-07-11T22:22:56+01:00</updated>
<published>2012-07-11T22:22:56+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=1257&amp;p=9597#p9597</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=1257&amp;p=9597#p9597"/>
<title type="html"><![CDATA[Re: Czy takie podejście jest poprawne? [TIMER2 + debounce + ]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=1257&amp;p=9597#p9597"><![CDATA[
No coraz ciekawiej i krócej piszesz - teraz to już mistrzostwo <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> czyli nic poza kodem. Teraz jest zerowanie flag. Ale jaki problem ??? to już tylko ty raczysz wiedzieć ja nie mam zielonego pojęcia <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> — 11 lip 2012, o 22:22</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[szopler]]></name></author>
<updated>2012-07-11T21:49:24+01:00</updated>
<published>2012-07-11T21:49:24+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=1257&amp;p=9596#p9596</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=1257&amp;p=9596#p9596"/>
<title type="html"><![CDATA[Re: Czy takie podejście jest poprawne? [TIMER2 + debounce + ]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=1257&amp;p=9596#p9596"><![CDATA[
<img src="https://forum.atnel.pl/images/smilies/icon_question.gif" alt=":?:" title="Znak zapytania" /><br />[syntax=c]for(;;) // Pętla główna<br />{<br /><br />    if ((_FLAGA &amp; 0b00000001) == 1)<br />{<br />    kluczyk = debounce();<br />    obsluga_klawiatury(kluczyk);<br />    _FLAGA &amp;= ~(1&lt;&lt;0);<br />}<br /><br />    if ((_FLAGA &amp; 0b00000010) == 2)<br />{<br />    ds1307_getTime(&amp;h,&amp;m,NULL);<br />    ds1307_getDate(&amp;d, &amp;mm, &amp;y, NULL);<br />    _FLAGA &amp;= ~(1&lt;&lt;1);<br />}<br /><br />    if ((_FLAGA &amp; 0b00000100) == 4)<br />    {<br />    lcd_locate(0,0);<br />sprintf(OLED_line, &quot;%02d/%02d/%02d %02d:%02d&quot;, d, mm, y, h, m);<br />lcd_str(OLED_line);<br /><br />lcd_locate(1,0);<br />    sprintf(OLED_line, &quot;%03d %03d %03d %03d&quot;, TCNT2, licznik_dziesiatych_sekundy, licznik_sekund, licznik_przycisku);<br />    lcd_str(OLED_line);<br /><br />    lcd_locate(1,15);<br />    lcd_char(OLED_0_15);<br />    _FLAGA &amp;= ~(1&lt;&lt;2);<br />    }<br />}[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=82">szopler</a> — 11 lip 2012, o 21:49</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2012-07-11T21:19:45+01:00</updated>
<published>2012-07-11T21:19:45+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=1257&amp;p=9591#p9591</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=1257&amp;p=9591#p9591"/>
<title type="html"><![CDATA[Re: Czy takie podejście jest poprawne? [TIMER2 + debounce + ]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=1257&amp;p=9591#p9591"><![CDATA[
A gdzie masz kasowanie tych swoich flag ?  w pętli głównej ?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=54">mirekk36</a> — 11 lip 2012, o 21:19</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[szopler]]></name></author>
<updated>2012-07-11T21:08:26+01:00</updated>
<published>2012-07-11T21:08:26+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=1257&amp;p=9589#p9589</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=1257&amp;p=9589#p9589"/>
<title type="html"><![CDATA[Re: Czy takie podejście jest poprawne? [TIMER2 + debounce + ]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=1257&amp;p=9589#p9589"><![CDATA[
Co robię nie tak?<br />[syntax=c]ISR(TIMER2_COMPA_vect) // Wywoływane co 0,005s przy OCR2A = 72<br />{<br />TCNT2 = 0;<br /><br />// Liczniki zwiększane co 0.005 sekundy<br /><br />licznik_dziesiatych_sekundy++;<br />licznik_polowek_sekundy++;<br /><br />if (licznik_dziesiatych_sekundy &gt;= 20) // 0.1sekundy na potrzeby debouncingu<br />{<br />licznik_dziesiatych_sekundy = 0;<br />_FLAGA |= 0b00000001;<br />}<br /><br />if (licznik_polowek_sekundy &gt;= 100) // 0.5 sekunda na potrzeby odwieżania RTC i OLED<br />{<br />licznik_polowek_sekundy = 0;<br />_FLAGA |= 0b00000110;<br />}<br />}[/syntax]<br />_FLAGA jest volatile uint_8t<br />Pętla główna wygląda tak:<br />[syntax=c]for(;;) // Pętla główna<br />{<br /><br />    if ((_FLAGA &amp; 0b00000001) == 1)<br />{<br />    kluczyk = debounce();<br />    obsluga_klawiatury(kluczyk);<br />}<br /><br />    if ((_FLAGA &amp; 0b00000010) == 2)<br />{<br />    ds1307_getTime(&amp;h,&amp;m,NULL);<br />    ds1307_getDate(&amp;d, &amp;mm, &amp;y, NULL);<br />}<br /><br />    if ((_FLAGA &amp; 0b00000100) == 4)<br />    {<br />    lcd_locate(0,0);<br />sprintf(OLED_line, &quot;%02d/%02d/%02d %02d:%02d&quot;, d, mm, y, h, m);<br />lcd_str(OLED_line);<br /><br />lcd_locate(1,0);<br />    sprintf(OLED_line, &quot;%03d %03d %03d %03d&quot;, TCNT2, licznik_dziesiatych_sekundy, licznik_sekund, licznik_przycisku);<br />    lcd_str(OLED_line);<br /><br />    lcd_locate(1,15);<br />    lcd_char(OLED_0_15);<br />    }<br />}[/syntax]<br /><br />Nie mogę wypatrzyć błędu... <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=82">szopler</a> — 11 lip 2012, o 21:08</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2012-07-09T08:32:56+01:00</updated>
<published>2012-07-09T08:32:56+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=1257&amp;p=9411#p9411</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=1257&amp;p=9411#p9411"/>
<title type="html"><![CDATA[Re: Czy takie podejście jest poprawne? [TIMER2 + debounce +]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=1257&amp;p=9411#p9411"><![CDATA[
<div class="quotetitle">szopler napisał(a):</div><div class="quotecontent"><br />Tylko zastanawiam się co będzie jak procesor będzie zajęty czymś dłużej np. zapisem na MMC a ja zechcę w tym samym czasie zmienić jakieś ustawienie (co będzie wymagało wciśnięcie całej sekwencji klawiszy)?<br /></div><br /><br />No widzisz - u mnie w 99% aplikacji do obsługi klawiszy wykorzystywane jest tylko skanowanie w pętlach programu bez udziału przerwań. I to co piszesz można z powodzeniem tak samo zrobić. Przecież co to oznacza że procesor będzie zajęty czymś dłużej np zapisem do MMC. A niech sobie zapisuje i odczytuje ile chce - musi to przecież robić tą operację w jakiejś pętli <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> ... co za problem dodać do nie zdarzenie: EVENT_KBD() ???<br /><br />ale w 1% aplikacji czasem to dodanie skanowania może przeszkadzać dlatego wtedy - skanowanie przenoszę do timera sprzętowego, który i tak pełni rolę podstawy czasu dla wszystkich timerów programowych w całej aplikacji. A skanowanie to ładnie już informuje inne zdarzenie EVENT które mogę spokojnie wstawić do pętli obsługującej zapis/odczyt do/z SD/MMC<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=54">mirekk36</a> — 9 lip 2012, o 08:32</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[szopler]]></name></author>
<updated>2012-07-09T02:15:28+01:00</updated>
<published>2012-07-09T02:15:28+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=1257&amp;p=9402#p9402</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=1257&amp;p=9402#p9402"/>
<title type="html"><![CDATA[Re: Czy takie podejście jest poprawne? [TIMER2 + debounce +]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=1257&amp;p=9402#p9402"><![CDATA[
Oto koncepcja:<br />Trzy przyciski na 2 liniach I/O ponieważ 2^2 = 4 możliwości czyli:<br />1 1 - nic nie wciśnięte,<br />1 0 - wciśnięty jeden,<br />0 1 - wciśnięty drugi,<br />0 0 - wciśnięte oba (tzn. wciśnięty trzeci podłączony do obu wejść I/O przez diody shottky)<br />W ten sposób oszczędzony jeden pin potrzebny do czegoś innego... i mamy 3 przyciskową klawiaturę na której już można zrobić całkiem sensowne menu <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" />.<br /><br />Teraz wciśnięcie któregokolwiek klawisza wywołuje przerwanie od portu - Pin Change Interrupt.<br />Ponieważ przerwanie typu PCI jest jedno dla grupy pinów (całego jednego portu) trzeba sprawdzić skąd przerwanie wyszło - w tym celu liczony jest klucz czyli złożenie dwóch najmniej znaczących bitów portu PB (przyciski są podłączone PB0 i PB1). Na podstawie wyniku z klucza osobna procedura ustala co program ma robić... Ponieważ to przyciski - potrzebny jest jakiś debouncing. Na nieszczęście w przerwaniu.<br /><br />Już wiem, że procedurę trzeba wywołać nie z przerwania a z programu głównego i tylko flagę sprawdzać... ale co zrobić z tym debouncingiem? Może zrezygnować z przerwania od przycisków i tylko sprawdzać co jakiś czas tak jak napisałem na początku tego tematu... tzn. też nie do końca bo w przerwaniu tylko ustawić flagę, a sprawdzanie stanu już w pętli głównej <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /> Tylko zastanawiam się co będzie jak procesor będzie zajęty czymś dłużej np. zapisem na MMC a ja zechcę w tym samym czasie zmienić jakieś ustawienie (co będzie wymagało wciśnięcie całej sekwencji klawiszy)?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=82">szopler</a> — 9 lip 2012, o 02:15</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2012-07-08T23:21:51+01:00</updated>
<published>2012-07-08T23:21:51+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=1257&amp;p=9394#p9394</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=1257&amp;p=9394#p9394"/>
<title type="html"><![CDATA[Re: Czy takie podejście jest poprawne? [TIMER2 + debounce + ]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=1257&amp;p=9394#p9394"><![CDATA[
O jej! aż 100ms w przerwaniu ? to baaaardzo niedobrze - delikatnie mówiąc.<br /><br />Jak zastąpić ? ... żeby na to odpowiedzieć to trzeba by znać jakąś całą konecpcję jaką przyjąłeś<br /><br />ale przede wszystkim tutaj czy przypadkiem nie kłania się (tak dopytam tylko) niezrozumienie do końca debouncingu. Pytam, bo jak widzę, że ktoś w programie dla obsługi drgań styków stosuje tak kosmicznie długie czasy i nie ważne czy w przerwaniu czy w pętli głównej - to często tak na prawdę potrzebne one są takiej osobie nie do eliminacji drgań styków tylko do hmmm opóźnień pomiędzy klikaniem klawisza .... <img src="https://forum.atnel.pl/images/smilies/icon_e_sad.gif" alt=":(" title="Smutny" /> <br /><br />Ja tutaj podpowiedziałbym ci dokładnie to samo .... bierzesz w rękę FLAGĘ <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> a w pętli głównej czy dowolnym zdarzeniu EVENT, wykorzystując najzwyklejszy i mało precyzyjny timer programowy - robisz z tym co ci się żywnie spodoba. Czyli w tej pętli głównej możesz uznać, że jeśli status wciśnięcia klawisza wystąpił np dwa razy w ciągu 20ms (drgania są i tak setki razy krótsze jeśli w ogóle są) .... to przekazujesz info dalej do pętli głównej albo kod wciśniętego klawisza do kolejki  itp itd.... Ale jeśli w ciągu 20ms nie wzrośnie licznik do 2, to status klawisza zostanie wyzerowany <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> ... i tak w kółko - no ale te operacje - w ogóle nie zasługujące na obecność w procedurach obsługi przerwań - mogą się byczyć w pętli głównej albo zdarzeniach EVENT, które z kolei mogą być powoływane do życia w DOWOLNEJ części programu<br /><br />a nawiasem mówiąc - jeśli nie trzeba to nie stosuj wywoływania innych funkcji z wewnątrz przerwania, obsluga_klawiatury(klucz);<br /><br />nie dość że zwiększasz niepotrzebnie stos to jeszcze dokładasz sobie narzut czasowy na skok i return. Więc jeśli tylko można to UNIKAJ tego.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=54">mirekk36</a> — 8 lip 2012, o 23:21</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[szopler]]></name></author>
<updated>2012-07-08T23:05:19+01:00</updated>
<published>2012-07-08T23:05:19+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=1257&amp;p=9392#p9392</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=1257&amp;p=9392#p9392"/>
<title type="html"><![CDATA[Re: Czy takie podejście jest poprawne? [TIMER2 + debounce + ]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=1257&amp;p=9392#p9392"><![CDATA[
No dobrze... a bardzo trudne będzie zrobienie aby tutaj wyrzucić stąd ten bezsensowny _delay ?<br />[syntax=c]Obsługa przerwań od klawiatury; Grupowa obsługa [PCIE0] - trzeba sprawdzać skąd przerwanie wyszło; Wymagany debouncing;<br />    ISR(PCINT0_vect)<br />    {<br />            uint8_t klucz = 0;<br />            klucz = ( (PINB &amp; (1&lt;&lt;PB0)) | (PINB &amp; (1&lt;&lt;PB1)) );<br />            _delay_ms(100);<br />     <br />            if (klucz == ( (PINB &amp; (1&lt;&lt;PB0)) | (PINB &amp; (1&lt;&lt;PB1)) ) )<br />            {<br />                    obsluga_klawiatury(klucz);<br />            }<br />    }<br />[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=82">szopler</a> — 8 lip 2012, o 23:05</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2012-07-08T22:58:12+01:00</updated>
<published>2012-07-08T22:58:12+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=1257&amp;p=9390#p9390</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=1257&amp;p=9390#p9390"/>
<title type="html"><![CDATA[Re: Czy takie podejście jest poprawne? [TIMER2 + debounce + ]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=1257&amp;p=9390#p9390"><![CDATA[
Tak jak najbardziej - sama idea jest ok - czyli wykorzystujemy timer sprzętowy do odmierzania odcinków czasu, które nas interesują, a to co z tym robimy w pętli głównej to właśnie namiastki timerów programowych <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> — 8 lip 2012, o 22:58</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[szopler]]></name></author>
<updated>2012-07-09T02:19:11+01:00</updated>
<published>2012-07-08T22:51:44+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=1257&amp;p=9388#p9388</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=1257&amp;p=9388#p9388"/>
<title type="html"><![CDATA[Re: Czy takie podejście jest poprawne? [TIMER2 + debounce +]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=1257&amp;p=9388#p9388"><![CDATA[
O widzisz... wpadłem na flagi (bo w innym przerwaniu ustalam co się ma wyświetlić, ale samego wyświetlania nie robiłem w przerwaniu).<br />Za to tutaj na szybkiego, żeby zapytać o sposób wykorzystania timera do odświeżania bezmyślnie wkleiłem kod z pętli głównej <img src="https://forum.atnel.pl/images/smilies/icon_rolleyes.gif" alt=":roll:" title="Udaje, że to nie on" /><br />Czyli idea jest dobra, wykonanie do poprawki... <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=82">szopler</a> — 8 lip 2012, o 22:51</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2012-07-08T21:33:41+01:00</updated>
<published>2012-07-08T21:33:41+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=1257&amp;p=9369#p9369</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=1257&amp;p=9369#p9369"/>
<title type="html"><![CDATA[Re: Czy takie podejście jest poprawne? [TIMER2 + debounce + ]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=1257&amp;p=9369#p9369"><![CDATA[
Wszystko byłoby dobrze gdyby nie to że zrobiłeś kilka poważnych hmm wręcz karygodnych błędów <img src="https://forum.atnel.pl/images/smilies/icon_e_sad.gif" alt=":(" title="Smutny" /> które w efekcie dyskfalisikują ten pomysł w całości<br /><br />Po prosu używasz wewnątrz procedury obsługi przerwania - wyświetlania na LCD, ale także odczytu i zapisu RTC chociaż to już mniejszy nieco problem <br /><br /><br />Tak się NIGDY nie robi, żadnych długotrwałych operacji w przerwaniach, to jeszcze gorsze od używania _delay'ów o których wspominasz. Jak sobie z tym poradzić ?<br /><br />Droga już niedaleka - teraz zastosuj flagi i te operacje krytyczne o których mówię wyżej przenieś z przerwania do pętli głównej programu..... Tak to się robi...<br /><br />Tak tylko zasugeruję delikatnie, że bardzo przydałaby ci się ta pierwsza <a href="http://www.sklep.atnel.pl/pl/p/KSIAZKA-I-DVD/1"  class="postlink">książka - LINK</a> Już nie tylko ze względu na te filmy n/t eclipse itp ... ale tam właśnie są podstawy i po kolei tłumaczone systemów czasu rzeczywistego - tyle że w taki przystępny sposób i jak działać w oparciu o timery programowe.<br /><br /><strong><span style="color: #808000">------------------------ [ Dodano po: kilkunastu sekundach ]</span></strong><br /><br />sprintf() to też długaśne operacje jak na przerwania do timeró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=54">mirekk36</a> — 8 lip 2012, o 21:33</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[szopler]]></name></author>
<updated>2012-07-08T21:21:24+01:00</updated>
<published>2012-07-08T21:21:24+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=1257&amp;p=9366#p9366</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=1257&amp;p=9366#p9366"/>
<title type="html"><![CDATA[Czy takie podejście jest poprawne? [TIMER2 + debounce + ...]]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=1257&amp;p=9366#p9366"><![CDATA[
Chciałbym wykorzystać TIMER do debouncingu i spowolnienia odświeżania wyświetlacza, żeby nie stosować tak lubianych przez początkujących programistów _delay'ów <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /><br />Wyklepałem coś takiego (bez ściągania od nikogo jedynie sugerując się opisami jak to należy zrobić) <img src="https://forum.atnel.pl/images/smilies/icon_cool.gif" alt="8-)" title="Cool" /> <br />Czy takie podejście jest poprawne i czy można coś jeszcze bardziej usprawnić <img src="https://forum.atnel.pl/images/smilies/icon_question.gif" alt=":?:" title="Znak zapytania" /><br /><br />[syntax=c]ISR(TIMER2_COMPA_vect) // Wywoływane co 0,005s przy OCR2A = 72 (fclk = 14.7456 MHz; fclk/1024 = 14400Hz; 14400/72 = 200Hz; 1/200 = 0.005s) &lt;-- żeby początkujący zrozumieli<br />{<br />uint8_t kluczyk;<br />TCNT2 = 0;<br /><br />// Liczniki zwiększane co 0.005 sekundy:<br />licznik_dziesiatych_sekundy++;<br />licznik_polowek_sekundy++;<br /><br />if (licznik_dziesiatych_sekundy &gt;= 20) // Co 0.1 sekundy sprawdzaj stan przycisków i odświeżaj wyświetlacz<br />{<br />licznik_dziesiatych_sekundy = 0;<br /><br />kluczyk = debounce();<br />obsluga_klawiatury(kluczyk);<br /><br />lcd_locate(0,0);<br />sprintf(OLED_line, &quot;%02d/%02d/%02d %02d:%02d&quot;, d, mm, y, h, m);<br />lcd_str(OLED_line);<br /><br />lcd_locate(1,0);<br />sprintf(OLED_line, &quot;%03d %03d %03d %03d&quot;, TCNT2, licznik_dziesiatych_sekundy, licznik_sekund, licznik_przycisku);<br />lcd_str(OLED_line);<br /><br />lcd_locate(0,15);<br />lcd_char(OLED_0_15);<br />}<br /><br />if (licznik_polowek_sekundy &gt;= 100) // Co 0.5 sekundy odczytuj czas z RTC<br />{<br />licznik_polowek_sekundy = 0;<br /><br />ds1307_getTime(&amp;h,&amp;m,NULL);<br />ds1307_getDate(&amp;d, &amp;mm, &amp;y, NULL);<br />}<br />}[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=82">szopler</a> — 8 lip 2012, o 21:21</p><hr />
]]></content>
</entry>
</feed>