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

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2015-12-02T13:31:09+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=4&amp;t=13726&amp;mode</id>
<entry>
<author><name><![CDATA[florekSi]]></name></author>
<updated>2015-12-02T13:31:09+01:00</updated>
<published>2015-12-02T13:31:09+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=13726&amp;p=146899#p146899</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=13726&amp;p=146899#p146899"/>
<title type="html"><![CDATA[Re: Przerwanie a pętla główna]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=13726&amp;p=146899#p146899"><![CDATA[
Cześć...<br /><br />To jest zastosowanie czegoś co się nazywa RAII (ang. Resource Acquisition Is Initialization). W C to będzie zasada <strong>nie odwoływania</strong> się do zasobu z którego (ktoś/gdzieś) korzysta <strong>lub odwoływania się w sposób atomowy bez naruszania elementów które zajmuje ktoś inny</strong>. Stąd stosowanie ATOMIC_BLOCK bo zasobem jest <strong>cały port</strong> a nie pojedynczy bit <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=11956">florekSi</a> — 2 gru 2015, o 13:31</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[rskup]]></name></author>
<updated>2015-12-02T12:48:02+01:00</updated>
<published>2015-12-02T12:48:02+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=13726&amp;p=146895#p146895</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=13726&amp;p=146895#p146895"/>
<title type="html"><![CDATA[Re: Przerwanie a pętla główna]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=13726&amp;p=146895#p146895"><![CDATA[
Rozwiązanie bez korzystania z ATOMIC_BLOCk jest też bardzo proste (choć nie zawsze się da tak zrobić <img src="https://forum.atnel.pl/images/smilies/icon_e_sad.gif" alt=":(" title="Smutny" /> ). Nie modyfikuj portu w przerwaniu, tylko ustawiaj w nim zmienną mówiącą, że masz to zrobić oraz ewentualnie z informacją jak. A całą operację zmiany dokonuj w pętli głównej.<br /><br />-- <br />Pozdrawiam,<br />Robert<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=3427">rskup</a> — 2 gru 2015, o 12:48</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Tom277]]></name></author>
<updated>2015-12-02T11:38:27+01:00</updated>
<published>2015-12-02T11:38:27+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=13726&amp;p=146892#p146892</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=13726&amp;p=146892#p146892"/>
<title type="html"><![CDATA[Re: Przerwanie a pętla główna]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=13726&amp;p=146892#p146892"><![CDATA[
Dziękuję Krauser!<br />Sprawdziłem i faktycznie z  ATOMIC_BLOCK(ATOMIC_RESTORESTATE) działa, bez nie działa. Trochę mnie Krauser przeraziłeś, ja tu zadaję wydawało by się banalne pytanie a Ty mi wyskakujesz z jakimiś ATOMIC-ikami. W pierwszej chwili blady strach na mnie padł, ale chwila skupienia i wszystko nagle okazało się nie tylko zrozumiałe a wręcz logiczne. Kto by pomyślał, że to takie zdradliwe, na prawdę trzeba mieć oczy z każdej strony.<br />Dziękuję serdecznie.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=548">Tom277</a> — 2 gru 2015, o 11:38</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[rskup]]></name></author>
<updated>2015-12-02T01:19:53+01:00</updated>
<published>2015-12-02T01:19:53+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=13726&amp;p=146881#p146881</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=13726&amp;p=146881#p146881"/>
<title type="html"><![CDATA[Re: Przerwanie a pętla główna]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=13726&amp;p=146881#p146881"><![CDATA[
Kod o którym mówimy w C wygląda następująco<br />[syntax=c]while(1)<br />{<br />PORTB ^= (1&lt;&lt;PB0);         // WDI_TOG;<br />PORTB ^= (1&lt;&lt;PB2);         // LED_TEST_TOG;<br />}[/syntax]<br />co daje nam taki wynik po skompilowaniu:<br />[syntax=asm]6c:21 e0       ldir18, 0x01<br />  6e:94 e0       ldir25, 0x04<br />  70:88 b3       inr24, 0x18<br />  72:82 27       eorr24, r18<br />  74:88 bb       out0x18, r24<br />  76:88 b3       inr24, 0x18<br />  78:89 27       eorr24, r25<br />  7a:88 bb       out0x18, r24<br />  7c:f9 cf       rjmp.-14     ; 0x70[/syntax]<br />w linii 70 pobieramy aktualną wartość portu do rejestru r24, wykonujemy operacje na rejestrze i dopiero w 74 zapisujemy wynik z rejestru do portu. Robimy ponownie to samo w 76 ..7a a następnie skaczemy (wracamy) do 70. I tak w kółko.<br />Gdy przerwanie wyzwoli się nam po pobraniu wartości z portu w 70 ale przed 74 oraz po 76 ale przed 7a, to wpiszemy do portu wartość już nie aktualną, bo przerwanie nam przecież ją zmieniło i powinna być inna.<br />Przerwanie przed 72, 74, 78, 7a powoduje problem a przerwanie przez 70, 76, 7c nie powoduje. Ale jak widać szansa na problem to 4/7, czyi ponad 57%  <img src="https://forum.atnel.pl/images/smilies/icon_e_sad.gif" alt=":(" title="Smutny" /> <br /><br />Jak damy delay, który ma do wykonania np. 993 instrukcji w swoim przebiegu, to szansa wystąpienia problemu to 4/1000, czyli 0,4% <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /> I już tego nie zauważamy. Choć problem jest nadal. Dlatego ten delay to maskowanie problemu i sposób na prezentację przyczyny problemu a nie jego rozwiązanie.<br />Oczywiście dla rozwiązania należy użyć operacji w ATOMIC_BLOCK.<br /><br />-- <br />Pozdrawiam,<br />Robert<br /><br /><strong><span style="color: #808000">------------------------ [ Dodano po: 5 minutach ]</span></strong><br /><br /><div class="quotetitle"><b>Quote:</b></div><div class="quotecontent"><br /><strong>Oczywiście macie racje.</strong><br /></div>Ja się tu męczę a to już nie trzeba udowadniać <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=3427">rskup</a> — 2 gru 2015, o 01:19</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[QuadMan]]></name></author>
<updated>2015-12-02T01:46:49+01:00</updated>
<published>2015-12-02T01:15:20+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=13726&amp;p=146880#p146880</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=13726&amp;p=146880#p146880"/>
<title type="html"><![CDATA[Re: Przerwanie a pętla główna]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=13726&amp;p=146880#p146880"><![CDATA[
Ok, panowie.<br /><br /><strong>Oczywiście macie racje.</strong> Nie dawało mi to spokoju, odkurzyłem zestaw ATB, sprawdziłem i przemyślałem jeszcze raz. Tłumaczenie Kolegi<strong> Krauser</strong> jest jak najbardziej ok i zjawisko to będzie występowało <strong>zawsze</strong>, jeśli w programie głównym i w przerwaniu będziemy się odwoływać do tych samych zasobów ( w tym konkretnym przypadku chodzi o PORTB ). Swoją drogą, to całe &quot;C&quot; jest zdradliwe <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";-)" title="Puszcza oko" />, w .asm nawet mi by do głowy nie przyszło by popełnić tak kardynalny błąd.<br /><br />Pozdrawiam serdecznie, QuadMan.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=5291">QuadMan</a> — 2 gru 2015, o 01:15</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[jacekk232]]></name></author>
<updated>2015-12-02T00:22:44+01:00</updated>
<published>2015-12-02T00:22:44+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=13726&amp;p=146878#p146878</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=13726&amp;p=146878#p146878"/>
<title type="html"><![CDATA[Re: Przerwanie a pętla główna]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=13726&amp;p=146878#p146878"><![CDATA[
<div class="quotetitle">QuadMan napisał(a):</div><div class="quotecontent"><br />Kolega Tom277 napisał o czymś zupełnie odwrotnym, niż Wy usiłujecie Mu wytłumaczyć. Nie wyobrażam sobie, aby opisane przez Niego zjawisko w normalnych warunkach było w ogóle możliwe, dlatego dopytywałem się, jaki to procek, jak ma to wszystko podłączone, itd.<br /><br />Pozdrawiam, QuadMan.<br /><br />P.S. Podejrzewam jakiś problem sprzętowy - &quot;to coś&quot; dopięte do portu D powoduje resetowanie się procka, albo np. krótkotrwały spadek napięcia zasilania, itp... Nie wiem, nie znam się, nie pytać...<br /></div><br />Jest dokładnie tak jak piszą koledzy. Nie wierzysz? Weź procka i sprawdź. <br />Najpierw bez wyłączania przerwań w pętli while a potem z wyłączeniem.<br /><br />Sam się zdziwiłem bo myślałem, że nie będzie miało to wpływu. <br /><br /><div class="quotetitle">rskup napisał(a):</div><div class="quotecontent"><br />Jak dałbyś jakiś delay-a w pętli głównej, to zmniejszyłbyś prawdopodobieństwo wystąpienia takiego efektu proporcjonalnie do proporcji czasu zajętego na delaya i potrzebnego na toggle.<br /></div><br />Dokładnie. Wystarczy w pętli dać opóźnienie o wartości kilkadziesiąt us i już program zaczyna działać poprawnie.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=204">jacekk232</a> — 2 gru 2015, o 00:22</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[QuadMan]]></name></author>
<updated>2015-12-02T00:05:56+01:00</updated>
<published>2015-12-02T00:05:56+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=13726&amp;p=146877#p146877</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=13726&amp;p=146877#p146877"/>
<title type="html"><![CDATA[Re: Przerwanie a pętla główna]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=13726&amp;p=146877#p146877"><![CDATA[
Panowie,<br /><br /><div class="quotetitle">Tom277 napisał(a):</div><div class="quotecontent"><br />...<strong>Rzecz w tym, że to w przerwaniu timera dzieją się dziwne rzeczy.</strong> Nie wszystkie diody zapalają się, czasem zapala się jedna a za chwilę trzy pozostałe lub odwrotnie. Tego nie mogę zrozumieć. To, że w pętli głównej program się nie wyrabia bo przerwanie może wystąpić w &quot;złym&quot; momencie to jest dla mnie jasne, ale dlaczego program w przerwaniu tak fiksuje?<br /></div><br />Kolega <strong>Tom277</strong> napisał o czymś zupełnie odwrotnym, niż Wy usiłujecie Mu wytłumaczyć. Nie wyobrażam sobie, aby opisane przez Niego zjawisko w <strong>normalnych warunkach</strong> było w ogóle możliwe, dlatego dopytywałem się, jaki to procek, jak ma to wszystko podłączone, itd.<br /><br />Pozdrawiam, QuadMan.<br /><br />P.S. Podejrzewam jakiś problem sprzętowy - &quot;to coś&quot; dopięte do portu D powoduje resetowanie się procka, albo np. krótkotrwały spadek napięcia zasilania, itp... Nie wiem, nie znam się, nie pytać... <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=5291">QuadMan</a> — 2 gru 2015, o 00:05</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[rskup]]></name></author>
<updated>2015-12-01T21:23:20+01:00</updated>
<published>2015-12-01T21:23:20+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=13726&amp;p=146849#p146849</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=13726&amp;p=146849#p146849"/>
<title type="html"><![CDATA[Re: Przerwanie a pętla główna]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=13726&amp;p=146849#p146849"><![CDATA[
Weź pod uwagę, że to co napisał <em>Krauser</em>, musi nastąpić z bardzo dużym prawdopodobieństwem, bo tylko to robisz w swojej pętli głównej.  Więc te operacje operowania na porcie muszą być przerwane przez wygenerowane przerwanie.<br />Jak dałbyś jakiś delay-a w pętli głównej, to zmniejszyłbyś prawdopodobieństwo wystąpienia takiego efektu proporcjonalnie do proporcji czasu zajętego na delaya i potrzebnego na toggle.<br /><br />Oczywiście dodanie delay-a nie spowoduje zniknięcia problemu a raczej stworzenia kodu w stylu Windows - działa dobrze ale co jakiś czas coś się wyłoży <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><br /><br />-- <br />Pozdrawiam,<br />Robert<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=3427">rskup</a> — 1 gru 2015, o 21:23</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Krauser]]></name></author>
<updated>2015-12-01T20:53:09+01:00</updated>
<published>2015-12-01T20:53:09+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=13726&amp;p=146844#p146844</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=13726&amp;p=146844#p146844"/>
<title type="html"><![CDATA[Re: Przerwanie a pętla główna]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=13726&amp;p=146844#p146844"><![CDATA[
<div class="quotetitle">Tom277 napisał(a):</div><div class="quotecontent"><br />Tego nie mogę zrozumieć.<br /></div><br />Prostsze wytłumaczenie:<br />1. Procesor wykonuje instrukcje w pętli głównej. Zmiana stanu pinu LED_TEST wygląda tak:<br />a) odczyt zawartości portu B do rejestru Rx<br />b) wykonanie operacji Rx ^ 0b00000100<br />c) zapis liczby z rejestru Rx do portu B<br /><br />2. W przerwaniu inne operacje na porcie B zmieniają jego wartość.<br /><br />3. Jeśli przerwanie wystąpi we wskazanych miejscach i zmieni wartość portu B to jaka będzie wartość na końcu?<br />a) odczyt zawartości portu B do rejestru Rx<br />======= przerwanie i zmiana wartości portu B<br />b) wykonanie operacji Rx = Rx ^ 0b00000100<br />======= przerwanie i zmiana wartości portu B<br />c) zapis liczby z rejestru Rx do portu B<br /><br /><span style="font-size: 85%; line-height: normal">Odpowiedź:<br />Wynikająca z odczytanej i zmienionej przez Rx = Rx ^ 0b00000100. Zmiany wykonane w funkcji obsługi przerwania zostaną nadpisane w ostatnim kroku c</span><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=465">Krauser</a> — 1 gru 2015, o 20:53</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[jacekk232]]></name></author>
<updated>2015-12-01T19:30:34+01:00</updated>
<published>2015-12-01T19:30:34+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=13726&amp;p=146829#p146829</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=13726&amp;p=146829#p146829"/>
<title type="html"><![CDATA[Re: Przerwanie a pętla główna]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=13726&amp;p=146829#p146829"><![CDATA[
A próbowałeś zrobić tak jak radzą koledzy? Sprawdziłem to i faktycznie umieszczenie kodu z pętli głównej w ATOMIC_BLOCK sprawia, że diody w przerwaniu zaczynają działać poprawnie.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=204">jacekk232</a> — 1 gru 2015, o 19:30</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[QuadMan]]></name></author>
<updated>2015-12-01T18:24:04+01:00</updated>
<published>2015-12-01T18:24:04+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=13726&amp;p=146816#p146816</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=13726&amp;p=146816#p146816"/>
<title type="html"><![CDATA[Re: Przerwanie a pętla główna]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=13726&amp;p=146816#p146816"><![CDATA[
Witam,<br /><br />a jaki to konkretnie procek? I co masz podłączone do tych wyjść LED_TES_TOG i  WDI_TOG ? Najlepiej pokaż schemat, jak masz to wszystko podłączone.<br /><br />Pozdrawiam, QuadMan.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=5291">QuadMan</a> — 1 gru 2015, o 18:24</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Tom277]]></name></author>
<updated>2015-12-01T06:42:55+01:00</updated>
<published>2015-12-01T06:42:55+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=13726&amp;p=146771#p146771</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=13726&amp;p=146771#p146771"/>
<title type="html"><![CDATA[Re: Przerwanie a pętla główna]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=13726&amp;p=146771#p146771"><![CDATA[
Ale, mnie nie zastanawiają problemy z pętlą główną<br />[syntax=c]while(1)<br />{<br />WDI_TOG;<br />LED_TEST_TOG;<br />}[/syntax] <br />Rzecz w tym, że to w przerwaniu timera dzieją się dziwne rzeczy. Nie wszystkie diody zapalają się, czasem zapala się jedna a za chwilę trzy pozostałe lub odwrotnie. Tego nie mogę zrozumieć. To, że w pętli głównej program się nie wyrabia bo przerwanie może wystąpić w &quot;złym&quot; momencie to jest dla mnie jasne, ale dlaczego program w przerwaniu tak fiksuje?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=548">Tom277</a> — 1 gru 2015, o 06:42</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[rskup]]></name></author>
<updated>2015-11-30T21:57:47+01:00</updated>
<published>2015-11-30T21:57:47+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=13726&amp;p=146761#p146761</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=13726&amp;p=146761#p146761"/>
<title type="html"><![CDATA[Re: Przerwanie a pętla główna]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=13726&amp;p=146761#p146761"><![CDATA[
Twój przykład jest zgodny z zapisem jak użyjesz parametr <em>ATOMIC_FORCEON</em>. Bo wtedy nie jest zapamiętywany stan SREG a przerwanie jest włączane automatycznie.<br />[syntax=c]ATOMIC_BLOCK(ATOMIC_RESTORESTATE)<br />{<br />...<br />}[/syntax]<br />daje<br />[syntax=asm]inr24, 0x3f<br />cli<br />....<br />out0x3f, r24[/syntax]<br />a użycie<br />[syntax=c]ATOMIC_BLOCK(ATOMIC_FORCEON)<br />{<br />...<br />}[/syntax]<br />daje<br />[syntax=asm]cli<br />...<br />sei[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=3427">rskup</a> — 30 lis 2015, o 21:57</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2015-11-30T21:38:52+01:00</updated>
<published>2015-11-30T21:38:52+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=13726&amp;p=146760#p146760</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=13726&amp;p=146760#p146760"/>
<title type="html"><![CDATA[Re: Przerwanie a pętla główna]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=13726&amp;p=146760#p146760"><![CDATA[
<div class="quotetitle">krzysssztof napisał(a):</div><div class="quotecontent"><br />jest równoznacze z<br /></div><br /><br />oczywiście, że nie jest .... bo pomyśl co się stanie gdy któregoś razu wywołasz to wtedy gdy przerwania mają być wyłączone ? Wtedy się na siłę włączą<br /><br />równoważne jest temu<br /><br />[syntax=c]uint8_t sreg = SREG;<br />cli();<br />//... twoje operacje<br />SREG = sreg;  // tutaj przywracamy SEI jeśli wcześniej było włączone[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=54">mirekk36</a> — 30 lis 2015, o 21:38</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[rskup]]></name></author>
<updated>2015-11-30T21:37:37+01:00</updated>
<published>2015-11-30T21:37:37+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=13726&amp;p=146759#p146759</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=13726&amp;p=146759#p146759"/>
<title type="html"><![CDATA[Re: Przerwanie a pętla główna]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=13726&amp;p=146759#p146759"><![CDATA[
Prawie, bo zależy od użytego parametru. W tym przykładzie nie będzie sei() tylko odtworzenie zapamiętanego przed cli(); rejestru SREG.<br />Polecam zaglądać do dokumentacji <a href="http://www.atmel.com/webdoc/AVRLibcReferenceManual/group__util__atomic.html"  class="postlink">http://www.atmel.com/webdoc/AVRLibcReferenceManual/group__util__atomic.html</a> lub do atomic.h - w eclipse wchodzi się przez klik z controlem.<br /><br />-- <br />Pozdrawiam,<br />Robert<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=3427">rskup</a> — 30 lis 2015, o 21:37</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[krzysssztof]]></name></author>
<updated>2015-11-30T21:22:35+01:00</updated>
<published>2015-11-30T21:22:35+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=13726&amp;p=146756#p146756</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=13726&amp;p=146756#p146756"/>
<title type="html"><![CDATA[Re: Przerwanie a pętla główna]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=13726&amp;p=146756#p146756"><![CDATA[
Czy Atomic Block to jest tylko wyłączenie przerwań, czy spełnia jeszcze jakieś inne funkcje?<br /><br />Bo zastawiam się, czy zapisanie<br />[syntax=c]ATOMIC_BLOCK(ATOMIC_RESTORESTATE)<br />{<br />        WDI_TOG;<br />        LED_TEST_TOG;<br />}[/syntax]<br />jest równoznacze z<br />[syntax=c]{<br />        cli();<br />        WDI_TOG;<br />        LED_TEST_TOG;<br />        sei();<br />}[/syntax]<br />?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=4274">krzysssztof</a> — 30 lis 2015, o 21:22</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Krauser]]></name></author>
<updated>2015-11-30T21:01:32+01:00</updated>
<published>2015-11-30T21:01:32+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=13726&amp;p=146754#p146754</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=13726&amp;p=146754#p146754"/>
<title type="html"><![CDATA[Re: Przerwanie a pętla główna]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=13726&amp;p=146754#p146754"><![CDATA[
Zmiana stanu na przeciwny z użyciem PORTx ^= (1&lt;&lt;Pxy) zajmuje kilka instrukcji asemblera. Kod asemblera można znaleźć w pliku *.lss w folderze Release. Najpierw wczytywany jest stan portu do rejestru, następnie wartość jest zmieniana i ostatecznie zapisywana z powrotem do portu. Jeśli pomiędzy tymi instrukcjami wystąpi przerwanie w którym zmieniony zostanie stan portu to po powrocie ta zmiana zostanie nadpisana przez instrukcję, która z rejestru wpisuje wartość do portu, a więc zmiana wykonana w funkcji obsługi przerwania zostanie utracona. Ratunkiem jest umieszczenie kodu w bloku gdzie przerwania są wyłączane:<br />[syntax=c]#include &lt;util/atomic.h&gt;<br /><br />//...<br />ATOMIC_BLOCK(ATOMIC_RESTORESTATE)<br />{<br />WDI_TOG;<br />LED_TEST_TOG;<br />}[/syntax]<br />Innym sposobem jest użycie rejestru PINx do funkcji toggle, ale dostępne jest to w nowszych mikokontrolerach np. atmega644PA. Wtedy zmiana stanu to tylko jedna instrukcja asemblera.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=465">Krauser</a> — 30 lis 2015, o 21:01</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Tom277]]></name></author>
<updated>2015-11-30T10:58:00+01:00</updated>
<published>2015-11-30T10:58:00+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=13726&amp;p=146731#p146731</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=13726&amp;p=146731#p146731"/>
<title type="html"><![CDATA[Przerwanie a pętla główna]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=13726&amp;p=146731#p146731"><![CDATA[
Czy może mi ktoś pomóc w wyjaśnieniu dlaczego tak się dzieję, że diody LED które powinny mrugać co 1 sekundę, a tego nie robią? <br />W poniższym programie (maksymalnie uproszczonym) diody led1,2,3,4 powinny zmieniać swój stan na przeciwny po doliczeniu licznika cnt_1ms do 1000.<br />[syntax=c]#include &lt;avr/io.h&gt;<br />#include &lt;avr/interrupt.h&gt;<br /><br />#define WDI (1&lt;&lt;PB0)//pin pod który podłączony jest watchdog<br />#define WDI_TOG PORTB ^= WDI//makro zmiany stanu watchdog-a<br /><br />#define LED_TEST (1&lt;&lt;PB2)//pin pod który podłączona jest led test<br />#define LED_TEST_TOG PORTB ^= LED_TEST//makro zmiany stanu led-a<br /><br />#define LED1 (1&lt;&lt;PB4)//pin pod który podłączona jest led1<br />#define LED1_TOG PORTB ^= LED1//makro zmiany stanu<br /><br />#define LED2 (1&lt;&lt;PB5)//pin pod który podłączona jest led2<br />#define LED2_TOG PORTB ^= LED2//makro zmiany stanu<br /><br />#define LED3 (1&lt;&lt;PB1)//pin pod który podłączona jest led3<br />#define LED3_TOG PORTB ^= LED3//makro zmiany stanu<br /><br />#define LED4 (1&lt;&lt;PD7)//pin pod który podłączona jest led4<br />#define LED4_TOG PORTD ^= LED4//makro zmiany stanu<br /><br /><br /><br />int main(void)<br />{<br />//inicjalizacja<br />DDRB |= WDI | LED1 | LED2 | LED3 | LED_TEST;//kierunek wyjciowy<br />PORTB &amp;= ~(WDI | LED1 | LED2 | LED3 | LED_TEST);//stan niski<br /><br />DDRD |= LED4;//kierunek wyjciowy<br />PORTD &amp;= ~(LED4);//stan niski<br /><br />//timer programowy tic/przerwanie co 1ms********config Timer2<br />TCCR2 |= (1&lt;&lt;WGM21);//tryb CTC<br />TCCR2 |= (1&lt;&lt;CS22)|(1&lt;&lt;CS20);//prescaler 128<br />TIMSK |= (1&lt;&lt;OCIE2);//włączenie przerwania od trybu porównania<br />OCR2 = 61;//Timer programowy<br /><br />sei();<br /><br /><br />while(1)<br />{<br />WDI_TOG;<br />LED_TEST_TOG;<br />}<br />}<br /><br />// przerwanie Timer2<br />ISR (TIMER2_COMP_vect)//przerwanie co 1ms<br />{<br />static uint16_t cnt_1ms;<br /><br />cnt_1ms++;<br />if(cnt_1ms&gt;999)<br />{<br />cnt_1ms = 0;<br />LED1_TOG;<br />LED2_TOG;<br />LED3_TOG;<br />LED4_TOG;<br />}<br />}[/syntax]<br />Rzecz w tym, że jak mam w pętli głównej te dwie linijki <br />[syntax=c]WDI_TOG;<br />LED_TEST_TOG;[/syntax]<br />Program źle działa. Jak je usunę to jest ok. <br />Wydawało mi się że nie ważne co jest w głównej pętli programu to, że jak już program wejdzie w przerwanie to póki go nie wykona w całości to w głównym programie nic się  nie dzieje. Niestety diody led mrugają nieregularnie lub nawet niektóre wcale co jest dla mnie bardzo dziwne. Zrozumiałby gdyby było ta, że to w pętli głównej są problemy np. przerwanie za często lub za długo, ale dlaczego przerwanie źle działa? <br />Program jest banalny na razie to tylko początek dla sprawdzenia czy procesor jest dobrze przylutowany i czy ledy działają. W docelowym programie linijkę<br />[syntax=c]WDI_TOG;<br />LED_TEST_TOG;[/syntax]<br />umieszczę w warunku wykonywanym np co pół sekundy, ale na próbę zrobiłem tak jak wyżej i mocno zastanowiły mnie efekty. Poproszę o wyjaśnienie<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=548">Tom277</a> — 30 lis 2015, o 10:58</p><hr />
]]></content>
</entry>
</feed>