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

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2022-05-06T08:57:05+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=4&amp;t=24214&amp;mode</id>
<entry>
<author><name><![CDATA[Zealota]]></name></author>
<updated>2022-05-06T08:57:05+01:00</updated>
<published>2022-05-06T08:57:05+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=24214&amp;p=235477#p235477</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=24214&amp;p=235477#p235477"/>
<title type="html"><![CDATA[Re: Timery programowe, nierówna praca]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=24214&amp;p=235477#p235477"><![CDATA[
<div class="quotetitle">SylwekK napisał(a):</div><div class="quotecontent"><br />nie większą niż 1ms - dość często 100us, a bywało, że i 50us<br /></div><br />Tak też podejrzewałem, ze w tym wątku piszemy głównie o CZYM INNYM.<br />Ja o softTimerach w rozumieniu bluebook, a Autor o czym innym <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><br />Jakiś kod ma u siebie, do wątku wrzuca jakieś tylko swoje zmiany wyrwane z kontekstu, opisuje to kodem przepisanym &quot;żywcem&quot; z książki, a tak na prawdę to działa chaotycznie, nieprecyzyjnie przedstawia problem. To najgorszy ze sposobów szukania pomocy<br />Jakie to charakterystyczne dla programistów, którzy już mają sporą wiedzę, ale brakuje pokory <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><br /><br />SylwekK to już w ogóle o czym innym. soft timer 100us - w ogóle bym tego nie nazwał soft timerem jak uczono nas w Bluebooku.<br /><br />Dziwię się tylko, że jeszcze takie coś &quot;wchodzi&quot; na forum Atnel, kiedy Mirek od chyba już 10 lat mówi jak działać.<br /><br />To takie ogólne obserwacje i one tyczą się wszelkim gremiów technicznych.<br />Musiałem to wyrzuć z siebie, bo od połowy wątku już mnie to gryzło <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><br />Nie miałem na myśli oczywiście nic złego tak pisząc, jedynie komentuję &quot;rzeczywistość&quot;<br /><br />Jeszcze apropos roboty Andrews, to faktycznie &quot;wyprostował&quot; mnie w tym sensie, że zupełnie pominąłem fakt możliwości &quot;rozdarcia&quot; warunku IF.<br />Cały czas byłem skupiony na modyfikacji softTimer1 = 1000, która była zabezpieczona poprzez długi okres między przerwaniami.<br />Natomiast zarzut o patrzeniu z perspektywy C nie był zasadny, bo pierwsze co zrobiłem przy analizie to spojrzenie do asemblera <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><br /><br />Tyle wyjaśnień.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=16487">Zealota</a> — 6 maja 2022, o 08:57</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2022-05-06T08:08:59+01:00</updated>
<published>2022-05-06T08:08:59+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=24214&amp;p=235476#p235476</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=24214&amp;p=235476#p235476"/>
<title type="html"><![CDATA[Re: Timery programowe, nierówna praca]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=24214&amp;p=235476#p235476"><![CDATA[
<div class="quotetitle">SylwekK napisał(a):</div><div class="quotecontent"><br />bo stosuję zazwyczaj podstawę nie większą niż 1ms<br /></div><br />Ja to doskonale wiem, bo kiedyś pisaliśmy nawet o tym na tym forum i wcale nikt nie jest szalony skoro takich technik używa, po to jest procek, żeby go cisnąć na maxa gdy trzeba. Powiem tak mnóstwo ludzi tak korzysta z procka - tylko, że tego już się nie da nazwać typowymi prostymi timerkami programowymi. W takich wypadkach gdy już schodzisz nawet do 100us czy 50us to jest już odmierzanie czasu dla konkretnych i sam przyznasz b.krótkich zdarzeń bo przecież przy 50us nie powiesz, że pakujesz tam jakiś kod który potrzebuje na wykonanie więcej niż 50us - pewnie zajmuje on nawet mniej niż połowę tego czasu. I to jest normalne jak jedzenie bułek z masłem i serem w programowaniu ... tylko właśnie trzeba mieć już na prawdę dobre doświadczenie w pisaniu programów w sposób nieblokujący ... a wiem, że ty masz i to duże bo już Bascoma wyciskałeś na MAXA kiedyś (ja też zresztą zanim przesiadłem się na C). Dlatego też na końcu mówiłem, że każdy ma rację - tylko w nieco innych aspektach i nie dotyczących koniecznie akurat tego konkretnego przypadku u autora tego wątku.<br /><br /><strong><span style="color: #808000">------------------------ [ Dodano po: kilkunastu sekundach ]</span></strong><br /><br /><div class="quotetitle">Rnext napisał(a):</div><div class="quotecontent"><br />Przerwanie miałem ustawione co 1ms. Po zmianie na 10ms efekt &quot;cudów&quot; zniknął.<br />Dziękuję wszystkim za pomoc i przede wszystkim ciekawą dyskusję.<br /></div><br /><br />No i bardzo fajnie - cieszę się, że ruszyło - teraz na pewno w przyszłości łatwiej będzie ci korzystać z tych mechanizmów<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=54">mirekk36</a> — 6 maja 2022, o 08:08</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[SylwekK]]></name></author>
<updated>2022-05-06T07:19:36+01:00</updated>
<published>2022-05-06T07:19:36+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=24214&amp;p=235475#p235475</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=24214&amp;p=235475#p235475"/>
<title type="html"><![CDATA[Re: Timery programowe, nierówna praca]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=24214&amp;p=235475#p235475"><![CDATA[
No piękny felieton Mirek <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /> Teraz to i mnie się rozjaśniło. Wg powyższego moje problemy z nierównym odliczaniem, są tak widoczne, bo stosuję zazwyczaj podstawę nie większą niż 1ms - dość często 100us, a bywało, że i 50us i mniej. Może to dziwić, ale bardzo mi pomaga takie poganianie przerwań. Często umieszczam tam algorytmy, które wymagają szybkiego odświeżania, a o pętlę główną się nie martwię, bo ZAWSZE jest w pełni przelotowa nawet z wyświetlaczem LCD, który jest buforowany i jego obsługa zajmuje jednorazowo kilka/naście us. Może jestem szalony, ale ja na tych prostych timerach zegary dokładnie odliczające czas zawsze robię <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><br />Jak w takim razie sobie radzę z dłuższym odcinkami? Na dwa sposoby - dokładny i mniej dokładny (teoretycznie, bo w praktyce nie widzę różnicy). Dokładny to użycie dodatkowej zmiennej w przerwaniach jako dzielnik dziełu czemu z pętli głównej wysyłam do timera zmienną jednobajtową, a mniej dokładny - w przerwaniach jest jeden timer sterujący, a w pętli głównej pod tym timerem kolejne timery już z wykorzystaniem dowolnej zmiennej (nawet 32bitowej). Jak wspominałem pętla główna u mnie jest nieblokująca i zabieg ten w moich programach sprawdza się praktycznie zawsze. Polecam <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> — 6 maja 2022, o 07:19</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Rnext]]></name></author>
<updated>2022-05-06T06:14:30+01:00</updated>
<published>2022-05-06T06:14:30+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=24214&amp;p=235474#p235474</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=24214&amp;p=235474#p235474"/>
<title type="html"><![CDATA[Re: Timery programowe, nierówna praca]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=24214&amp;p=235474#p235474"><![CDATA[
Przerwanie miałem ustawione co 1ms. Po zmianie na 10ms efekt &quot;cudów&quot; zniknął.<br />Dziękuję wszystkim za pomoc i przede wszystkim ciekawą dyskusję.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=21807">Rnext</a> — 6 maja 2022, o 06:14</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2022-05-05T22:43:21+01:00</updated>
<published>2022-05-05T22:43:21+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=24214&amp;p=235473#p235473</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=24214&amp;p=235473#p235473"/>
<title type="html"><![CDATA[Re: Timery programowe, nierówna praca]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=24214&amp;p=235473#p235473"><![CDATA[
<div class="quotetitle">mtbchn napisał(a):</div><div class="quotecontent"><br />A w międzyczasie, może Mirosław zabierze głos i wyjaśni powyższe wątpliwości.<br /></div><br />Ja tak obserwuję sobie z doskoku tę dyskusję i po prostu oczom własnym nie wierzę <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> ... bo tu w zasadzie jest spór ideologiczny i na dodatek (ku mojemu zdumieniu) kompletnie oderwany od pytania i problemów autora - co zaciemnia w ogóle obraz i wyłania się tylko jedno:<br /><br />Stosować Atomowe podejście przy timerach programowych czy nie ? <br /><br />No i są dwie grupy (o ile tak można powiedzieć) bo jedna grupa to zaledwie pojedynczy użytkownik forum - kolega <strong><span style="color: #0080FF"><span style="font-size: 150%; line-height: normal">ZELAOTA </span></span></strong>a druga grupa to<strong><span style="color: #0080FF"> kilku użytkowników</span></strong>, którzy przekonują że nie da się inaczej jak bez ATOMIC BLOCK .... i to pomimo to, że ZELAOTA wyraźnie też po drodze pisał, że jak chodzi o problem autora to nie może mieć żadnego wpływu czy mamy podejście atomowe czy nie.<br /><br />Oczywiście kolega Andrews jak zawsze (spec w asemblerze) ładnie wyłożył i pokazał przykłady (fajna nazwa) ROZRYWANIA zmiennej 16-bitowej podczas gdy wystąpi przerwanie i w ogóle ciężko z tym dyskutować bo taka jest prawda i nie ma co się z tym nawet sprzeczać, że TEORETYCZNIE - może do tego dojść a wtedy w JEDNYM z najgorszych przypadków (którego prawdopodobieństwo wystąpienia jest chyba porównywalne do wygranej w toto lotka) - czyli gdy softimer = 256 i akurat przy sprawdzaniu if() nastąpi przerwanie i to pomiędzy pobieraniem młodszego i starszego bajtu - no to co tu dużo mówić - to jest OCZYWISTE JAK SŁOŃCE że tak będzie - że ten IF się źle wykona i biedny softTimer1 źle zadziała tym razem ....<br /><br />Krótko mówiąc nawet nie ma co kruszyć kopii że w większości wypadków gdy szczególnie nam zależy na wyśrubowanych warunkach działania programu i korzystamy ze zmiennych więcej niż 8-bitowe w przerwaniu i w programie głównym - to ATOMIC BLOCK musi nam przyrosnąć do ręki ....<br /><br />ALE ........ no właśnie jest moim zdaniem jedno małe ALE i nie musicie się z tym zgadzać oczywiście<br /><br />PO PIERWSZE - proste timerki programowe absolutnie nie służą do super precyzyjnego odmierzania czasu - a jeśli ktoś się z tym spiera to jest w błędzie. Bo nawet przy nie wiem jakich ATOMIC BLOKACH - gdy inna część większego programu zużyje dużo więcej czasu niż czas najszybciej ustawionego timera programowego przy podstawie czasu 10ms czyli przy wartości 1, to na kiszkę zdadzą się wszystkie Atomic Bloki<br /><br />PO DRUGIE - jest dokładnie tak jak pisze ZELAOTA - że skoro podstawa czasu to 10ms to jest to KOSMICZNY odstęp od przerwania do przerwania więc prawdopodobieństwo tego, że kolejne przerwania timera sprzętowego utrafią akurat w obsłudze tych timerków programowych w IF()'a albo w ładowanie nowej wartości do softTimer - moim zdaniem jest właśnie jak w totolotku albo i jeszcze mniejsze<br /><br /><br /><div class="quotetitle">Zealota napisał(a):</div><div class="quotecontent"><br />Od momentu uruchomienia globalnego przerwań sei() do pierwszego wejścia w warunek if (softTimer1 == 0) {} przerwanie może zaburzyć ten warunek wpisując &quot;randomowe&quot; wartości do zmiennej, poprzez rozerwanie dwubajtowej wartości softTimer1.<br /></div><br />Wcale nie - będzie dużo lepsza sytuacja i nie będzie ŻADNYCH randomowych wartości które mogą zaburzyć przy starcie bo przecież jeśli zmienne globalne softTimers nie są zainicjowane to mają wartość = 0, więc przerwanie przy starcie ich nie będzie ruszać. Przerwanie wystartuje od razu po SEI() i nie zmieni wartości żadnego softTimera i UWAGA! bo tu ZELAOTA ma rację, następne przerwanie odbędzie się aż za 10 ms, zatem rozpocznie się pętla główna która odpali każdy softTimer i ustawi im wartości na nowe, czyli ich zmniejszanie w przerwaniu rozpocznie się za jakiś czas ...<br /><br />... i OK nie jesteśmy w stanie przewidzieć kiedy nadejdzie to kolejne przerwanie za 10ms to czy akurat nie trafi w któregoś IF()'a albo w któreś napełnianie nową wartością jednego z softTimerów. Ale zakładając - że NAWET TRAFI w któregoś IF()'a to teraz czy akurat trafi nie dość że dokładnie w momencie ładowania dwóch bajtów do porównania ... .i ..... dodatkowo gdy akurat w softTimer jest wartość 256 ?????  (oczywiście ja rozumiem Andrews - że to nie chodzi o tylko ten przypadek ale o każdy inny bo można twój przykład w ASM rozpisać sobie dla wartości nie 256 ale np 512 albo i dla byle jakiej np 613 ... i bez ATOMIC BLOCK gdyby te przerwanie trafiało akurat zawsze na IF()'y i rwało nawet te porównania to będą one zakłócone - ale o ile ? wziąwszy pod uwagę podstawę czasu 10ms ? ... o tyle co było utracone w młodszym bajcie - czyli softTimer zadziała załóżmy nieco albo i sporo szybciej niż trzeba - a nie że program się (potocznie mówiąc) WYSYPIE.<br /><br />Mi nawet przez myśl nie przechodzi żeby się zastanawiać i dbać o to czy przy zastosowaniu prostych timerków programowych brać pod uwagę takie różnice czasu. To jest kompletnie nieistotne <br /><br />a teraz NAJWAŻNIEJSZE - spróbujcie się Panowie - którzy tak naciskacie na atomowe podejście przy tych timerkach ... więc spróbujcie powiedzieć - przypatrzyć się, przeanalizować kod autora !!!! Pomijam że autor gra w mega kalambury i przez cały wątek ktoś go wciąż prosi żeby udostępnił kolejny puzzel kodu bo nie wiadomo co może mu źle działać ... że jaki TAKT jest zakłócony jeśli chodzi o BUZZER .... więc proszę - powiedzcie mi czy analizowaliście ten kod - zbierając puzzle z kolejnych postów - bo ja w końcu tak - i co ? NADAL nie wiadomo co ile dokładnie czasu on odpala ten buzer żeby słyszeć równy takt. Nie wiemy bowiem o kolejnym puzlu czyli jaką częstotliwością jest taktowany u niego procek i czy aby na pewno w ogóle korzysta z podstawy czasu dla timerów 10Hz ? Ja coś w to bardzo wątpię i już to może być pierwszym krokiem do jego problemów a nie żaden brak atomowiści w tych timerkach bo to wręcz nonses !<br /><br />Zobaczcie sami że w przykładowych kawałkach kodu które pokazał - przeładowuje timer buzzera wartością 1000 !!!!!!<br /><br />[syntax=c]if (!timer1) {<br />                        BUZZER_TOGGLE;<br />                        timer1 = 1000;<br />                }[/syntax]<br /><br />czyli gdyby była podstawa czasu 10ms to buzzer brzęczałby przez 10s i przez kolejne 10s byłby cicho - CZY DAŁOBY się usłyszeć różnice w takim TAKCIE ???? gdyby zmieniał się powiedzmy nawet o kilkadziesiąt ms ????????????<br /><br />No dobra - załóżmy że autor ustawił sobie jakąś randomową podstawę czasu albo nawet niech będzie że ustawił podstawę czasu 1ms co wg mnie jest już nonsensem (albo nie będzie nonsensem dla kogoś kto ew już ma większe doświadczenie w pisaniu programów w sposób nieblokujący i w takim wypadku rzeczywiście warto byłoby już sięgać po AtomicBLOCK) ... Więc jeśli ja miałbym pomóc autorowi w rozwiązaniu problemu to najpierw nakierowałbym go na właściwe tory - żeby zaczął od podstaw bo widać, że jeszcze jest mocno początkujący, a szczególnie w porządnym opisie problemu.<br /><br />---------------------------------------<br /><br />krótko albo długo mówiąc ALE WYJAŚNIAJĄC dokładnie przyczynę problemów autora - proszę bardzo pierwszy przykład, z porządną podstawą czasu 10ms dla timerów programowych - jak w Bluebooku - a autor zarzekał się, że wszystko zrobił jak z Bluebooka - ileż ja to razy już słyszałem, a wszyscy poszli tropem opowieści autora - wierząc mu że zrobił jak w Bluebooku - no to jeśli słyszy różny TAKT - to nic tylko ATOMIC BLOCK nie dał <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /><br /><br />A tymczasem to jest dla niego prawidłowy kod i to bez żadnych kocich kalamburów - w którym widać jak na dłoni co i jak jest skonfigurowane<br />[syntax=c]/*    F_CPU = 11,0592 MHz   */<br />#include &lt;avr/io.h&gt;<br />#include &lt;avr/interrupt.h&gt;<br />#include &lt;avr/pgmspace.h&gt;<br />#include &lt;util/delay.h&gt;<br />#include &lt;avr/wdt.h&gt;<br />#include &lt;stdio.h&gt;<br /><br />#define LED(1&lt;&lt;PC4)<br />#define BUZ(1&lt;&lt;PC7)<br /><br />volatile uint16_t timer1, timer2;<br /><br />int main() {<br /><br />        DDRC |= LED|BUZ;<br /><br />    /* Timer2 – inicjalizacja przerwania co 10ms */<br />    TCCR2 |= (1&lt;&lt;WGM21);// tryb pracy CTC<br />    TCCR2 |= (1&lt;&lt;CS22)|(1&lt;&lt;CS21)|(1&lt;&lt;CS20);// preskaler = 1024<br />    OCR2 = F_CPU/1024/100;// przerwanie porównania co 10ms (100Hz)  !!!!!!!! 10 ms !!!!!!!!!!<br />    TIMSK = (1&lt;&lt;OCIE2);// Odblokowanie przerwania CompareMatch<br /><br />        sei();<br /><br />        while (1) {<br /><br /><br />                if( !timer2 ) {<br />                        PORTC ^= LED;<br />                        timer2 = 300;<br />                }<br /><br />                if( !timer1 ) {<br />                PORTC ^= BUZ;<br />                timer1 = 100;  // &lt;---------- tyle że zmieniam stan buzera co ok SEKUNDĘ !!!!!<br />                }<br />        }<br />}<br /><br />ISR( TIMER2_COMP_vect ) {<br /><br />        uint16_t x;<br /><br />        x = timer1;<br />        if( x ) timer1 = --x;<br /><br />        x = timer2;<br />        if( x ) timer2 = --x;<br />}[/syntax]<br /><br />No i niech mi ktoś powie, że tu coś będzie źle śmigało bez atomowego podejścia - MOWA O TYM PROSTYM KODZIE - a nie o domysłach - co by było gdyby, warto się czasem skupić na problemie autora. Ja wprawdzie gdy widzę że kogoś trzeba ciągnąć za język to się po prostu wyłączam i nic dalej się nie odzywam bo po co - strata czasu. Ale że rozgorzała - fajna dyskusja <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> to w końcu też zabrałem głos - ot mogłem się oderwać na chwilę od kursu ESP <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><br /><br />ale żeby nie było że sobie gdybam to proszę widok z analizatora:<br /><a href="https://obrazkiforum.atnel.pl/54/f69147230a816aedd1ecddda15aab87e.png"  class="postlink"><img src="https://obrazkiforum.atnel.pl/thumb/54/f69147230a816aedd1ecddda15aab87e.png" alt="Obrazek" /></a><br /><br />no i zobaczcie Panowie, którzy twierdzicie że tu bez atomic block się nie obejdzie - jak pomimo wszystko są równe odcinki czasu - ok wprawdzie mało ich widać <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> ale spokojnie poczekajcie co dalej pokażę<br /><br /><br />więc tu spłodziłem nowy kod - tyle że prawdopodobnie zbliżony jak chodzi o czasówki do tego co stworzył autor i to być może nieświadomie - albo i świadomie ale nie raczył puzla pokazać <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /><br /><br />TYM RAZEM ----- UWAGA !!!! ------ podstawa czasu = 1ms !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!<br />[syntax=c]/*    F_CPU = 11,0592 MHz   */<br />#include &lt;avr/io.h&gt;<br />#include &lt;avr/interrupt.h&gt;<br />#include &lt;avr/pgmspace.h&gt;<br />#include &lt;util/delay.h&gt;<br />#include &lt;avr/wdt.h&gt;<br />#include &lt;stdio.h&gt;<br /><br />#define LED(1&lt;&lt;PC4)<br />#define BUZ(1&lt;&lt;PC7)<br /><br />volatile uint16_t timer1, timer2;<br /><br />int main() {<br /><br />        DDRC |= LED|BUZ;<br /><br />    /* Timer2 – inicjalizacja przerwania co 10ms */<br />    TCCR2 |= (1&lt;&lt;WGM21);// tryb pracy CTC<br />    TCCR2 |= (1&lt;&lt;CS22)|(1&lt;&lt;CS21)|(1&lt;&lt;CS20);// preskaler = 1024<br />    OCR2 = F_CPU/1024/1000;// przerwanie porównania co 1ms (1000Hz)  ****** 1 ms *******<br />    TIMSK = (1&lt;&lt;OCIE2);// Odblokowanie przerwania CompareMatch<br /><br />        sei();<br /><br />        while (1) {<br /><br /><br />                if( !timer2 ) {<br />                        PORTC ^= LED;<br />                        timer2 = 300;<br />                }<br /><br />                if( !timer1 ) {<br />                PORTC ^= BUZ;<br />                timer1 = 1000;  // &lt;----------  1000 ale też zmieniam stan buzera co ok SEKUNDĘ !!!!!<br />                }<br />        }<br />}<br /><br />ISR( TIMER2_COMP_vect ) {<br /><br />        uint16_t x;<br /><br />        x = timer1;<br />        if( x ) timer1 = --x;<br /><br />        x = timer2;<br />        if( x ) timer2 = --x;<br />}[/syntax]<br /><br />no i może zanim coś powiem to rzućcie okiem na widok z analizatora:<br /><a href="https://obrazkiforum.atnel.pl/54/41b5c3191c82a1d8001dec55174748a0.png"  class="postlink"><img src="https://obrazkiforum.atnel.pl/thumb/54/41b5c3191c82a1d8001dec55174748a0.png" alt="Obrazek" /></a><br /><br />widzicie różnicę ???? Nagle się okazuje, że bardzo często wskakują krótsze odcinki czasowe niż 1s !!!! te krótsze są krótsze aż o ok 30% !!!!! Jak myślicie z czego to wynika ????? .... No to dodajmy ATOMOWE PODEJŚCIE <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /><br /><br />Więc ten sam kod co wyżej z podstawą czasu 1 ms !!!!!!!!! ale z ATOMIC BLOCK<br />[syntax=c]/*    F_CPU = 11,0592 MHz   */<br />#include &lt;avr/io.h&gt;<br />#include &lt;avr/interrupt.h&gt;<br />#include &lt;avr/pgmspace.h&gt;<br />#include &lt;util/delay.h&gt;<br />#include &lt;avr/wdt.h&gt;<br />#include &lt;stdio.h&gt;<br /><br />#define LED(1&lt;&lt;PC4)<br />#define BUZ(1&lt;&lt;PC7)<br /><br />volatile uint16_t timer1, timer2;<br /><br />int main() {<br /><br />        DDRC |= LED|BUZ;<br /><br />    /* Timer2 – inicjalizacja przerwania co 10ms */<br />    TCCR2 |= (1&lt;&lt;WGM21);// tryb pracy CTC<br />    TCCR2 |= (1&lt;&lt;CS22)|(1&lt;&lt;CS21)|(1&lt;&lt;CS20);// preskaler = 1024<br />    OCR2 = F_CPU/1024/1000;// przerwanie porównania co 1ms (1000Hz)  ****** 1 ms *******<br />    TIMSK = (1&lt;&lt;OCIE2);// Odblokowanie przerwania CompareMatch<br /><br />        sei();<br /><br />        while (1) {<br /><br /><br />                if( !timer2 ) {<br />                        PORTC ^= LED;<br />                        timer2 = 300;<br />                }<br /><br />                uint8_t sreg = SREG;<br />                cli();                          // ATOMIC BLOCK manualnie ;)<br />                uint16_t t1 = timer1;<br />                SREG=sreg;<br />                if( !t1 ) {<br />                        PORTC ^= BUZ;<br /><br />                    uint8_t sreg = SREG;<br />                    cli();                       // ATOMIC BLOCK manualnie ;)<br />                    timer1 = 1000;<br />                    SREG=sreg;<br />                }<br />        }<br />}<br /><br />ISR( TIMER2_COMP_vect ) {<br /><br />        uint16_t x;<br /><br />        x = timer1;<br />        if( x ) timer1 = --x;<br /><br />        x = timer2;<br />        if( x ) timer2 = --x;<br />}[/syntax]<br /><br />no i już nie będę wklejał kolejnego obrazka z analizatora - bo wygląda on DOOOOKŁAAADNIE tak samo jak ten pierwszy który pokazałem - czyli czasy są równe i wynoszą 1,009 s !!! czyli znowu dobrze !<br /><br />------------------------------------------------------------------------<br /><br />PODSUMOWUJĄC - rację mają wszyscy i zwolennicy łupania wszędzie ATOMIC BLOCK nawet bez zastanowienia się  - no bo to szkody jakiejś  nie przyniesie .... przecież ... ale zawsze dodatkowy kod, miejsce we flashu <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> no i zawsze parę taktów ale zegara ubywa hahahahaha <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /><br /><br />Rację też ma ZELAOTA - ale właśnie w aspekcie tego co mówił - czyli kodu autora że na kodzie z BLUEBOOKA nie może mieć ŻADNYCH niespodzianek, tylko że każdy wierzy że jak autor napisał - że na 100% zrobił jak w książce to to prawda - a po pierwszej pobieżnej analizie jego kodu widać że NIEPRAWDA bo właśnie podstawa czasu wg mnie jest na 100% inna niż ta o której mówię w Bluebooku i NACISKAM wręcz że dla prostych timerków programowych nie schodźcie poniżej 10ms .... Ale co tam pomyślał autor <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> i zrobił po swojemu. Tyle że ciekaw jestem czy ten czas dobrał świadomie czy przypadkowo mu tak wyszło - jeśli się nie obrazi to może odwróci ostatnie puzzle i wypowie się - co i jak ustawiał i jakie ma F_CPU i dlaczego zrobił TAK a nie jak Bluebooku. A na dodatek może sobie skopiować ten pierwszy kod - który pokazałem z timerami z podstawą 10ms (tylko niech przerobi rejestry dla swojego procka bo nie miał m32 tylko jakiś nowszy) i niech sprawdzi sobie jeden, drugi i trzeci kod który pokazałem - to mam nadzieję, że w końcu mu to coś powie.<br /><br />------------------------<br /><br />Na ZAKOŃCZENIE moja odpowiedź:<br /><br />TAK tego typu proste timerki programowe można używać bez ATOMIC BLOCK bo po to one są stworzone i nawet jeśli raz na pierdyliard obiegów pętli głównej dojdzie do super specyficznej sytuacji jaką słusznie opisał i pokazał w ASM kolega Andrews - to proszę pamiętać - timerki programowe mogą mieć spory rozrzut i są używane do rozdzielania czasu dla ZADAŃ - coś na zasadzie RTOS'a <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> <br /><br />zresztą jak myślicie - dlaczego w RTOS'ach - nawet na bajecznie szybszych procesorach - podstawa czasu to właśnie 10ms a nie żadna 1ms ?<br /><br />Tak więc Andrews nie myśl, że ja tu chcę z kolei podważać to co mówisz - i widzisz że przyznaję rację nawet w tym, że i w tych timerkach programowych może dojść (choć wg mnie cholernie rzadko - totolotek) do takich sytuacji o których piszesz - tak więc tu chodzi też troszkę o taką hmmm praktykę programowania <br /><br />ZELAOTA - jeśli miałeś na myśli podstawę czasu 10ms - to praktycznie wszystkie twoje uwagi były słuszne - szczególnie te odnośnie że chodzi o problem autora i że nie może się tu nic złego dziać, i o to, że takie przerwanie praktcznie nie będzie trafiać przy podstawie 10ms ani drastycznie niszczyć czasów pracy timerów - a NAWET jeśli raz na miliard obiegów jakiś TASK (timer programowy wykona szybciej swoje zadanie) to nikt od tego nie zginie - o ile wie co to są timery programowe i jak się z nich korzysta i wie jak pisać programy w sposób nieblokujący.<br /><br />.... miało być krótko - a wyszło jak to u mnie - poemat - sorki <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> — 5 maja 2022, o 22:43</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[andrews]]></name></author>
<updated>2022-05-05T12:48:39+01:00</updated>
<published>2022-05-05T12:48:39+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=24214&amp;p=235472#p235472</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=24214&amp;p=235472#p235472"/>
<title type="html"><![CDATA[Re: Timery programowe, nierówna praca]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=24214&amp;p=235472#p235472"><![CDATA[
Niestety kolego <strong>Zealota</strong> nie masz racji.<br /><br />Patrzysz na program z punktu widzenia języka C, a tu (aby zrozumieć problem) niestety trzeba spojrzeć na asemblera, bo instrukcje języka C nie są wykonywane przez mikrokontroler &quot;atomowo&quot;.<br /><br />Przykładowo instrukcja porównania <strong><em>softTimer1==0</em></strong> wymaga najpierw załadowania obydwu bajtów zmiennej <em>softTimer1</em> do rejestrów. Odbywa się to w dwóch taktach mikrokontrolera, między którymi może wystąpić przerwanie, które zmodyfikuje zawartość zmiennej. Spowoduje to, że w rejestrach R25:R24 zmienna zostanie złożona z młodszego bajtu zmiennej <em>softTimer1</em> w RAM przed modyfikacją i starszego bajtu zmiennej <em>softTimer1</em> w RAM po modyfikacji (w przerwaniu), czyli wartość zmiennej będzie nieprawidłowa. I to na tyle. Struktura programu w języku C jak i wywłaszczanie nie mają tu nic do rzeczy. istotny jest tylko ten fragment dwóch instrukcji asm, pomiędzy którymi może wystąpić przerwanie (które zmodyfikuje wartość kopiowanej akurat zmiennej).<br /><br />Właściwie jedynym sensownym rozwiązaniem tego problemu jest wyłączenie przerwań na czas kopiowania z RAM do rejestrów, czyli w asemblerze wyglądałoby to tak:[syntax=asm];<br />    CLI<br />    LDS R24,0x0100      ;       Load direct from data space<br />; tutaj może wystąpić przerwanie<br />    LDS R25,0x0101      ;       Load direct from data space<br />    SEI<br />    OR R24,R25          ;       Logical OR<br />    BRNE PC-0x05        ;       Branch if not equal<br />;[/syntax]<br />W C można użyć makra ATOMIC_BLOCK() lub instrukcji cli(); i sei();<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=14165">andrews</a> — 5 maja 2022, o 12:48</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mtbchn]]></name></author>
<updated>2022-05-05T11:29:04+01:00</updated>
<published>2022-05-05T11:29:04+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=24214&amp;p=235471#p235471</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=24214&amp;p=235471#p235471"/>
<title type="html"><![CDATA[Re: Timery programowe, nierówna praca]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=24214&amp;p=235471#p235471"><![CDATA[
<div class="quotetitle">Zealota napisał(a):</div><div class="quotecontent"><br /><div class="quotetitle">andrews napisał(a):</div><div class="quotecontent">Scenariusz może być taki:<br /></div><br />Świetnie opisałeś moment &quot;rozrywania&quot; zmiennej, natomiast wg mnie takie coś w tym przykładzie być może nastąpi raz, na początku, po starcie programu.<br /><br />Od momentu uruchomienia globalnego przerwań sei() do pierwszego wejścia w warunek if (softTimer1 == 0) {} przerwanie może zaburzyć ten warunek wpisując &quot;randomowe&quot; wartości do zmiennej, poprzez rozerwanie dwubajtowej wartości softTimer1.<br /><br />Natomiast po wyjściu z pierwszego przerwania następne będzie dopiero po milisekundach. Być może pierwszy &quot;tik&quot; będzie dłuższy albo krótszy od zadanego softTimer1, ale następnie dojdzie do zsychronizowania pętli głównej z licznikiem i przerwaniami, a późniejsze sekwencje będą już &quot;po kolei&quot; i zgodnie z założeniami dla TEGO przykładu<br /><br />Jak pisałem wyżej:<br />1. Obsługa przerwania bezwzględnie blokuje obsługę kodu pętli while.<br />2. Pętla while nie &quot;wywłaszcza&quot; przerwania<br />3. Nie ma nic innego co &quot;wywłaszczy&quot; przerwanie i rozerwie słowo na bajty<br /><br />Te trzy warunki zapewniają, że po &quot;rozkręceniu&quot; licznika przerwań program będzie pracował poprawnie.<br />Dodatkowo modyfikacja zmiennej softTimer1 przez pętlę główną, będzie zawsze po kilkunastu mikrosekundach od wyjścia z przerwania i czasu starczy na poprawną obsługę zmiennej softTimer1. Wyjście z przerwania da zawsze stabilną wartość zmiennej softTimer1<br />Stabilność &quot;danych&quot; w pętli while zapewnia bardzo długi czas pomiędzy przerwaniami.<br /><br />Może źle to tłumaczę, może mi coś umyka, ale ten przykład musi działać poprawnie.<br />Dziś jeszcze dokonam prób sprzętowych na większej liczbie zmiennych, może coś się wyjaśni.</div><br /><br /><br />Daj znać jak będziesz już po testach. Proponuję pomiar programowych timerów na kilku kanałach analizatora stanów logicznych. Jeśli byś mógł, wrzuć screeny.<br /><br />A w międzyczasie, może Mirosław zabierze głos i wyjaśni powyższe wątpliwości.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=18960">mtbchn</a> — 5 maja 2022, o 11:29</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Zealota]]></name></author>
<updated>2022-05-05T10:04:29+01:00</updated>
<published>2022-05-05T10:04:29+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=24214&amp;p=235470#p235470</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=24214&amp;p=235470#p235470"/>
<title type="html"><![CDATA[Re: Timery programowe, nierówna praca]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=24214&amp;p=235470#p235470"><![CDATA[
<div class="quotetitle">andrews napisał(a):</div><div class="quotecontent"><br />Scenariusz może być taki:<br /></div><br />Świetnie opisałeś moment &quot;rozrywania&quot; zmiennej, natomiast wg mnie takie coś w tym przykładzie być może nastąpi raz, na początku, po starcie programu.<br /><br />Od momentu uruchomienia globalnego przerwań sei() do pierwszego wejścia w warunek if (softTimer1 == 0) {} przerwanie może zaburzyć ten warunek wpisując &quot;randomowe&quot; wartości do zmiennej, poprzez rozerwanie dwubajtowej wartości softTimer1.<br /><br />Natomiast po wyjściu z pierwszego przerwania następne będzie dopiero po milisekundach. Być może pierwszy &quot;tik&quot; będzie dłuższy albo krótszy od zadanego softTimer1, ale następnie dojdzie do zsychronizowania pętli głównej z licznikiem i przerwaniami, a późniejsze sekwencje będą już &quot;po kolei&quot; i zgodnie z założeniami dla TEGO przykładu<br /><br />Jak pisałem wyżej:<br />1. Obsługa przerwania bezwzględnie blokuje obsługę kodu pętli while.<br />2. Pętla while nie &quot;wywłaszcza&quot; przerwania<br />3. Nie ma nic innego co &quot;wywłaszczy&quot; przerwanie i rozerwie słowo na bajty<br /><br />Te trzy warunki zapewniają, że po &quot;rozkręceniu&quot; licznika przerwań program będzie pracował poprawnie.<br />Dodatkowo modyfikacja zmiennej softTimer1 przez pętlę główną, będzie zawsze po kilkunastu mikrosekundach od wyjścia z przerwania i czasu starczy na poprawną obsługę zmiennej softTimer1. Wyjście z przerwania da zawsze stabilną wartość zmiennej softTimer1<br />Stabilność &quot;danych&quot; w pętli while zapewnia bardzo długi czas pomiędzy przerwaniami.<br /><br />Może źle to tłumaczę, może mi coś umyka, ale ten przykład musi działać poprawnie.<br />Dziś jeszcze dokonam prób sprzętowych na większej liczbie zmiennych, może coś się wyjaśni.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=16487">Zealota</a> — 5 maja 2022, o 10:04</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[SylwekK]]></name></author>
<updated>2022-05-04T21:46:12+01:00</updated>
<published>2022-05-04T21:46:12+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=24214&amp;p=235469#p235469</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=24214&amp;p=235469#p235469"/>
<title type="html"><![CDATA[Re: Timery programowe, nierówna praca]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=24214&amp;p=235469#p235469"><![CDATA[
Dokładnie! Gdybym nie miał takiej sytuacji to bym nie mówił.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1922">SylwekK</a> — 4 maja 2022, o 21:46</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[andrews]]></name></author>
<updated>2022-05-04T20:41:38+01:00</updated>
<published>2022-05-04T20:41:38+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=24214&amp;p=235468#p235468</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=24214&amp;p=235468#p235468"/>
<title type="html"><![CDATA[Re: Timery programowe, nierówna praca]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=24214&amp;p=235468#p235468"><![CDATA[
<div class="quotetitle">Zealota napisał(a):</div><div class="quotecontent"><br />Mikrokontroler działa sekwencyjnie. Dopiero zagnieżdżanie przerwań wymusza w odp. momencie atomowość.<br /></div><br /><br />W Twoim przykładzie linia 17. (<strong><em>if( softTimer1 == 0 )</em></strong>) wygeneruje mniej więcej taki kod asm:<br />[syntax=asm];<br />    LDS R24,0x0100;Load direct from data space <br />; tutaj może wystąpić przerwanie<br />    LDS R25,0x0101;Load direct from data space <br />    OR R24,R25;       Logical OR <br />    BRNE PC-0x05;Branch if not equal<br />;[/syntax]<br /><br />Jak widać dwubajtowa zmienna <em><strong>softTimer1</strong></em> jest umieszczona w RAM pod adresami 0x0100 (low) i 0x0101 (high).<br />Przyjmijmy, że zmienna <em><strong>softTimer1=256</strong></em>, czyli adres 0x0100 = 0x00, a adres 0x0101 = 0x01.<br /><br /><br /><ul>Scenariusz może być taki:<br /><li>do rejestru R24 zostaje skopiowana wartość niskiego bajtu zmiennej <em><strong>softTimer1</strong></em>, czyli 0x00</li><li>po tej operacji może nastąpić skok do procedury obsługi przerwania, w której zmienna <em><strong>softTimer1</strong></em> zostaje zmniejszona o 1, czyli adres 0x0100 zawiera teraz 0xFF, a adres 0x0101 zawiera 0x00,</li><li>po powrocie z procedury obsługi przerwania do rejestru R25 zostaje załadowana wartość adresu 0x0101, ale teraz już nie 0x01, tylko 0x00</li><li>obydwa rejestry (R24 i R25) są równe 0x00, w związku z czym operacja testu zmiennej <em><strong>softTimer1==0</strong></em> da wynik fałszywie  pozytywny.</li></ul><br />Coś takiego będzie się dziać bez zagnieżdżania, a nawet bez innych przerwań.<br />Oczywiście nie będzie tak w każdym obiegu timera. Prawdopodobieństwo &quot;trafienia&quot; przerwania w nieodpowiednim momencie może nie jest duże, ale prędzej czy później się przytrafi, w efekcie czego program może działać niestabilnie.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=14165">andrews</a> — 4 maja 2022, o 20:41</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Zealota]]></name></author>
<updated>2022-05-04T19:00:51+01:00</updated>
<published>2022-05-04T19:00:51+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=24214&amp;p=235467#p235467</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=24214&amp;p=235467#p235467"/>
<title type="html"><![CDATA[Re: Timery programowe, nierówna praca]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=24214&amp;p=235467#p235467"><![CDATA[
<div class="quotetitle">SylwekK napisał(a):</div><div class="quotecontent"><br />przecięta na pół w losowych momentach...<br /></div><br />W przykładzie z jednym przerwaniem i modyfikacją w pętli głównej kiedy ma nastąpić to &quot;przecięcie na pół&quot;?<br />Modyfikacja zmiennej następuje tylko w przerwaniu oraz w pętli głównej.<br /><br />Jeśli mikrokontroler wchodzi w obsługę przerwania, to póki nie skończy obsługi - podziała na rejestrach - to nic mu nie przerwie działania na rejestrach.<br />&quot;Atomowość&quot; przerwania nie jest potrzebna, bo pętla główna nie jest wstanie zaburzyć/przerwać działania żadnego przerwania.<br />W AVR przerwanie może zostać jedynie &quot;przecięte na pół&quot; przez inne przerwanie, czyż nie?<br /><br />No to może podczas modyfikacji zmiennej w pętli głównej? <br />Nie, bo przerwanie wykonuje się co milisekundy, a inkrementacja dwubajtowej w pętli głównej, wraz z sprawdzeniem warunku będzie trwała wielokrotnie dłużej.<br />Mamy zatem sekwencję:<br />1. Wejście w przerwanie<br />2. Obliczenia <br />3. Wyjście z przerwania<br /><br />4. Wejście do pętli głównej<br /><br />5. Co kilkanaście taktów zegara jest sprawdzany warunek - mikrosekundy najwyżej<br />Gdy tylko przerwanie zmieni wartość licznika na 0 - w tym przerwaniu PĘTLA nie zmieni rejestrów, to DOPIERO po wyjściu z przerwania pętla będzie mogła wpisać nową wartość. <br />PONIEWAŻ przerwanie nastąpi dopiero za kolejne milisekundy JEST DOŚĆ czasu na modyfikację dwóch jednobajtowych rejestrów. <br /><br />6. Pętla sprawdza warunek (licznik == 0) wpisuje nową wartość w ciągu maks. kilku mikrosekund<br />7. Wielokrotnie sprawdzany jest warunek (licznik==0).<br />Były ms zanim po raz kolejny nastąpiło przerwanie, ale zmienna już została zmodyfikowana do wartości początkowej (licznik = 1000 /ms/ ) <br /><br />8. Wejście w przerwanie - po ms<br />9. Obliczenia<br />10. Wyjście z przerwania<br />itd<br /><br />Mikrokontroler działa sekwencyjnie. Dopiero zagnieżdżanie przerwań wymusza w odp. momencie atomowość. Bo jedno jak i drugie przerwanie może zostać &quot;przerwane&quot;, pokićkać wspólne rejestry.<br />Nie pojedyncze przerwanie i pętla główna.<br />No chyba, że coś pominąłem, ale co?<br />Jaki macie pomysł na wytłumaczenie? Nie zadowala mnie &quot;bo ktoś powiedział', albo że &quot;tak ma być&quot;, &quot;atomowość rozwiązała problem&quot; <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><br /> <br />Taki kod działa u mnie bezbłędnie nawet jeśli jest kilka liczników i kilka diod czy inne proste zmiany portów.<br />Greenbook'owe kody też działają, a mamy tam przecież dość skomplikowane projekty, a softtimery są wykorzystywane.<br /><br />[syntax=c]#include &lt;avr/io.h&gt;<br />#include &lt;AVR/interrupt.h&gt;<br /><br /><br />#define PRESCALLER256<br />#define TIMER_OCR13<br /><br />volatile uint16_t softTimer1;<br />void timer2_init(void);<br /><br />int main( void ) {<br />timer2_init();<br /><br />sei();<br /><br />while (1) {<br />if( softTimer1 == 0 ) {<br />softTimer1 = 500;<br />PORTD ^= (1&lt;&lt;PD0);<br />}<br /><br />}<br />}<br />ISR( TIMER2_COMPA_vect ) {<br />register uint16_t n;<br />n = softTimer1;<br />if (n) softTimer1 = --n;<br />}<br /><br />void timer2_init(void) {<br />        // Timer na 1ms, w zależności od zegara różne OCR<br />// Timer2 – konfiguracja silnika timerów programowych<br />TCCR2A  = (1&lt;&lt;WGM21);// tryb pracy CTC dla ATmega8<br /><br />if ( PRESCALLER == 1024 )<br />TCCR2B  |= (1&lt;&lt;CS22)|(1&lt;&lt;CS21)|(1&lt;&lt;CS20);// preskaler = 1024<br />else<br />if ( PRESCALLER == 256 )<br />TCCR2B  |= (1&lt;&lt;CS22)|(1&lt;&lt;CS21);// preskaler = 256<br />OCR2A = TIMER_OCR;<br /><br />TIMSK2  |= (1&lt;&lt;OCIE2A);// Odblokowanie przerwania CompareMatch<br />}[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=16487">Zealota</a> — 4 maja 2022, o 19:00</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[SylwekK]]></name></author>
<updated>2022-05-04T16:26:29+01:00</updated>
<published>2022-05-04T16:26:29+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=24214&amp;p=235466#p235466</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=24214&amp;p=235466#p235466"/>
<title type="html"><![CDATA[Re: Timery programowe, nierówna praca]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=24214&amp;p=235466#p235466"><![CDATA[
Dokładnie. Teoretycznie kod wykona się szybciej, ale zmienna dostarczana do przerwana i tak może być przecięta na pół w losowych momentach...<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1922">SylwekK</a> — 4 maja 2022, o 16:26</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Zealota]]></name></author>
<updated>2022-05-04T12:08:01+01:00</updated>
<published>2022-05-04T12:08:01+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=24214&amp;p=235459#p235459</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=24214&amp;p=235459#p235459"/>
<title type="html"><![CDATA[Re: Timery programowe, nierówna praca]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=24214&amp;p=235459#p235459"><![CDATA[
<div class="quotetitle">Rnext napisał(a):</div><div class="quotecontent"><br />Nie no, bez przesady  Przecież sam możesz sprawdzić (lub ktokolwiek).<br /></div><br />Sprawdziłem, masz rację - zwracam honor.<br />Na &quot;usprawiedliwienie&quot; <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /> mam to, że pomyliłem chyba Bluebooka z Greenbookiem.<br />Różnica polega na tym, że w późniejszych implementacjach Mirek w obsłudze timerów programowych, przy inkrementacji, używa specyfikatora &quot;register&quot;, który prawdopodobnie daje odpowiednią ochronę kodu. Takiego rozwiązania użyłem w wielu projektach i nigdy nie było problemu  z działaniem w odpowiednim czasie.<br />Sprawdź proszę, czy ta drobna zmiana spowoduje poprawne działanie.<br />[syntax=c]ISR(TIMER0_COMPA_vect) {<br />        register uint16_t x;           // Tutaj jest istotna zmiana<br /> <br />        x = timer1;<br />        if (x) timer1 = --x;<br /> <br />        x = timer2;<br />        if (x) timer2 = --x;<br />}[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=16487">Zealota</a> — 4 maja 2022, o 12:08</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Rnext]]></name></author>
<updated>2022-05-04T11:12:46+01:00</updated>
<published>2022-05-04T11:12:46+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=24214&amp;p=235458#p235458</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=24214&amp;p=235458#p235458"/>
<title type="html"><![CDATA[Re: Timery programowe, nierówna praca]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=24214&amp;p=235458#p235458"><![CDATA[
<div class="quotetitle">mtbchn napisał(a):</div><div class="quotecontent"><br />Możesz pokazać ciało swojej funkcji: hw_timer0_ctc_enable?<br /></div><br /><br />Jasne. Nic szczególnego w niej nie ma a jak pisałem, umieszczenie przełączania w obsłudze przerwania chodzi idealnie.<br />[syntax=c]typedef enum {<br />clk0_1, clk0_8, clk0_64, clk0_256, clk0_1024<br />} TSCALETIM0;[/syntax]<br /><br />[syntax=c]void hw_timer0_ctc_enable(TSCALETIM0 prescaler, uint8_t cmp) {<br />TCCR0A |= (1 &lt;&lt; WGM01);<br /><br />switch (prescaler) {<br />case clk0_1:<br />TCCR0B |= (1 &lt;&lt; CS00);<br />break;<br />case clk0_8:<br />TCCR0B |= (1 &lt;&lt; CS01);<br />break;<br />case clk0_64:<br />TCCR0B |= (1 &lt;&lt; CS00) | (1 &lt;&lt; CS01);<br />break;<br />case clk0_256:<br />TCCR0B |= (1 &lt;&lt; CS02);<br />break;<br />case clk0_1024:<br />TCCR0B |= (1 &lt;&lt; CS00) | (1 &lt;&lt; CS02);<br />break;<br />default:<br />TCCR0B |= (1 &lt;&lt; CS00);<br />break;<br />}<br /><br />OCR0A = cmp;<br />TIMSK0 = (1 &lt;&lt; OCIE0A);<br />}[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=21807">Rnext</a> — 4 maja 2022, o 11:12</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mtbchn]]></name></author>
<updated>2022-05-03T17:49:32+01:00</updated>
<published>2022-05-03T17:49:32+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=24214&amp;p=235457#p235457</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=24214&amp;p=235457#p235457"/>
<title type="html"><![CDATA[Re: Timery programowe, nierówna praca]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=24214&amp;p=235457#p235457"><![CDATA[
<div class="quotetitle">Rnext napisał(a):</div><div class="quotecontent"><br /><div class="quotetitle">Zealota napisał(a):</div><div class="quotecontent"><div class="quotetitle">SylwekK napisał(a):</div><div class="quotecontent">Więcej niż Ci się wydaje.<br /></div><br />Nie w tym banalnym przykładzie. {...}<br />Natomiast na pewno autor źle przepisał kod z bluebooka i od poprawnego powinien był zacząć.</div><br /><br />Nie no, bez przesady <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /> Przecież sam możesz sprawdzić (lub ktokolwiek). Przecież wkleiłem też ten pierwotny, przepisany kod. Tym bardziej że za wiele do przepisywania tu nie ma, zwłaszcza że na pierwszy rzut oka w kod z BB wiadomo o co w nim chodzi.<br /><br /><strong><span style="color: #808000">------------------------ [ Dodano po: 19 minutach ]</span></strong><br /><br /><div class="quotetitle">ord napisał(a):</div><div class="quotecontent"><br />Poczytaj sobie o współdzieleniu danych i atomowym dostępie.<br /></div><br /><br />Dzięki! Do głowy mi nie przyszło, żeby zerknąć w generowany ASM. Wstępnie zerknąłem w temat dostępu atomowego. Zdaje się tu jest pies pogrzebany.</div><br /><br /><br />Możesz pokazać ciało swojej funkcji: hw_timer0_ctc_enable?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=18960">mtbchn</a> — 3 maja 2022, o 17:49</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Rnext]]></name></author>
<updated>2022-05-03T16:09:22+01:00</updated>
<published>2022-05-03T16:09:22+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=24214&amp;p=235456#p235456</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=24214&amp;p=235456#p235456"/>
<title type="html"><![CDATA[Re: Timery programowe, nierówna praca]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=24214&amp;p=235456#p235456"><![CDATA[
<div class="quotetitle">Zealota napisał(a):</div><div class="quotecontent"><br /><div class="quotetitle">SylwekK napisał(a):</div><div class="quotecontent">Więcej niż Ci się wydaje.<br /></div><br />Nie w tym banalnym przykładzie. {...}<br />Natomiast na pewno autor źle przepisał kod z bluebooka i od poprawnego powinien był zacząć.</div><br /><br />Nie no, bez przesady <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /> Przecież sam możesz sprawdzić (lub ktokolwiek). Przecież wkleiłem też ten pierwotny, przepisany kod. Tym bardziej że za wiele do przepisywania tu nie ma, zwłaszcza że na pierwszy rzut oka w kod z BB wiadomo o co w nim chodzi.<br /><br /><strong><span style="color: #808000">------------------------ [ Dodano po: 19 minutach ]</span></strong><br /><br /><div class="quotetitle">ord napisał(a):</div><div class="quotecontent"><br />Poczytaj sobie o współdzieleniu danych i atomowym dostępie.<br /></div><br /><br />Dzięki! Do głowy mi nie przyszło, żeby zerknąć w generowany ASM. Wstępnie zerknąłem w temat dostępu atomowego. Zdaje się tu jest pies pogrzebany.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=21807">Rnext</a> — 3 maja 2022, o 16:09</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[SylwekK]]></name></author>
<updated>2022-05-02T17:53:49+01:00</updated>
<published>2022-05-02T17:53:49+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=24214&amp;p=235455#p235455</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=24214&amp;p=235455#p235455"/>
<title type="html"><![CDATA[Re: Timery programowe, nierówna praca]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=24214&amp;p=235455#p235455"><![CDATA[
Nie zgodzę się. Nawet w tym banalnym przykładzie gdy timer programowy będzie 16bitowy to zwykle miganie diodą nie będzie idealnie równe. Dawno temu to przerabiałem w równie prostym programie i pytałem po forach co jest nie tak, że nie działa jak powinno.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1922">SylwekK</a> — 2 maja 2022, o 17:53</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Zealota]]></name></author>
<updated>2022-05-02T15:20:57+01:00</updated>
<published>2022-05-02T15:20:57+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=24214&amp;p=235454#p235454</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=24214&amp;p=235454#p235454"/>
<title type="html"><![CDATA[Re: Timery programowe, nierówna praca]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=24214&amp;p=235454#p235454"><![CDATA[
<div class="quotetitle">SylwekK napisał(a):</div><div class="quotecontent"><br />Więcej niż Ci się wydaje.<br /></div><br />Nie w tym banalnym przykładzie. Jest dość czasu na odczyt i zapis i &quot;składanie&quot; rejestrów. Nie ma innych przerwań, nie ma konfliktu dostępu do rejestrów mikrokontrolera<br />Natomiast na pewno autor źle przepisał kod z bluebooka i od poprawnego powinien był zacząć.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=16487">Zealota</a> — 2 maja 2022, o 15:20</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[SylwekK]]></name></author>
<updated>2022-05-02T13:56:13+01:00</updated>
<published>2022-05-02T13:56:13+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=24214&amp;p=235453#p235453</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=24214&amp;p=235453#p235453"/>
<title type="html"><![CDATA[Re: Timery programowe, nierówna praca]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=24214&amp;p=235453#p235453"><![CDATA[
<div class="quotetitle"><b>Quote:</b></div><div class="quotecontent"><br />Tylko co to ma do rzeczy w kontekście problemu?<br /></div><br />Więcej niż Ci się wydaje. Przy przekazywaniu 16bitowych parametrów do przerwania dzieją się różne rzeczy. Doczytaj jak Cię o to proszą, wiedzą co mówią....<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1922">SylwekK</a> — 2 maja 2022, o 13:56</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Zealota]]></name></author>
<updated>2022-05-02T13:38:19+01:00</updated>
<published>2022-05-02T13:38:19+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=24214&amp;p=235452#p235452</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=24214&amp;p=235452#p235452"/>
<title type="html"><![CDATA[Re: Timery programowe, nierówna praca]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=24214&amp;p=235452#p235452"><![CDATA[
<div class="quotetitle">ord napisał(a):</div><div class="quotecontent"><br />Poczytaj sobie o współdzieleniu danych i atomowym dostępie.<br /></div><br />Tylko co to ma do rzeczy w kontekście problemu?<br />Przy miganiu diody czy też buzzera nie ma żadnego znaczenia czy ktoś się pomyli o &quot;kilka taktów zegara&quot;<br /><br />Timery z bluebooka były wielokrotnie sprawdzane i używane do zadań jak w temacie i stawiam orzechy przeciwko kokosom, że autor coś pokikciał.<br /><br />Jeśli ktoś się wykłada na timerach programowych to niech jeszcze się nie bierze za  &quot;atomowość&quot;.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=16487">Zealota</a> — 2 maja 2022, o 13:38</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Rnext]]></name></author>
<updated>2022-05-02T05:43:32+01:00</updated>
<published>2022-05-02T05:43:32+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=24214&amp;p=235448#p235448</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=24214&amp;p=235448#p235448"/>
<title type="html"><![CDATA[Re: Timery programowe, nierówna praca]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=24214&amp;p=235448#p235448"><![CDATA[
<div class="quotetitle">mirekk36 napisał(a):</div><div class="quotecontent"><br /><div class="quotetitle">Rnext napisał(a):</div><div class="quotecontent">to &quot;niemal&quot; to u ciebie całkiem inaczej i źle - stąd twoje problemy. Gdybyś jednak spróbował jak w Bluebooku to mógłbyś działać DOKŁADNIE<br /></div></div><br />Sam bardzo chętnie pozbył bym się flag. Pierwotnie zrobiłem DOKŁADNIE jak w BB i też działało nierówno. Stąd kolejne kombinacje w kodzie.<br /><br />Tak wyglądała przepisana żywcem pętla główna:<br />[syntax=c]int main() {<br />LED_DDR |= (1 &lt;&lt; LED_PIN);<br />BUZZER_DDR |= (1 &lt;&lt; BUZZER_PIN);<br />hw_timer0_ctc_enable(clk0_64, 249);<br />sei();<br /><br />while (1) {<br />if (!timer2) {<br />LED_TOGGLE;<br />timer2 = 300;<br />}<br /><br />if (!timer1) {<br />BUZZER_TOGGLE;<br />timer1 = 1000;<br />}<br />}<br />}[/syntax]<br />A tak przepisałem obsługa przerwania:<br />[syntax=c]ISR(TIMER0_COMPA_vect) {<br />uint16_t x;<br /><br />x = timer1;<br />if (x)<br />timer1 = --x;<br /><br />x = timer2;<br />if (x)<br />timer2 = --x;<br />}[/syntax]<br /><br />Po samej LED pewnie bym się nie zorientował, bo na oko mrugała jak powinna, ale <strong>głośniczek</strong> daje możliwość łatwego wyłapania skoków &quot;taktu&quot;.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=21807">Rnext</a> — 2 maja 2022, o 05:43</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2022-05-01T17:20:51+01:00</updated>
<published>2022-05-01T17:20:51+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=24214&amp;p=235446#p235446</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=24214&amp;p=235446#p235446"/>
<title type="html"><![CDATA[Re: Timery programowe, nierówna praca]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=24214&amp;p=235446#p235446"><![CDATA[
<div class="quotetitle">Rnext napisał(a):</div><div class="quotecontent"><br />No i super - z flagą pomocniczą wszystko działa perfect. Dzięki!<br /></div><br />To jest bardzo zły sposób na realizację timerów programowych<br /><br />poza tym pisałeś:<br /><div class="quotetitle">Rnext napisał(a):</div><div class="quotecontent"><br />Adaptacja niemal żywcem z bluebooka.<br /></div><br /><br />to &quot;niemal&quot; to u ciebie całkiem inaczej i źle - stąd twoje problemy. Gdybyś jednak spróbował jak w Bluebooku to mógłbyś działać DOKŁADNIE i tak samo wygodnie jak w Bluebooku i to bez żadnych dodatkowych flag - bo te dodatkowe flagi twoje to po prostu będą tylko zawalizdrogą przy bardziej rozbudowanych programach.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=54">mirekk36</a> — 1 maja 2022, o 17:20</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Rnext]]></name></author>
<updated>2022-05-01T08:32:17+01:00</updated>
<published>2022-05-01T08:32:17+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=24214&amp;p=235445#p235445</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=24214&amp;p=235445#p235445"/>
<title type="html"><![CDATA[Re: Timery programowe, nierówna praca]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=24214&amp;p=235445#p235445"><![CDATA[
<div class="quotetitle">JarekB napisał(a):</div><div class="quotecontent"><br />Czy timer_1000ms i timer_300ms są volatile ?<br />To po pierwsze<br /></div><br />Tak, tak, naturalnie.<br /><br /><div class="quotetitle">JarekB napisał(a):</div><div class="quotecontent"><br />Po drugie badanie w pętli głównej czy zmienna w przerwaniu osiąga 0 jest ryzykowne.<br />W czasie wykonania przerwania może się zdarzyć że zero stanie się jedynką i pętla główna nie  zdąży zareagować<br />Gdybyś w przerwaniu postawił jakąś flagę i w pętli głównej ją zerował to wtedy miałbyś pewność że zawsze zdążysz.<br /></div><br />Adaptacja niemal żywcem z bluebooka. Ale racja, dodam flagę.<br /><br /><strong><span style="color: #808000">------------------------ [ Dodano po: 7 minutach ]</span></strong><br /><br />No i super - z flagą pomocniczą wszystko działa perfect. Dzięki!<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=21807">Rnext</a> — 1 maja 2022, o 08:32</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[JarekB]]></name></author>
<updated>2022-05-01T08:25:24+01:00</updated>
<published>2022-05-01T08:25:24+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=24214&amp;p=235444#p235444</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=24214&amp;p=235444#p235444"/>
<title type="html"><![CDATA[Re: Timery programowe, nierówna praca]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=24214&amp;p=235444#p235444"><![CDATA[
Czy timer_1000ms i timer_300ms są volatile ?<br />To po pierwsze <br />Po drugie badanie w pętli głównej czy zmienna w przerwaniu osiąga 0 jest ryzykowne.<br />W czasie wykonania przerwania może się zdarzyć że zero stanie się jedynką i pętla główna nie  zdąży zareagować<br />Gdybyś w przerwaniu postawił jakąś flagę i w pętli głównej ją zerował to wtedy miałbyś pewność że zawsze zdążysz.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=18188">JarekB</a> — 1 maja 2022, o 08:25</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Rnext]]></name></author>
<updated>2022-05-01T08:01:23+01:00</updated>
<published>2022-05-01T08:01:23+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=24214&amp;p=235443#p235443</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=24214&amp;p=235443#p235443"/>
<title type="html"><![CDATA[Timery programowe, nierówna praca]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=24214&amp;p=235443#p235443"><![CDATA[
Przecieram od rana oczy, bo próbuję sobie ćwiczyć timery programowe na diodzie i głośniczku. <br />Zredukowałem do testów kod do chyba najprostszej możliwej formy. Przerwanie CTC ustawione co 1000ms.<br /><br />[syntax=c]int main() {<br />LED_DDR |= (1 &lt;&lt; LED_PIN);<br />BUZZER_DDR |= (1 &lt;&lt; BUZZER_PIN);<br />hw_timer0_ctc_enable(clk0_64, 249);<br />sei();<br /><br />while (1) {<br />if (!timer_300ms) {<br />LED_TOGGLE;<br />}<br /><br />if (!timer_1000ms) {<br />BUZZER_TOGGLE;<br />}<br />}<br />}<br /><br />//-------------------------------<br />ISR(TIMER0_COMPA_vect) {<br />timer_300ms++;<br />timer_1000ms++;<br /><br />if (timer_1000ms &gt;= 1000)<br />timer_1000ms = 0;<br /><br />if (timer_300ms &gt;= 300)<br />timer_300ms = 0;<br /><br />}[/syntax]<br /><br />...i głośniczek kołacze jak chce, led mruga jak chce ale na pewno nie są to zadane interwały. <br />Jak umieszczę zmianę stanów w kodzie przerwania to wszystko jest jak najbardziej OK.<br /><br />Czegoś tu nie widzę?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=21807">Rnext</a> — 1 maja 2022, o 08:01</p><hr />
]]></content>
</entry>
</feed>