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

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2016-11-29T20:22:50+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=4&amp;t=16894&amp;mode</id>
<entry>
<author><name><![CDATA[krzysiekk]]></name></author>
<updated>2016-11-29T20:22:50+01:00</updated>
<published>2016-11-29T20:22:50+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=16894&amp;p=176008#p176008</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=16894&amp;p=176008#p176008"/>
<title type="html"><![CDATA[Re: pytanie o przerwanie z porownania licznika z rejestrem]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=16894&amp;p=176008#p176008"><![CDATA[
Koledzy, walczę dalej z tym odbiornikiem Manchester. Sprawdziłem na oscyloskopie - nadajnik nadaje poprawnie. Na symulatorze proteusa działa dobrze nadawanie i odbieranie. Dioda w while() przełącza się. Natomiast na rzeczywistym układzie nie działa. Gdzieś jest jakiś babol. Tylko gdzie. Mam wrażenie, że procesor sie zawiesza, bo wstawiając przełączanie diody w kod przerwania od INT0 albo w kod przerwania od porownania z OCR0A dioda zaswieca sie, przy nastepnych ramkach danych już świeci i ani mrugnie.<br /><br />[syntax=c]#include &lt;avr/io.h&gt;<br />#include &lt;avr/io.h&gt;<br />#include &lt;avr/interrupt.h&gt;<br />#include &lt;util/delay.h&gt;<br /><br /><br />volatile short int okres, cykl, testczas, bity_startowe, bit, byte, przeczytano, dana;<br />int tt;<br />void przelacz(void)<br />{<br />PORTB^=0b00000100;<br />}<br /><br />int init(void)<br />{<br /><br />MCUCR|=(1&lt;&lt;ISC01)|(1&lt;&lt;ISC00); //narastanie na INT0 wyzwala przerwanie<br />GIMSK|=(1&lt;&lt;INT0); //przerwanie z INT0<br />// zegar<br />TCCR0B|=(1&lt;&lt;CS02); //preskaler na 256<br /><br />}<br /><br /><br /><br />//---------------------------TU przerwanie od INT0<br />ISR(INT0_vect)<br />{<br /><br />if (bity_startowe==0)<br />{<br />if (cykl==0)<br />{<br />TCNT0=0;<br />cykl=1;<br />}<br />else<br />{<br />okres=TCNT0;<br />cykl=0;<br />if (okres&gt;72 &amp;&amp; okres&lt;80) // odebrano bity startowe z poprawnym okresem<br />{<br />bity_startowe=1;<br />testczas=okres*3/4;<br />OCR0A=testczas;  //testczas do sprawdzania bitow<br />//odczytano bity startowe poprawnie, obliczono czas probkowania kolejnych danych,<br />//ustawienie przerwania od kazdego zbocza<br />GIFR|=(1&lt;&lt;INTF0); // wyzerowanie flagi od przerwania INTO<br />MCUCR&amp;=~(1&lt;&lt;ISC01); //wylaczenie przerwania od narastajacego, zostaje przerwanie od kazdego zbocza INT0<br />GIMSK&amp;=~(1&lt;&lt;INT0); // wylacz przerwanie od INT0<br />TCNT0=0; // zeruj licznik, za chwile bedzie probkowanie<br />TIFR0 = (1&lt;&lt;OCF0A); // wyzerowanie flagi porownania COMPA<br />TIMSK0|=(1&lt;&lt;OCIE0A); // wlacza przerwanie COMPA<br /><br />}<br />else<br />{<br />bity_startowe=0; // nie odczytano wlasciwych bitow startowych, za duzy lub za maly okres<br />}<br />}<br />}<br />else // tu kazde zbocze bitow danych<br />{<br />GIFR|=(1&lt;&lt;INTF0); // wyzerowanie flagi od przerwania INTO<br />MCUCR&amp;=~(1&lt;&lt;ISC01); //wylaczenie przerwania od narastajacego<br />GIMSK&amp;=~(1&lt;&lt;INT0); // wylacz przerwanie od INT0<br />TCNT0=0;<br />}<br />{<br />}<br />}<br /><br />ISR(TIM0_COMPA_vect) //<br />{<br /><br />if ((PINB&amp;0b00000010)!=0 ) // jezeli PINB=1 to byte = 0<br />byte=0;<br />else<br />byte=1;<br /><br />dana=(dana&lt;&lt;1); //przesun w lewo o 1<br />dana=dana|byte;<br /><br />bit++;<br /><br /><br />GIMSK|=(1&lt;&lt;INT0);  //wlacz przerwanie od INT0<br />MCUCR|=0b00000001; //kazda zmiana na INT0 wyzwala przerwanie<br /><br />if (bit==12)<br />{<br /><br />przeczytano=1;<br />bity_startowe=0;<br />TIFR0 = (1&lt;&lt;OCF0A); // wyzerowanie flagi porownania COMPA<br />TIMSK0&amp;=0b11111011; // wylacz przerwania z COMPA<br />bit=0;<br />byte=0;<br />GIFR|=(1&lt;&lt;INTF0);//wyzerowanie flagi przerwania INT0<br />GIMSK&amp;=~(1&lt;&lt;INT0); // wylacz przerwania od INT0<br />}<br />}<br />// -------------------------------------<br /><br />//-----------------------------------------------------------------------------<br />int main(void)<br />{<br />DDRB|=0b00000100;<br /><br /><br />init();<br />sei();<br /><br />while(1)<br />{<br /><br />if (przeczytano==1 &amp;&amp; dana==0b000000000001)<br />{<br /><br />przelacz();<br />dana=0;<br />przeczytano=0;<br />_delay_ms(10);<br />init();<br />sei();<br />}<br />}<br /><br /><br /><br />}[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=15213">krzysiekk</a> — 29 lis 2016, o 20:22</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[krzysiekk]]></name></author>
<updated>2016-11-27T20:31:03+01:00</updated>
<published>2016-11-27T20:31:03+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=16894&amp;p=175771#p175771</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=16894&amp;p=175771#p175771"/>
<title type="html"><![CDATA[Re: pytanie o przerwanie z porownania licznika z rejestrem]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=16894&amp;p=175771#p175771"><![CDATA[
No i zrobiłem, na symulatorze proteusa dziala dobrze. Tzn nadajnik i odbiornik komunikują się<br />ze sobą. Po nadaniu paczki danych przez nadajnik, odbiornik odczytuje je, porównuje z wartością wpisaną w odbiornik i przełącza diodę na stan przeciwny. Po załadowaniu natomiast wsadów do<br />realnych układów, tzn nadajnika i odbiornika i po połączeniu ich - na razie - przewodem sygnałowym i masą układ odbiornika nie przełącza diody. Niestety nie jestem w stanie w warunkach domowych sprawdzić poprawności wysyłanej ramki danych, bo nie mam oscyloskopu...więc puki co nic nie ruszę dalej :/<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=15213">krzysiekk</a> — 27 lis 2016, o 20:31</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[krzysiekk]]></name></author>
<updated>2016-11-26T20:05:54+01:00</updated>
<published>2016-11-26T20:05:54+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=16894&amp;p=175720#p175720</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=16894&amp;p=175720#p175720"/>
<title type="html"><![CDATA[Re: pytanie o przerwanie z porownania licznika z rejestrem]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=16894&amp;p=175720#p175720"><![CDATA[
Rewelacja!!!! Serdecznie Ci dziękuję.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=15213">krzysiekk</a> — 26 lis 2016, o 20:05</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[andrews]]></name></author>
<updated>2016-11-26T19:33:32+01:00</updated>
<published>2016-11-26T19:33:32+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=16894&amp;p=175717#p175717</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=16894&amp;p=175717#p175717"/>
<title type="html"><![CDATA[Re: pytanie o przerwanie z porownania licznika z rejestrem]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=16894&amp;p=175717#p175717"><![CDATA[
Nie analizowałem dokładnie kodu, jednak na początek miałbym taką uwagę.<br /><br />Zauważyłem, że wyłączasz przerwania, po czym ponownie je włączasz.<br /><br />Po pierwsze we funkcji <em>przerwania_wylacz()</em> robisz to niepoprawnie (powinno być &amp; zamiast |). Poza tym dla uzyskania większej czytelności lepiej zrobić to tak:[syntax=c]TIMSK0 |= (1&lt;&lt;OCIE0B);      // włączenie przerwań<br />TIMSK0 &amp;= ~(1&lt;&lt;OCIE0B);     // wyłączenie przerwań[/syntax]<br />Wtedy nie ma wątpliwości jaki bit ustawiasz czy też zerujesz.<br /><br />Po drugie, wyłączenie przerwań jest często błędnie interpretowane. Ustawienie czy też zerowanie (akurat w tym przypadku) bitu OCIE0B w rejestrze TIMSK0 oznacza tylko wyłączenie zezwolenia na przerwanie. Timer cały czas zlicza impulsy (TCNT0) i kiedy jego wartość zrówna się z wartością rejestru OCR0B zostanie ustawiona flaga OCF0B w rejestrze TIFR0. W tej sytuacji procedura obsługi przerwania nie zostanie uruchomiona, ponieważ zezwolenie jest wyłączone, jednak flaga jest ustawiona i zostaje zapamiętana. Kiedy ponownie włączysz zezwolenie na to  przerwanie (OCIE0B w TIMSK0), procedura jego obsługi zostaje natychmiast uruchomiona niezależnie od aktualnego stanu licznika TCNT0, bo przecież flaga została już ustawiona wcześniej.<br /><br />Flaga zostaje wyzerowana dopiero wtedy, gdy przerwanie zostanie obsłużone (przez procedurę obsługi) lub gdy wyzerujemy ją programowo. Ewentualnym rozwiązaniem wydawałoby się może wyłączenie zliczania przez licznik (by uniknąć ustawienia flagi), ale to i tak nie zawsze zagwarantuje, że flaga nie zostanie ustawiona. Dlatego moim zdaniem lepszym rozwiązaniem (przynajmniej w tym przypadku) jest programowe zerowanie flagi tuż przed zezwoleniem na przerwanie:[syntax=c]...<br />    TIFR0 = (1&lt;&lt;OCF0B);      // wyzerowanie flagi<br />    TIMSK0 |= (1&lt;&lt;OCIE0B);   // włączenie zezwolenia na przerwanie<br />...[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=14165">andrews</a> — 26 lis 2016, o 19:33</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[krzysiekk]]></name></author>
<updated>2016-11-26T19:32:59+01:00</updated>
<published>2016-11-26T19:32:59+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=16894&amp;p=175716#p175716</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=16894&amp;p=175716#p175716"/>
<title type="html"><![CDATA[Re: pytanie o przerwanie z porownania licznika z rejestrem]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=16894&amp;p=175716#p175716"><![CDATA[
Znalazlem przyczyną, dlaczego wychodzil mi do main(). Pracowałem nad inną wersją kodu i miałem<br />ustawione to tak, że włączone było przerwanie od rejestru A, a wektor procedury przerwania<br />byl ISR(TIM0_COMPB_vect) ... wersja kodu powyżej nie ma tego błędu.<br /><br />Wychodzenie do main już jest naprawione, natomiast wciaż nie moge odnaleźć przyczyny,<br />dlaczego wywołuje mi się przerwanie ISR(TIM0_COMPA_vect) mimo że nie TCNT0 osiąga<br />wartości wpisanej do rejestru OCR0A...<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=15213">krzysiekk</a> — 26 lis 2016, o 19:32</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[krzysiekk]]></name></author>
<updated>2016-11-26T17:09:36+01:00</updated>
<published>2016-11-26T17:09:36+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=16894&amp;p=175708#p175708</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=16894&amp;p=175708#p175708"/>
<title type="html"><![CDATA[Re: pytanie o przerwanie z porownania licznika z rejestrem]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=16894&amp;p=175708#p175708"><![CDATA[
Robie teraz podejscie z symulatorem Atmel Studio i jego stimulifile do debuggera. A kod...<br /><br />Program jest odbiornikiem kodu manchester. Kod napisałem sam, bez posiłkowania się<br />książkami, stad pewnie niestandardowo to robię i pewnie niejednokrotnie wyważam otwarte już przez innych drzwi, popełniając przy tym liczne błędy. Odbiornik ten ma docelowo służyć do komunikacji radiowej, na razie jednak w proteusie symulacje robie tak, że jeden uC podłączony jest wyjściem do wejścia INT0 (PB1) drugiego uC, którego kod jest poniżej. Jak odbierze poprawną daną, ma zaświecić diodę.<br /><br /><br />[syntax=c]#include &lt;avr/io.h&gt;<br />#include &lt;avr/io.h&gt;<br />#include &lt;avr/interrupt.h&gt;<br />#include &lt;util/delay.h&gt;<br /><br /><br />volatile int okres, cykl, testczas, bity_startowe, bit, byte, przeczytano, dana;<br /><br />void przelacz(void)<br />{ <br /><br /> PORTB^=0b00000100;<br />}<br /><br />int init(void)<br />{<br />      MCUCR|=0b00000011; //narastajacy stanu wyzwala przerwanie<br />      GIMSK|=0b01000000; //przerwanie z INT0<br /><br />// zegar<br />      TCCR0B|=0b00000100; //preskaler na 256<br />  <br /> return 0;  <br />}<br /><br />void counter_zero(void)<br />{<br />   TCCR0B=0;//wylacz zegar<br />   TCNT0=0 ;//wyzeruj zegar<br />   TCCR0B|=0b00000100; // wlacz zegar na preskaler 256<br />}<br />void init2()<br />{<br />      GIMSK|=0b01000000; //przerwanie z INT0   <br />      counter_zero();<br />      TIMSK0|=0b00001000; // wlacza przerwanie COMPB<br />      MCUCR&amp;=0b11111101; // wylacz reakcje na zbocze narastajace na rzecz....<br />      MCUCR|=0b00000001; // kazda zmiana INT0 wywoluje przerwanie<br /><br />}<br />void przerwania_wylacz()<br />{<br />   TIMSK0|=0b1110111;<br />}<br />//---------------------------TU<br />ISR(TIM0_COMPB_vect) //<br />{<br />   if ((TCNT0==0) || (przeczytano!=0))return;<br />   bit++; //licz bity<br />   if ((PINB&amp;0b00000010)!=0 ) // jezeli PINB=1 to byte = 0<br />      byte=0;<br />      else<br />      byte=1;<br />      <br />   dana=(dana&lt;&lt;1); //przesun w lewo o 1<br />   dana=dana|byte;<br />   if (bit==12)<br />   {<br />      przeczytano=1;<br />      bity_startowe=0;<br />      init();<br />      TIMSK0&amp;=0b11110111; // wylacz przerwania z COMPB<br />      bit=0;<br />   }<br />   else<br />   {<br />      przeczytano=0;<br />   }<br />counter_zero();<br />GIMSK|=0b01000000; //przerwanie z INT0 <br />}<br />// -------------------------------------<br />ISR(INT0_vect)<br />{<br />if (bity_startowe==0)<br />{<br />if (cykl==0)<br />   {<br />      counter_zero();<br />      cykl=1;<br />   }<br />   else<br />   {<br />      okres=TCNT0;<br />      cykl=0;<br />      if (okres&gt;72 &amp;&amp; okres&lt;80) // odebrano bity startowe<br />      {<br />      bity_startowe=1;<br />      testczas=okres*3/4;<br /> <br /> OCR0B=testczas;  //testczas do sprawdzania bitow<br /><br />      init2();<br />      }<br />      else<br />      {<br /> bity_startowe=0;<br />      }<br />   }<br />}<br />else // tu kazde zbocze bitow danych<br />{<br />   GIMSK&amp;=0b10111111; // wylacz reakcje na zbocze<br />   counter_zero(); // zeruj licznik<br />}<br />}<br /><br /><br /><br />//-----------------------------------------------------------------------------<br />int main(void)<br />{<br />DDRB|=0b00000100;<br />  <br />   <br />   init();<br />   sei();<br />   <br />while(1)   <br />{<br />if (dana==0b000000001111) <br />{   <br />przelacz();<br />   dana=0;<br />}<br />}<br /><br /><br /><br />}[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=15213">krzysiekk</a> — 26 lis 2016, o 17:09</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[andrews]]></name></author>
<updated>2016-11-26T14:51:10+01:00</updated>
<published>2016-11-26T14:51:10+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=16894&amp;p=175698#p175698</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=16894&amp;p=175698#p175698"/>
<title type="html"><![CDATA[Re: pytanie o przerwanie z porownania licznika z rejestrem]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=16894&amp;p=175698#p175698"><![CDATA[
<div class="quotetitle">krzysiekk napisał(a):</div><div class="quotecontent"><br />Pytam tak lakonicznie, ponieważ być może nie wiem o czymś, co jest w jakiś tam sposób naturalne.<br /></div><br />To co opisujesz nie jest oczywiście naturalne. Nie musi jednak wynikać z błędnej symulacji, lecz np. ze źle napisanego kodu. Przykładowo ten mikrokontroler ma stosunkowo mało pamięci RAM, więc łatwo doprowadzić do sytuacji, kiedy dane programu nadpisują stos. A na stosie są przecież między innymi adresy powrotu z funkcji czy też z procedury obsługi przerwania i wtedy mogą się dziać różne dziwne rzeczy.<br /><br />Możemy sobie tutaj tak gdybać nie wiadomo jak długo bez skutku, jednak myślę, że raczej nikt Ci nie pomoże znaleźć przyczyny problemów, dopóki nie przedstawisz kodu.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=14165">andrews</a> — 26 lis 2016, o 14:51</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[krzysiekk]]></name></author>
<updated>2016-11-26T12:55:57+01:00</updated>
<published>2016-11-26T12:55:57+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=16894&amp;p=175693#p175693</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=16894&amp;p=175693#p175693"/>
<title type="html"><![CDATA[Re: pytanie o przerwanie z porownania licznika z rejestrem]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=16894&amp;p=175693#p175693"><![CDATA[
Pytam tak lakonicznie, ponieważ być może nie wiem o czymś, co jest w jakiś tam sposób naturalne.<br />Co do Proteusa...to ogolnie jakis dziwny jest ten symulator. Teraz na przykład ni stad ni zowąd wraca mi z procedury przerwania do main() i wykonuje<br />tam instrukcje inicjalizacyjne, jakby został reset wywołany. A w progranie nigdzie nie dałem żadnego resetu. Gdy natomiast wchodze do sumulatora w trybie<br />dissassembly,to symulacja nie wychodzi mi do main(). Nic już nie rozumiem, a poziom frustracji rośnie.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=15213">krzysiekk</a> — 26 lis 2016, o 12:55</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[andrews]]></name></author>
<updated>2016-11-25T22:23:01+01:00</updated>
<published>2016-11-25T22:23:01+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=16894&amp;p=175659#p175659</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=16894&amp;p=175659#p175659"/>
<title type="html"><![CDATA[Re: pytanie o przerwanie z porownania licznika z rejestrem]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=16894&amp;p=175659#p175659"><![CDATA[
Mogą się zdarzyć sytuacje, gdy tak nie będzie, ale za dużo pisania, żeby to wytłumaczyć, a bez kodu trudno zgadywać przyczynę zachowania symulatora, które opisałeś (w dodatku niezbyt dokładnie).<br /><br />Nie mam tutaj zamiaru bronić Proteusa. Nie znam tego programu i nie wiem, na ile poprawnie symuluje mikrokontrolery AVR. Ja tylko próbuję skorygować Twój tok rozumowania <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=14165">andrews</a> — 25 lis 2016, o 22:23</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[krzysiekk]]></name></author>
<updated>2016-11-25T21:44:08+01:00</updated>
<published>2016-11-25T21:44:08+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=16894&amp;p=175654#p175654</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=16894&amp;p=175654#p175654"/>
<title type="html"><![CDATA[Re: pytanie o przerwanie z porownania licznika z rejestrem]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=16894&amp;p=175654#p175654"><![CDATA[
Ok, ale gdy nie ustawie trybu CTC, to nie powinno mi zerowac timera i po wejsciu w procedure obslugi tego przerwania TCNT0 powinno miec wartość o 1 większa niż OCR0A. Czy to sie zgadza?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=15213">krzysiekk</a> — 25 lis 2016, o 21:44</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[andrews]]></name></author>
<updated>2016-11-25T20:17:55+01:00</updated>
<published>2016-11-25T20:17:55+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=16894&amp;p=175646#p175646</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=16894&amp;p=175646#p175646"/>
<title type="html"><![CDATA[Re: pytanie o przerwanie z porownania licznika z rejestrem]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=16894&amp;p=175646#p175646"><![CDATA[
<div class="quotetitle">krzysiekk napisał(a):</div><div class="quotecontent"><br />...a procek wchodzi mi do ISR(TIM0_COMPA_vect) przy TCNT0 = 0<br /></div><br /><br />A jakiej wartości TCNT0 się spodziewasz? Przecież w trybie CTC w momencie ustawienia flagi przerwania od porównania OCF0A jednocześnie jest zerowany rejestr TCNT0.<br /><br />Spójrz do <a href="http://www.atmel.com/images/doc2535.pdf"  class="postlink">noty katalogowej</a> na rysunek 11-11 na stronie 69 to zrozumiesz, dlaczego w momencie wejścia w procedurę obsługi przerwania rejestr TCNT0 musi być równy 0.<br /><br />Możesz spróbować ustawić przerwanie od porównania z OCR0B (oczywiście ustawiając wcześniej wartość tego rejestru na wartość mniejszą od OCR0A). Wtedy po wejściu do procedury obsługi przerwania wartość TCNT0 będzie o 1 wyższa od wartości OCR0B.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=14165">andrews</a> — 25 lis 2016, o 20:17</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[krzysiekk]]></name></author>
<updated>2016-11-25T17:11:19+01:00</updated>
<published>2016-11-25T17:11:19+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=16894&amp;p=175618#p175618</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=16894&amp;p=175618#p175618"/>
<title type="html"><![CDATA[Re: pytanie o przerwanie z porownania licznika z rejestrem]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=16894&amp;p=175618#p175618"><![CDATA[
Robie tak samo, potem debugguje dalej...a procek wchodzi mi do ISR(TIM0_COMPA_vect) przy TCNT0 = 0 :O<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=15213">krzysiekk</a> — 25 lis 2016, o 17:11</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[P3ndz3l3k]]></name></author>
<updated>2016-11-25T13:40:38+01:00</updated>
<published>2016-11-25T13:40:38+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=16894&amp;p=175593#p175593</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=16894&amp;p=175593#p175593"/>
<title type="html"><![CDATA[Re: pytanie o przerwanie z porownania licznika z rejestrem]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=16894&amp;p=175593#p175593"><![CDATA[
Może nie włączyłeś trybu CTC i przerwanie dostajesz z przepełnienia.<br /><br />[syntax=c]/*<br />TCCR0A |= (1&lt;&lt;WGM01);  //Wlaczenie trybu CTC w timerze TIMER0<br />TIMSK0 |= (1&lt;&lt;OCIE0A); //Wlaczenie przerwan od osiagniecia wartosci<br />OCR0A = 150; //Wpisanie wartosci 150 do rejesru porownania aby uzyskac przerwanie co 1KHz (przy taktowaniu 9,6MHz)<br />TCCR0B |= ( (1&lt;&lt;CS00) | (1&lt;&lt;CS01) ); //Wlaczenie preskalera z podziałem przez 64<br />*/<br /><br /><br />/*<br />ISR(TIM0_COMPA_vect) //Obsluga przerwania zglaszanego przez osmiobitowy TIMER0 pracujacy w trybie CTC<br />{<br /><br /><br />}<br />*/[/syntax]<br /><br />U mnie po takim ustawieniu timera przerwanie działa prawidłowo.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=3709">P3ndz3l3k</a> — 25 lis 2016, o 13:40</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[krzysiekk]]></name></author>
<updated>2016-11-24T20:26:18+01:00</updated>
<published>2016-11-24T20:26:18+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=16894&amp;p=175539#p175539</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=16894&amp;p=175539#p175539"/>
<title type="html"><![CDATA[pytanie o przerwanie z porownania licznika z rejestrem]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=16894&amp;p=175539#p175539"><![CDATA[
Panowie (a może też panie),<br /><br />czy jest taka szansa, aby uC wchodził mi do procedury przerwania ISR(TIM0_COMPA_vect)<br />mimo że TCNT0 nie osiągnął wartości wpisanej do OCR0A?<br /><br />Czy ja o czymś nie wiem?<br /><br />Tak mi się dzieje w Proteusie, przy Attiny 13, w debugerze.<br /><br />Pozdrawiam<br />KK<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=15213">krzysiekk</a> — 24 lis 2016, o 20:26</p><hr />
]]></content>
</entry>
</feed>