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

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2012-12-20T22:50:15+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=19&amp;t=1648&amp;mode</id>
<entry>
<author><name><![CDATA[ellox]]></name></author>
<updated>2012-12-20T22:50:15+01:00</updated>
<published>2012-12-20T22:50:15+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=1648&amp;p=21745#p21745</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=1648&amp;p=21745#p21745"/>
<title type="html"><![CDATA[Re: Timery programowe]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=1648&amp;p=21745#p21745"><![CDATA[
Okey, już wiem gdzie występował błąd, a i gdzie ja nie mogłem znaleźć. Zapomniałem o objęciu w ATOMIC_BLOCK również i sprawdzenia warunku, czy timer jest równy zero. Wykorzystam to w ten sposób w programie, że za pomocą tej funkcji przypiszę wartość timera do zmiennej pomocniczej i na niej będę operować, a nie na zmiennej timera. Mimo, że opatrzona &quot;volatile&quot;, jest przecież 16 bitowa - 8 bitowy procesor nie może w takim razem dokonać operacji na takiej zmiennej &quot;za jednym razem&quot;.<br />Dobrze kombinuje z tą zmienną pomocniczą? Nie musiałbym wtedy dawać dużego kodu w blok ATOMIC.<br /><br />Co do extern i przykładu z nazwami zmiennych. Do zmiany nazwy użyłbym funkcji Refactor-&gt;Rename w Eclipse. No i kwestia powtarzania tej samej deklaracji w mnożących się plikach - już parę postów wyżej zgodziłem się z Panem, że użyłbym wtedy tej deklaracji w nagłówku, no sam to wyżej napisałem. Gdybym jednak używał tego tylko w jednym pliku i nie chciałbym, aby zmienne te były dostępne w caaałym projekcie, a właśnie tylko w pliku gdzie zostały zdefiniowane oraz w pliku gdzie zostały zdeklarowane (a plik nagłówkowy zawarty jest właśnie w całym projekcie). W tym momencie jest to w sposób świadomy ograniczenie widoczności zmiennych do wybranych plików. Jeżeli jest to sposób zły, to jak zrobić to inaczej? W każdym razie, jak faktycznie nie będę potrzebować takiego podejścia, to będę to deklarować w nagłówku - oszczędzi to problemów. No i w zasadzie po to ten plik jest, do deklaracji... czy to funkcji, czy zmiennych, tam ich miejsce!<br /><br />No i co do programu teraz. W tej chwili są pod rząd dwie nieskończone pętle while(1). Komunikat końcowy w ogóle nie pojawi się na terminalu. Jak się domyślam mojego błędu, to chodziło o to, że zostawiłem mikrokontroler w stanie niewiadomym - ani żadnej nieskończonej pętli, ani żadnego return 0. Zrozumiałem jednak o co chodzi z wykonywaniem kodu &quot;atomowo&quot;. <br /><br />No i właśnie - gdybym na początku przeczytał, że miejsce deklaracji zmiennej jest w pliku nagłówkowym (no bo to przecież deklaracja! - zapamiętam), albo że brakuje pętli głównej programu, czyli takiego zastosowania pętli lub instrukcji return, aby nie zostawiać mikrokontrolera stanie nieustalonym, co może powodować nieprzewidziane wyniki... Sam bym się wtedy nie denerwował i niepotrzebnych postów nie produkował.. Próbując się domyślić co jest źle, skoro działa?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=128">ellox</a> — 20 gru 2012, o 22:50</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2012-12-20T21:38:15+01:00</updated>
<published>2012-12-20T21:38:15+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=1648&amp;p=21740#p21740</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=1648&amp;p=21740#p21740"/>
<title type="html"><![CDATA[Re: Timery programowe]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=1648&amp;p=21740#p21740"><![CDATA[
<div class="quotetitle">ellox napisał(a):</div><div class="quotecontent"><br />Mógłbym prosić o jakieś źródła w których jest więcej napisane właśnie na temat używania extern? Chciałbym wiedzieć, dlaczego właśnie ten sposób jest poprawny. Jakieś uargumentowanie? Bo to że coś powinno być tak, a nie inaczej bo ktoś tak uważa do niczego nie prowadzi (bo chyba oboje w tym momencie używamy takiej postawy). Jeśli robię to źle, to proszę powiedzieć dlaczego. Ja błędów szukać nie będę - wiem dlaczego tego używam w ten sposób, a nie inny. Chciałbym po prostu zobaczyć źródło tych zasad, dlaczego tak nie wolno i utwierdzić się że jest to rozwiązanie błędne. Będzie to również wskazówka dla innych żeby nie powielali tego błędu - jeżeli jest to faktycznie błąd.<br /></div><br /><br />To jest tak jak niedawno na elektrodzie ktoś się ze mną kłócił - że #define F_CPU też czasem można robić w kodzie bo to jest OK .... i może być nawet pożądane w prostych projektach.<br /><br />Więc zarówno zasada związana z tym że #define F_CPU nie robi się w kodzie programu jest taka sama jak z tymi deklaracjami zmiennych extern....<br /><br />W ogóle - ale to w ogóle dla mnie żadnym wyjaśnieniem ani uzasadnieniem nie jest fakt - że jak mam np mały projekt, mało plików to można sobie dawać #define F_CPU albo extern dla zmiennych w plikach *.c<br /><br />dlaczego ???? to baaardzo proste<br /><br />otóż można się babrać i pisać projekt jedno- czy dwu- plikowy i wmawiać sobie, że to nic nie szkodzi że w pliku *.c dałem sobie extern<br /><br />kłopoty zaczynają się później. Czasem projekt się rozszerza - idąc tą drogą dajesz w kolejnych plikach projektu *.c te deklaracje extern ..... a czasem projekt się rozrasta jeszcze bardziej i gdzieś po drodze zmieniasz nazwę zmiennej (a przy okazji masz ich kilkadziesiąt a nie jedną) ..... i co ??? robi się MEGA KASZANA - i zaczynasz szukać po plikach co gdzie jest nie tak i tracić czas ...<br /><br />a wystarczy trzymać się PROSTEJ jak DRUT ZASADY o której piszę - czyli deklaracje zmiennych extern dawać w powiązanych plikach *.h i NIE WAŻNE czy mały projekt czy duży projekt ZAWSZE BĘDZIE DOBRZE<br /><br />więc masz tu ŹRÓDŁO - tu ci napisałem .... o co chodzi.<br /><br /><br /><br /><div class="quotetitle">ellox napisał(a):</div><div class="quotecontent"><br />To jak wg Pana powinna pętla główna wyglądać?<br />[syntax=c]        // PETLA GLOWNA PROGRAMU<br />        // Jezeli timer drugi &quot;cyka&quot; (jest rozny od zera) wykonuj petle glowna<br />        // programu.<br />        while(timer10ms_2!=0){[/syntax]<br />??<br />Czy chodzi o Panu o pętlę nieskończoną? Można zamienić to na while(1) i wewnątrz tej pętli dodać mój warunek, ale to jest już sztuka dla sztuki..<br /></div><br /><br />Kolega chyba sobie raczy żartować teraz - albo robić sobie ze mnie żarty. <br /><br /><div class="quotetitle">ellox napisał(a):</div><div class="quotecontent"><br />My tu się w jakąś ciuciubabkę bawimy lub inną zgaduj zgadule,<br /></div><br /><br />Oj tak widzę że bawimy się chyba i mnie to przestaje odpowiadać ... więc pewnie kolega będzie musiał poczekać aż ktoś inny pomoże. Tyle że dla mnie to kolega bawi się w ciuciubabkę - bo albo zadajemy pytania poprawnie, albo piszemy kod zgodnie ze sztuką zadając pytania - a jak się czegoś nie wie to dopytujemy się - a nie jak kolega - odpowiada mi - że nie mam racji - bo wg kolegi jest inaczej - to po jaką choinkę w ogóle kolega pyta ?<br /><br />Jak widzę kod z babolami to staram się naprowadzić na nie po kolei i wykorzenić od początku do końca .... <br /><br /><br /><br /><div class="quotetitle">ellox napisał(a):</div><div class="quotecontent"><br />Prosiłbym o konstruktywną krytykę, zamiast ogólnego narzekania, że to zakręcone, to nie tak. Tak to się nikt niczego nie nauczy, a pół strony zajmie dyskusja na nie wiadomo jaki temat (a takierzeczy to raczej na elektrodzie <img src="https://forum.atnel.pl/images/smilies/icon_e_biggrin.gif" alt=":D" title="Bardzo szczęśliwy" />).<br /></div><br />Ja nie narzekam - po prostu nie rozumiem kodu - tzn teraz po dodatkowych komentarzach coś mi świta co masz na myśli .... ale nie jest moim celem ośmieszanie czy ironizowanie. Za to sam wprowadzasz nerwową atmosferę - bo popełniasz błędy - ja ci zwracam uwagę a ty piszesz że wg ciebie tak może być i też bez wyjaśnienia - a ode mnie wtedy go oczekujesz ? ...<br /><br /><br /><div class="quotetitle">ellox napisał(a):</div><div class="quotecontent"><br />Ja rozumiem że dla mnie pewne oczywiste rzeczy nie są oczywiste dla innych, tylko proszę powiedzieć co dokładnie jest niejasne? Już dwa razy tłumaczyłem co ten przykład robi, dodałem odpowiednie komentarze. Mam wrażenie, jakby ten kod przeglądał Pan na szybcika bez jego analizy, vide - pierwszy post z extern.<br /></div><br /><br />Niestety tak jest - że na szybcika - bo ja nie mam za dużo czasu a staram się go dzielić na mnóstwo zadań w tym na pomoc na forum , maile itp ... więc już chociażby dlatego napisałem że jak dla mnie kod i pomysł jest zakręcony - co NIE OZNACZA że głupi! tylko że ja nie mogę go na szybko dobrze przeanalizować - a ty proszę dalej się czepiasz z tym że nie zauważyłem z tym extern na początku.<br /><br /><br />..... zaraz napiszę dalej - bo strasznie długi post napisałeś<br /><br /><strong><span style="color: #808000">------------------------ [ Dodano po: 38 minutach ]</span></strong><br /><br />o to ci chodziło ?<br /><br />[syntax=c]int main(void){<br />uint16_t stary=32767;<br /><br />sei();<br />system_timer_init();<br />usart_init();<br /><br />usart_str(&quot;\r\nPOCZATEK\n\r&quot;);<br />_delay_ms(1000);<br /><br />timer10ms_2=32767;<br /><br />// -------- to jest pętla główna<br />while(1){<br /><br /><br />ATOMIC_BLOCK( ATOMIC_RESTORESTATE ) {<br />if(!timer10ms_1) {<br /><br />timer10ms_1=256;<br /><br />usart_int(&quot;\r\n&quot;,(stary-timer10ms_2));<br />usart_int(&quot;\r\n&quot;,timer10ms_2);<br /><br />stary=timer10ms_2;<br />}<br />}<br /><br />}<br /><br /><br />}[/syntax]<br /><br /><img src="http://forum.atnel.pl/_obrazki/o/54_31a70e10ebe4e9e3d9df70b0dceda21d.jpg" alt="Obrazek" /><br /><br />dodałem jeszcze widok tego głównego licznika który się zmniejsza od 32767<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=54">mirekk36</a> — 20 gru 2012, o 21:38</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[ellox]]></name></author>
<updated>2012-12-20T20:37:36+01:00</updated>
<published>2012-12-20T20:37:36+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=1648&amp;p=21736#p21736</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=1648&amp;p=21736#p21736"/>
<title type="html"><![CDATA[Re: Timery programowe]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=1648&amp;p=21736#p21736"><![CDATA[
Mógłbym prosić o jakieś źródła w których jest więcej napisane właśnie na temat używania extern? Chciałbym wiedzieć, dlaczego właśnie ten sposób jest poprawny. Jakieś uargumentowanie? Bo to że coś powinno być tak, a nie inaczej bo ktoś tak uważa do niczego nie prowadzi (bo chyba oboje w tym momencie używamy takiej postawy). Jeśli robię to źle, to proszę powiedzieć dlaczego. Ja błędów szukać nie będę - wiem dlaczego tego używam w ten sposób, a nie inny. Chciałbym po prostu zobaczyć źródło tych zasad, dlaczego tak nie wolno i utwierdzić się że jest to rozwiązanie błędne. Będzie to również wskazówka dla innych żeby nie powielali tego błędu - jeżeli jest to faktycznie błąd.<br /><br />To jak wg Pana powinna pętla główna wyglądać?<br />[syntax=c]        // PETLA GLOWNA PROGRAMU<br />        // Jezeli timer drugi &quot;cyka&quot; (jest rozny od zera) wykonuj petle glowna<br />        // programu.<br />        while(timer10ms_2!=0){[/syntax]<br />??<br />Czy chodzi o Panu o pętlę nieskończoną? Można zamienić to na while(1) i wewnątrz tej pętli dodać mój warunek, ale to jest już sztuka dla sztuki.. My tu się w jakąś ciuciubabkę bawimy lub inną zgaduj zgadule, ja chętnie poprawię to co poprawić trzeba, ale to wystarczy powiedzieć co i dla czego, a przy takich odpowiedziach nie można dojść co jest nie tak. Mogę zgadywać, że chodzi Panu o to:<br />[syntax=c]while(1)<br />while(timer10ms_2){<br />// Jezeli timer pierwszy jest rowny 0, wtedy wykonaj kod.<br />if(!timer10ms_1) {<br />// Wpisz do timera pierwszego wartosc 256, co daje &quot;cykniecie&quot;<br />// rowne okolo 2560ms.<br />timer10ms_1=256;<br /><br />// Wypisz roznice wartosci timera drugiego w chwili obecnej<br />// i poprzedniej. Powinna zawsze wynosic 256.<br />usart_int(&quot;\r\n&quot;,(stary-timer10ms_2));<br /><br />// Przypisz wartosc w chwili obecnej do zmiennej pomocniczej.<br />stary=timer10ms_2;<br />}<br />}<br />}[/syntax]<br /><br />Prosiłbym o konstruktywną krytykę, zamiast ogólnego narzekania, że to zakręcone, to nie tak. Tak to się nikt niczego nie nauczy, a pół strony zajmie dyskusja na nie wiadomo jaki temat (a takierzeczy to raczej na elektrodzie <img src="https://forum.atnel.pl/images/smilies/icon_e_biggrin.gif" alt=":D" title="Bardzo szczęśliwy" />). Ja rozumiem że dla mnie pewne oczywiste rzeczy nie są oczywiste dla innych, tylko proszę powiedzieć co dokładnie jest niejasne? Już dwa razy tłumaczyłem co ten przykład robi, dodałem odpowiednie komentarze. Mam wrażenie, jakby ten kod przeglądał Pan na szybcika bez jego analizy, vide - pierwszy post z extern.<br /><br />ed:<br />Poczytam o użyciu sekcji krytycznych ATOMICBLOCK, bo nic nie wiem o tym na chwilę obecną. Dziękuję za wskazówkę.<br /><br /><strong><span style="color: #808000">------------------------ [ Dodano po: 27 minutach ]</span></strong><br /><br />No dobra, to może inaczej. Skoro ja nie umiem napisać poprawnie kodu tego prostego przykładu, to mam takie zadanie do rozwiązania:<br />1. Ustalamy rozdzielczość tykania dwóch timerów programowych, jak tak Pan Mirek polecił, nie za szybko, niech będzie te 10ms.<br />2. Jeden timer służy do wykonania, co 256 tyknięć, kodu: wysłania na terminal pewnej informacji.<br />3. Drugi timer służy do obliczania czasu pomiędzy kolejnymi wysłanymi informacjami na terminal - i to jest właśnie to co chcemy przekazywać po UARCIe. Sprawdzamy, czy faktycznie ten kod wykonywany jest co taki okres czasu, jaki powinien.<br /><br />Ktoś pomyśli - no ale po co takie coś sprawdzać, przecież to proste?? No właśnie - takie proste, że u mnie czasami gubi się te 255 tyknięć i informacja ta przekazana jest już po 1 tyknięciu. Tym samym, w terminalu wypisuje mi &quot;1&quot; zamiast &quot;256&quot;.<br />Howgh.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=128">ellox</a> — 20 gru 2012, o 20:37</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2012-12-20T20:04:56+01:00</updated>
<published>2012-12-20T20:04:56+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=1648&amp;p=21729#p21729</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=1648&amp;p=21729#p21729"/>
<title type="html"><![CDATA[Re: Timery programowe]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=1648&amp;p=21729#p21729"><![CDATA[
<div class="quotetitle">ellox napisał(a):</div><div class="quotecontent"><br />Jak dla mnie, to obie metody są poprawne.<br /></div><br /><br />Ja ci zwracam uwagę jak powinno być a to że wg ciebie jest ok to już inna kwestia ... nie chcesz nie stosuj się do zasad, ale później będziesz sam szukał błędów .... nic nie uzasadnia w takim przypadku stosowania deklaracji zmiennej w pliku *.c<br /><br /><br />Przy tak zakręconym kodzie .... ja i tak nadal go nie rozumiem a tym bardziej co nie działa .... ale to nieważne<br /><br />Zwróć uwagę jeszcze na użycie sekcji krytycznych ATOMICBLOCK podczas przeładowywania wartości tych 16-bitowych timerów programowy czyli:<br /><br />[syntax=c]ATOMIC_BLOCK( ATOMIC_RESTORESTATE ) {<br />    timer10ms_1=256;<br />}[/syntax]<br /><br />poza tym to:<br /><br />[syntax=c]// PETLA GLOWNA PROGRAMU<br />// Jezeli timer drugi &quot;cyka&quot; (jest rozny od zera) wykonuj petle glowna<br />// programu.<br />while(timer10ms_2){[/syntax]<br /><br />nie jest żadna pętla główna programu i znowu albo robisz jakieś swoje uproszczenie myślowe jak z tym extern albo nie wiesz o co chodzi z tą pętlą główną <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> — 20 gru 2012, o 20:04</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[ellox]]></name></author>
<updated>2012-12-20T19:46:25+01:00</updated>
<published>2012-12-20T19:46:25+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=1648&amp;p=21726#p21726</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=1648&amp;p=21726#p21726"/>
<title type="html"><![CDATA[Re: Timery programowe]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=1648&amp;p=21726#p21726"><![CDATA[
Jak dla mnie, to obie metody są poprawne. Zależy, jaki chcemy uzyskać zasięg tych zmiennych.. Zamiast kilkukrotnie w innych plikach wypisywać osobno &quot;extern zmienna1, zmienna2&quot; po kilka razy, faktycznie lepiej jest to zawrzeć w pliku nagłówkowym, zaliczyłbym to w tym momencie do tej dobrej praktyki programistycznej. Jednak jeżeli zmienne te są używane tylko w jednym z tych plików, lepszym rozwiązaniem może być użycie tego w ten mój sposób (rozwiązanie na podobę jak ze stosowaniem zmiennych z &quot;const&quot; - stosowane wtedy, kiedy innego użytkownika lub sami na przykład chcemy się ustrzec przed błędem i próbami zmiany jakiejś zmiennej, bo używamy jej jako stałej).<br /><br />No ale cały czas mijamy się z tematem, wyżej cały kod wisi, z tym że extern jest użyte jak jest, a na dropie jest aktualna wersja (z deklaracją zmiennej w pliku nagłówkowym) z całym projektem pod adresem: <!-- m --><a class="postlink" href="http://dl.getdropbox.com/u/19477765/test_timer.zip" >http://dl.getdropbox.com/u/19477765/test_timer.zip</a><!-- m --><br /><br />Opisywałem co ten program robi. W skrócie: wedle timera programowego 1, co 256 tyknięć co 10ms, czyli co ~2,5s wykonywany jest kod, który wypisuje w terminalu, ile minęło od jego ostatniego wywołania - do mierzenia tego służy timer programowy 2, który na początku życia programu jest wypełniony 32767 i potem dekrementowany tak samo jak timer 1.<br /><br />No i to właśnie nie działa poprawnie - w większości kod wykonywany jest co te 256 tyknięć, czasami jednak coś się dzieje niedobrego i wywołany jest po 1 tyknięciu. Gdzieś gubi się 255 tyknięć. Gdyby timer 1 wypełniać liczba 1000, to te błędne wywołanie (szybsze) nastąpi po 745 tyknięciach, sprawdzałem to.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=128">ellox</a> — 20 gru 2012, o 19:46</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2012-12-20T18:27:55+01:00</updated>
<published>2012-12-20T18:27:55+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=1648&amp;p=21723#p21723</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=1648&amp;p=21723#p21723"/>
<title type="html"><![CDATA[Re: Timery programowe]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=1648&amp;p=21723#p21723"><![CDATA[
z tym extern - to ja albo nie zauważyłem albo tam nie było innych plików ... <br /><br />Naturalnie masz rację że jeśli ta zmienna jest w innym pliku to dajemy extern ... tylko że nie w pliku *.c a w pliku *.h<br /><br /><strong><span style="color: #808000">------------------------ [ Dodano po: 1 minucie ]</span></strong><br /><br />jednym słowem mówiąc to:<br /><br />extern volatile uint16_t timer10ms_1, timer10ms_2;<br /><br />powinieneś dać w timer.h <br /><br />a że nie ma tak jak powinno być to czytanie tego projektu jest tak ciężkie - rozumiesz ?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=54">mirekk36</a> — 20 gru 2012, o 18:27</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[ellox]]></name></author>
<updated>2012-12-20T16:49:02+01:00</updated>
<published>2012-12-20T16:49:02+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=1648&amp;p=21715#p21715</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=1648&amp;p=21715#p21715"/>
<title type="html"><![CDATA[Re: Timery programowe]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=1648&amp;p=21715#p21715"><![CDATA[
Za statica w mainie przepraszam, usunąłem zaraz po wrzuceniu na forum - były to resztki moich prób łapania się za próby nawet bezsensowne.  <img src="https://forum.atnel.pl/images/smilies/icon_redface.gif" alt=":oops:" title="Zawstydzony" /> <br /><br />Druga sprawa. Skoro słówko &quot;extern&quot; jest tam niepoprawne? To w takim razie jak należy się odnosić do zmiennych zadeklarowanych w innym pliku źródłowym? Jak na mój poziom wiedzy, do tego właśnie to słówko służy... Sprawdziłem to co wrzuciłem na dropa - no przeca tam są dwa foldery w których znajdują się pliki źródłowe prócz samego main.c. Nie wrzucałem całego kodu, ponieważ mimo że przykład prosty, to chciałem pozostawić strukturę podfolderów w projekcie - tak samo poukładane mam to w programie, w którym ten błąd mój wykryłem. No nic, kody zamieszczam poniżej, po dodaniu komentarzy aby wszystko było już jasne. Zaczynam od części sprzętowej:<br /><br />folder: USART<br />usart.c:<br />[syntax=c]#include &lt;avr/io.h&gt;<br />#include &lt;stdlib.h&gt;<br />#include &quot;usart.h&quot;<br /><br /><br />void usart_init()<br />{<br />/* Set baud rate */<br />UBRRH = (unsigned char) ( (RS_UBRR) &gt;&gt;8);<br />UBRRL = (unsigned char) (RS_UBRR);<br />/* Enable receiver and transmitter */<br />UCSRB = (1&lt;&lt;RXEN)|(1&lt;&lt;TXEN)|(1&lt;&lt;RXCIE);<br />/* Set frame format: 8data, 2stop bit */<br />UCSRC = (1&lt;&lt;URSEL)|(1&lt;&lt;USBS)|(3&lt;&lt;UCSZ0);<br />}<br /><br />void usart_t( unsigned char data )<br />{<br />/* Wait for empty transmit buffer */<br />while ( !( UCSRA &amp; (1&lt;&lt;UDRE)) )<br />;<br />/* Put data into buffer, sends the data */<br />UDR = data;<br />}<br /><br /><br />void usart_str(const char *s )<br />{<br />while (*s)<br />usart_t(*s++);<br />}<br /><br />void usart_int(char *string, int liczba){<br />char tab[10];<br />itoa(liczba,tab,10);<br />usart_str(string);<br />usart_str(tab);<br />}<br />[/syntax]<br />usart.h:<br />[syntax=c]#ifndef USART_H_<br />#define USART_H_<br /><br />#define RS_BAUD 38400<br />#define RS_UBRR F_CPU / 16 / RS_BAUD - 1<br /><br />void usart_init();<br />void usart_t( unsigned char );<br />void usart_str(const char * );<br />void usart_int(char *, int );<br /><br />#endif /* USART_H_ */<br />[/syntax]<br /><br />folder: system_timer<br />system_timer.c:<br />[syntax=c]#include &lt;avr/io.h&gt;<br />#include &lt;avr/interrupt.h&gt;<br />#include &quot;system_timer.h&quot;<br />#include &quot;../USART/usart.h&quot;<br /><br />// Dwa timery programowe o podstawie 10ms<br />volatile uint16_t timer10ms_1, timer10ms_2;<br /><br />void system_timer_init(void){<br />// Timer2, tryb CTC<br />TCCR2 |= (1&lt;&lt;WGM21); // WGM21:0=10 -&gt; Tryb CTC<br />TCCR2 |= (1&lt;&lt;CS22)|(1&lt;&lt;CS21)|(1&lt;&lt;CS20); // prescaler = 1024<br />OCR2=78;<br />TIMSK |= (1&lt;&lt;OCIE2);<br />// COM21:0=00 -&gt; OC2 odlaczony, funkcjonuje jako zwykly port<br />// OCIE2=1 -&gt; zezwolenie na przerwanie od CTC<br />// F_CPU/prescaler/OCR2 = 100,1602564Hz, T=9,984ms<br />}<br /><br />ISR(TIMER2_COMP_vect){<br />uint16_t x;<br />x=timer10ms_1;<br />if (x) timer10ms_1=--x;<br />x=timer10ms_2;<br />if (x) timer10ms_2=--x;<br />}<br />[/syntax]<br />system_timer.h:<br />[syntax=c]#ifndef SYSTEM_TIMER_H_<br />#define SYSTEM_TIMER_H_<br /><br />void system_timer_init(void);<br /><br />#endif /* SYSTEM_TIMER_H_ */<br />[/syntax]<br /><br />No i main.c w ścieżce głównej:<br />[syntax=c]#include &lt;avr/io.h&gt;<br />#include &lt;avr/interrupt.h&gt;<br />#include &lt;util/delay.h&gt;<br />#include &quot;USART/usart.h&quot;<br />#include &quot;system_timer/system_timer.h&quot;<br /><br />// Puszczone dwa timery:<br />// 1 - w momencie osiagniecia 0 ladowany liczba 256<br />// 2 - przed petla glowna zaladowany wartoscia 32767<br />// Oba sa dekrementowane co 9,984ms.<br />// extern - zdefiniowane są w pliku system_timer/system_timer.c.<br />// Tutaj tylko deklaracja.<br />extern volatile uint16_t timer10ms_1, timer10ms_2;<br /><br />int main(void){<br />// Zmienna odpowiedzialna za zapisywanie wartosci timera drugiego<br />// w chwili poprzedniej.<br />uint16_t stary=32767;<br /><br />sei();<br />system_timer_init();<br />usart_init();<br /><br />// Komunikat poczatkowy.<br />usart_str(&quot;\r\nPOCZATEK\n\r&quot;);<br />_delay_ms(1000);<br /><br />// Wpisanie do timera drugiego wartosci, ktora bedzie malec az do<br />// osiagniecia zera.<br />timer10ms_2=32767;<br /><br />// PETLA GLOWNA PROGRAMU<br />// Jezeli timer drugi &quot;cyka&quot; (jest rozny od zera) wykonuj petle glowna<br />// programu.<br />while(timer10ms_2){<br />// Jezeli timer pierwszy jest rowny 0, wtedy wykonaj kod.<br />if(!timer10ms_1) {<br />// Wpisz do timera pierwszego wartosc 256, co daje &quot;cykniecie&quot;<br />// rowne okolo 2560ms.<br />timer10ms_1=256;<br /><br />// Wypisz roznice wartosci timera drugiego w chwili obecnej<br />// i poprzedniej. Powinna zawsze wynosic 256.<br />usart_int(&quot;\r\n&quot;,(stary-timer10ms_2));<br /><br />// Przypisz wartosc w chwili obecnej do zmiennej pomocniczej.<br />stary=timer10ms_2;<br />}<br />}<br /><br />// Komunikat koncowy.<br />usart_str(&quot;\r\nKONIEC&quot;);<br />}<br />[/syntax]<br /><br />Owszem, w moim programie pętla główna nie wykonuje się nieskończenie, jednak jest to efekt zamierzony. Mimo skończonej postaci tej pętli, chyba nadal można ją nazywać mianem &quot;pętli głównej&quot;?<br /><br />Mógłbym prosić o wskazanie tych wszystkich baboli i niejasności? Bo szczerze, za bardzo nie wiem co poprawiać w na tyle prostym przykładzie...<br /><br />ed: Przeniosłem deklarację zmiennej do pliku nagłówkowego (bo zapewne o to Panu chodziło). Jednak to, czy deklaracja znajduje się przed funkcją main w formie dosłownej, czy też zawarta jest w pliku nagłówkowym nie ma w tym wypadku żadnej różnicy w działaniu programu - zmienna ta używana jest tylko w mainie.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=128">ellox</a> — 20 gru 2012, o 16:49</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2012-12-20T16:19:16+01:00</updated>
<published>2012-12-20T16:19:16+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=1648&amp;p=21714#p21714</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=1648&amp;p=21714#p21714"/>
<title type="html"><![CDATA[Re: Timery programowe]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=1648&amp;p=21714#p21714"><![CDATA[
ellox --&gt; na drugi raz tak krótkie kody prezentuj tu na forum a nie w ZIP'ie bo wcześniej nawet nie zajrzałem ...<br /><br />a teraz widzę że masz tam babol na babolu <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> i tak patrząc na to to twój program działa zupełnie poprawnie ... zgodnie z babolami <img src="https://forum.atnel.pl/images/smilies/icon_e_sad.gif" alt=":(" title="Smutny" /><br /><br />po pierwsze co robi to słówko extern ???? może warto doczytać co to jest extern i do czego ? - w KSIĄŻCE na 100% jest<br /><br />po drugie  - panie kochany bój się ZEUSA <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> gdzie u ciebie jest pętla główna ??? ja wszystko rozumiem, że to tylko test - ale próba zrozumienia co ty chciałeś tu poczynić doprowadza do poważnego zapętlenia moich resztek wątłej kory mózgowej <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /><br /><br />Proszę cię - popraw to - ja na razie totalnie nie mogę zajarzyć co ty chciałeś zrobić w tym przykładzie <img src="https://forum.atnel.pl/images/smilies/icon_e_sad.gif" alt=":(" title="Smutny" /><br /><br />aha i jeszcze jedno - po co zmienna static w main() ??? zrób ją albo lokalną albo globalną - tutaj dawanie statica - mija się z celem totalnie<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=54">mirekk36</a> — 20 gru 2012, o 16:19</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[ellox]]></name></author>
<updated>2012-12-20T16:03:44+01:00</updated>
<published>2012-12-20T16:03:44+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=1648&amp;p=21713#p21713</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=1648&amp;p=21713#p21713"/>
<title type="html"><![CDATA[Re: Timery programowe]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=1648&amp;p=21713#p21713"><![CDATA[
Fakt, docelowo zastanowie się nad innym rozwiązaniem. Jednak próbowałem już zmniejszać rozdzielczość timerów.<br /><br />Po zmienieniu wartośći OCR2 (używam timer2) z wartości 8 na 78 (co daje tyknięcia co około 10ms) dzieje się to samo:<br />[syntax=c]256<br />256<br />256<br />256<br />256<br />256<br />256<br />256<br />256<br />256<br />1[/syntax]<br />Tak wygląda jeden cykl &quot;przebiegu&quot; który można obserwować na terminalu. W tym wypadku widać, że różnice pomiędzy kolejnymi wykonaniami kodu w warunku wykonują się co 256 kroków (*10ms=~2,5s), natomiast co 11 wejście w ten warunek dzieje się za szybko. Dodatkowo, na tyle na ile sprawdziłem, błędy te nie pojawiają się przy pracy na zmiennych dających się zapisać na 8 bitach.<br />Dziękuję za odpowiedź i mam nadzieję, że dojdziemy gdzie tu błąd leży.. Po prostu nie mogę dojść już co mi umyka  <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=128">ellox</a> — 20 gru 2012, o 16:03</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2012-12-20T14:54:45+01:00</updated>
<published>2012-12-20T14:54:45+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=1648&amp;p=21708#p21708</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=1648&amp;p=21708#p21708"/>
<title type="html"><![CDATA[Re: Timery programowe]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=1648&amp;p=21708#p21708"><![CDATA[
Przede wszystkim to BARDZO WYRAŹNIE pisałem o rozdzielczości hmmm ziarnistości czasowej - jej dobraniu ....<br /><br />A ty sobie z marszu dajesz rozdzielczość czasową na poziomie 1ms ..... Gdybyś programował w asemblerze to jeszcze mógłbyś sobie na to pozwolić - ale tu już może być ciężko<br /><br />zaczynaj bezpiecznie od 10ms .... Timery programowe nie są do odliczania aż tak szczegółowych zadań a już tym bardziej do super precyzyjnego odmierzania czasu.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=54">mirekk36</a> — 20 gru 2012, o 14:54</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[kris_gor]]></name></author>
<updated>2012-12-20T14:31:42+01:00</updated>
<published>2012-12-20T14:31:42+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=1648&amp;p=21704#p21704</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=1648&amp;p=21704#p21704"/>
<title type="html"><![CDATA[Re: Timery programowe]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=1648&amp;p=21704#p21704"><![CDATA[
Kiedyś coś takiego popełniłem. <br /><!-- m --><a class="postlink" href="http://sp9rqa.net/Elektronika/Timery_programowe.html" >http://sp9rqa.net/Elektronika/Timery_programowe.html</a><!-- m --><br /><br />Może się komuś przyda. Mam nadzieję, że nie ma błędów.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=366">kris_gor</a> — 20 gru 2012, o 14:31</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[ellox]]></name></author>
<updated>2012-12-20T14:17:19+01:00</updated>
<published>2012-12-20T14:17:19+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=1648&amp;p=21703#p21703</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=1648&amp;p=21703#p21703"/>
<title type="html"><![CDATA[Re: Timery programowe]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=1648&amp;p=21703#p21703"><![CDATA[
Mam również problem z tymi timerami. Z większego programu wyodrębniłem samą część z timerami i działanie tego przykładu wygląda tak:<br /><br />W przerwaniu co ~1ms dekrementowane są dwa timery, timer1ms_1 oraz timer1ms_2. Obie te zmiennie to 16 bitowe integery bez znaku.<br /><br />[syntax=c]ISR(TIMER2_COMP_vect){<br />uint16_t x;<br />x=timer1ms_1;<br />if (x) timer1ms_1=--x;<br />x=timer1ms_2;<br />if (x) timer1ms_2=--x;<br />}[/syntax]<br /><br />W mainie natomiast timer1ms_2 ustawiany na 32767, więc w troszkę ponad pół minuty zmienna ta osiąga 0. Pętla główna wykonuje się, dopóki timer ten jest różny od zera. W pętli tej sprawdzany jest warunek, czy timer1ms_1 jest równy 0. Jeżeli tak, do zmiennej tej wpisywana jest wartość 256 i po uarcie idzie informacja o różnicy wartości timera drugiego z chwilą poprzednią.<br />[syntax=c]timer1ms_2=32767;<br /><br />while(timer1ms_2){<br />if(!timer1ms_1) {<br />timer1ms_1=256;<br /><br />// Ta roznica powinna wynosic caly czas 256<br />usart_int(&quot;\r\n&quot;,(stary-timer1ms_2)); <br />stary=timer1ms_2;<br />}<br />}[/syntax]<br />Sprowadza się do tego, że sprawdzamy czy warunek ten faktycznie wykonuje się co te ~256ms. W terminalu powinno nam się pokazać:<br /><div class="codetitle"><b>Code:</b></div><div class="codecontent">(...)<br />256<br />256<br />256<br />(...)</div><br />itd.<br />Jednak u mnie to ma postać np.:<br /><div class="codetitle"><b>Code:</b></div><div class="codecontent">(...)<br />256<br />256<br />256<br />1<br />256<br />1</div><br />Ktoś kradnie mi 255 milisekund! Naprawdę nie mam pojęcia co jest tego przyczyną. W zależności od kodu, te zubożone cykle pojawiają się w sposób okresowy, czyli przebieg pokazany powyżej powtarzany jest w tej samej sekwencji. Gdyby trochę kod zmienić, błędy te pojawiają się w innej kolejności, jednak potem znów dochodzi do cyklicznego ich występowania. Wniosek mój z tego taki, że nie jest to wina zakłóceń, ponieważ brak tu elementu losowego.<br />Jak wypełnimy timer pierwszy np. 1000 (aby warunek wykonywał się co sekundę), to błędny, szybszy cykl wykona się po 745ms - znowu różnica 255. Coś jakby było nie tak z arytmetyką 16bitową w przerwaniach... Coś złego jakby z pierwszym bajtem się dzieje.. Próbowałem już wyłączać przerwania przy wpisywaniu do zmiennej timera i załączać zaraz potem, nic to nie pomogło niestety.<br />Tu cały projekt z Eclipse Juno:<br /><!-- m --><a class="postlink" href="http://dl.getdropbox.com/u/19477765/test_timer.zip" >http://dl.getdropbox.com/u/19477765/test_timer.zip</a><!-- m --><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=128">ellox</a> — 20 gru 2012, o 14:17</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[1bobik1]]></name></author>
<updated>2012-10-12T14:15:17+01:00</updated>
<published>2012-10-12T14:15:17+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=1648&amp;p=16736#p16736</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=1648&amp;p=16736#p16736"/>
<title type="html"><![CDATA[Re: Timery programowe]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=1648&amp;p=16736#p16736"><![CDATA[
Przeczytałem<br /><br />Dziwne to dla mnie, ale na razie nie będę wnikał w asemblera by to zrozumieć.<br /><br />Natomiast mam pytanie odnośnie kodu tam przedstawionego.<br />Analizuję go powoli i jednego słowa nie znam (wydaje mi się że w książce się z nim nie spotkałem)<br /><br />chodzi o linijkę na ostatnim zrzucie oznaczoną jako A<br />a dokładnie o słowo <span style="text-decoration: underline">register</span><br /><br />Co ono oznacza ?<br /><br /><br />Ps. Całe to wyjaśnienie pojawiło się dla mnie jak to ze strony 118, nagle i w odpowiednim momencie <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /><br />Chwała Autorowi   <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=464">1bobik1</a> — 12 paź 2012, o 14:15</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[1bobik1]]></name></author>
<updated>2012-10-11T21:40:48+01:00</updated>
<published>2012-10-11T21:40:48+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=1648&amp;p=16725#p16725</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=1648&amp;p=16725#p16725"/>
<title type="html"><![CDATA[Re: Timery programowe]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=1648&amp;p=16725#p16725"><![CDATA[
Dziękuję za odpowiedź, jutro poczytam <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=464">1bobik1</a> — 11 paź 2012, o 21:40</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2012-10-11T19:20:14+01:00</updated>
<published>2012-10-11T19:20:14+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=1648&amp;p=16713#p16713</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=1648&amp;p=16713#p16713"/>
<title type="html"><![CDATA[Re: Timery programowe]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=1648&amp;p=16713#p16713"><![CDATA[
Bardzo dobra podpowiedź ze strony kolegi Piotrek_P <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 paź 2012, o 19:20</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Piotrek_P]]></name></author>
<updated>2012-10-11T19:18:18+01:00</updated>
<published>2012-10-11T19:18:18+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=1648&amp;p=16712#p16712</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=1648&amp;p=16712#p16712"/>
<title type="html"><![CDATA[Re: Timery programowe]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=1648&amp;p=16712#p16712"><![CDATA[
Odpowiedź na twoje wątpliwości jest pod koniec tego artykułu:<br /><a href="http://mirekk36.blogspot.com/2012/10/obsuga-klawiszy-zwoka-czasowa-cd3.html"  class="postlink">http://mirekk36.blogspot.com/2012/10/obsuga-klawiszy-zwoka-czasowa-cd3.html</a><br /><br />Zachęcam jednak do przeczytania od początku  <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /> <br /><br />Pozdrawiam<br />PP<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=290">Piotrek_P</a> — 11 paź 2012, o 19:18</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[1bobik1]]></name></author>
<updated>2012-10-11T19:02:43+01:00</updated>
<published>2012-10-11T19:02:43+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=1648&amp;p=16710#p16710</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=1648&amp;p=16710#p16710"/>
<title type="html"><![CDATA[Timery programowe]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=1648&amp;p=16710#p16710"><![CDATA[
Witam<br /><br />Dzisiaj przeczytałem w &quot;Podstawach programowania&quot; o timerach programowych.<br /><br />Autor pisze że takie przerwanie musi wykonywać się jak najszybciej<br /><br />Kod z książki:<br /><br />[syntax=c]ISR(TIMER2_COMP_vect) {<br />     uint16_t x;<br /><br />     x = Timer1;<br />     if (x) Timer1 = --x;<br /><br />     x = Timer2;<br />     if (x) Timer2 = --x;<br /><br />      x = Timer3;<br />     if (x) Timer3 = --x;<br /><br />      x = Timer4;<br />     if (x) Timer4 = --x;<br />}[/syntax]<br /><br />Czy ten kod nie mógłby wyglądać tak:<br /><br /><br />[syntax=c]ISR(TIMER2_COMP_vect) {<br />  <br /><br />     if (Timer1)  Timer1-- ;<br /><br />     if (Timer2) Timer2-- ;<br /><br />     if (Timer3) Timer3-- ;<br /><br />     if (Timer4) Timer4-- ;<br /><br />}[/syntax]<br /><br /><br />Czy to nadal będzie poprawnie działać ?<br /><br />Mi wydaje się że tak i przy okazji deko szybciej.<br /><br />Proszę o potwierdzenie / wyprowadzenie mnie z błędu <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=464">1bobik1</a> — 11 paź 2012, o 19:02</p><hr />
]]></content>
</entry>
</feed>