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

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2016-08-02T20:15:04+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=8&amp;t=15904&amp;mode</id>
<entry>
<author><name><![CDATA[marcin13225]]></name></author>
<updated>2016-08-02T20:15:04+01:00</updated>
<published>2016-08-02T20:15:04+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=15904&amp;p=165304#p165304</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=15904&amp;p=165304#p165304"/>
<title type="html"><![CDATA[Re: ATMega8 Timer1 problem]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=15904&amp;p=165304#p165304"><![CDATA[
Raczej nie trzeba, wręcz na pewno. Przerwanie ma miejsce co ok. 0,5 s, a samo ono trwa dużo krócej, bo po prostu składa się z paru linijek. Więc na pewno to nie to. Niechaj ktoś mnie poprawi, jeśli się mylę. <br />Tak jak mówię wraz z przerwaniem ekran LCD 2x16 wyłącza się na b. krótką chwilę. Jest to dobrze widoczne dla preskalera 64. Natomiast dla mniejszego tj. 8 lub 1, nie możliwe jest wyświetlenie na nim czegokolwiek, tak szybko miga. Przyczyną musi być przerwanie od przepełnia, bo gdy je wyłączę problem znika.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=14367">marcin13225</a> — 2 sie 2016, o 20:15</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[jkarczew]]></name></author>
<updated>2016-08-01T14:24:00+01:00</updated>
<published>2016-08-01T14:24:00+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=15904&amp;p=165193#p165193</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=15904&amp;p=165193#p165193"/>
<title type="html"><![CDATA[Re: ATMega8 Timer1 problem]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=15904&amp;p=165193#p165193"><![CDATA[
A czy przy wejściu w przerwanie nie trzeba na początku procedury obsługi zablokować to przerwania żeby w międzyczasie nie nastąpiło kolejne, a na końcu włączyć je ponownie lub/i wyzerować odpowiednią flagę!?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=593">jkarczew</a> — 1 sie 2016, o 14:24</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[marcin13225]]></name></author>
<updated>2016-08-01T15:28:17+01:00</updated>
<published>2016-08-01T13:37:30+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=15904&amp;p=165190#p165190</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=15904&amp;p=165190#p165190"/>
<title type="html"><![CDATA[Re: ATMega8 Timer1 problem]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=15904&amp;p=165190#p165190"><![CDATA[
Program jest odbiornikiem kodu z pilota z kodowaniem NEC wraz z możliwością wykrycia przytrzymania klawisza ( wykrycie znacznika powtórzenia). Tzn miał być, ale nie działa do końca <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /> Przerwanie od zbocza reaguje tylko na zbocze opadające, wtedy też jest zerowany timer oraz wartość rejestru timera w chwili przerwania zamieniana na mikrosekundy, następnie zaś sprawdzane jest czy wartość ta odpowiada wartości BIT1 wraz z odchyłkami BLAD. Jeśli tak to wpisujemy do wartości odbieranego bajtu 1, jeśli nie - wartość 0. Każde przerwanie zapisuje bit danych ostatnio odebranego bitu, dlatego ignorujemy 2 pierwsze przerwania (pierwsze to znaczniki początku, drugie to pierwszy bit danych). To feralne przerwanie od przepełnienia ma za zadanie wykryć koniec przyciśnięcia danego klawisza i przygotować zmienne do odbioru kolejnych danych.<br /><br />Wiem, że nie jest to program idealny do celu przedstawionego w pierwszym zdaniu. Przybliżając jego zasadę działania mam nadzieję również, że ktoś pokieruje mnie jak to można zrobić lepiej.<br />[syntax=c]#include &lt;avr/io.h&gt;<br />#include &lt;util/delay.h&gt;<br />#include &quot;HD44780.h&quot;<br />#include &lt;avr/interrupt.h&gt;<br /><br /><br /><br />#define BIT1  2250 //stan nisk 590 us stan wysoki 1650<br />#define BIT0 1130 //stan niski 590, wysoki 540<br />#define BLAD 100<br /><br /><br /><br />volatile uint8_t bufor&#91;4&#93;, *wsk, bajt_danych=0, powtorzenie=0,status; //zmienna powtorzenie okresla czy przycisk został przytrzymany<br />      // i sa wysyłane znaczniki powtorzenia<br />uint32_t tykniecia_na_us(uint16_t tyk) //zamienia tykniecia Timera1 na mikrosekundy dla preskalera 64<br />{<br />return tyk*64;<br />}<br /><br /><br />volatile uint16_t to&#91;50&#93;,bit;<br />int main()<br />{<br /><br />wsk=&amp;bufor&#91;0&#93;; // przerwanie od zbocza<br /><br />// TIMER 1 PRZERWANIA ZBOCZA DO ODBIERANIA<br />TCCR1B&amp;=~(1&lt;&lt;ICES1);//ICES1= 0 - reagowanie na zbocze opadajace bo jest pierwsze w transmisji<br />TIMSK=(1&lt;&lt;TICIE1)|(1&lt;&lt;TOIE1);  //TICIE1 wl. przerwania od zbocza,TOIE1 wl. przerwania od przepelnienia<br />DDRB&amp;=~(1&lt;&lt;PB0);//musi byc linia na PB0 bo jest to tez interfejs do reagowania na zbocza ICP1, odbieramy przerwaniami<br />TCCR1B|=(1&lt;&lt;ICNC1)|(1&lt;&lt;CS11)|(1&lt;&lt;CS10);// ICNC1-wlacza noise canceller, CS11-0  preskaler 64<br /><br />sei();<br />LCD_Initalize();<br />LCD_WriteText(&quot;Zacznij pomiar&quot;);<br />_delay_ms(500);<br />LCD_Clear();<br /><br />for(uint8_t i=0;i&lt;4;i++)<br />{<br />LCD_WriteInt(bufor&#91;i&#93;,10);<br /><br />LCD_WriteText(&quot; &quot;);<br />}<br />while(1)<br />{<br /><br />LCD_GoTo(0,1);<br />if(powtorzenie==1)<br />LCD_WriteText(&quot;Powtorzenie&quot;);<br />else<br />LCD_WriteText(&quot;         &quot;);<br /><br />}<br />}<br /><br />ISR(TIMER1_CAPT_vect) //przerwanie na zbocze opadajace<br />{<br />static uint8_t pozycja;//pozycja mowi o aktulanym numerze bit w bajcie,<br />TCNT1=0; //zerowanie wartosci Timera<br />if(!(TCCR1B &amp; (1&lt;&lt;ICES1)))//jesli zbocze opadajace<br />{<br />if(status&lt;2)//status ignoruje 2 pierwsze przerwania,<br />  //jedno jest znacznikiem poczatka transmisji a drugie pierwszym bitem danych<br />{<br />pozycja=0x01;<br />status++;<br />}<br />if(status&gt;=2 &amp;&amp; (bajt_danych&lt;3))//otrzymywanie danych<br />{<br />bit=tykniecia_na_us(ICR1); //zamienienie wartosci timera w chwili przerwania na us<br />if( (bit&lt;(BIT1+BLAD)) &amp;&amp; (bit&gt;(BIT1-BLAD)) )//jesli bit miesci sie w przedziale czasowym dla bitu 1<br />{<br />(*(wsk))|=pozycja; //zapisujemy jedynke do bajtu danych, od najmniej znaczacego bitu<br />}<br />pozycja&lt;&lt;=1; //przesuwamy pozycje na wazniejszy bit<br />}<br />if(pozycja==0) //jeśli odebraliśmy cały bajt<br />{<br />pozycja=0x01;<br />wsk++; //przesuwamy wskaźnik na nastepny bajt danych tablicy<br />bajt_danych++;<br />}<br />if(bajt_danych==3) //jesli odebrano 4 bajty, 3 bo zmienna bajt_danych jest inicowana zerem<br />{<br />if(((bit&lt;(40890+BLAD) &amp;&amp; bit&gt;(40890-BLAD))<br />  ||((bit&lt;(11500+BLAD) &amp;&amp; bit&gt;(11500-BLAD)))<br />  ||((bit&lt;(32300+BLAD) &amp;&amp; bit&gt;(32300-BLAD))))) //patrz dolaczony rysunek,<br />{<br />powtorzenie=1; //wykryto przytrzymanie klawisza<br />}<br />pozycja=0; //przygotowanie dla nastepnego klawisza<br />}<br />}<br />}<br /><br />ISR(TIMER1_COMPA_vect) //przerwanie na przepełnienie<br />{<br />bajt_danych=0; //przygotowanie dla nastepnego klawisza<br />powtorzenie=0; //skoro timer sie przepelnil to puszczono klawisz<br />status=0; <br />}[/syntax]<br />Dołączam obrazek dla lepszego zrozumienia działania programu. Ten znacznik powtórzenia jest jakiś dziwny, nieNECowski. Ale działa bo wysyłając go programem do telewizora interpretował on to jako przytrzymanie klawisza. Znacznik został wykryty przerwaniami od zboczy.<br /><a href="https://obrazkiforum.atnel.pl/14367/d586fda1290d8182ee6cf3c2299bd9ed.png"  class="postlink"><img src="https://obrazkiforum.atnel.pl/thumb/14367/d586fda1290d8182ee6cf3c2299bd9ed.png" alt="Obrazek" /></a><br />EDIT:<br />Z fusebitów jedynie zmieniałem na częstotliwość 8Mhz, tak jak pokazał to mirekk36 na jednym ze swoich filmików dla początkujących.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=14367">marcin13225</a> — 1 sie 2016, o 13:37</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Rafal9018]]></name></author>
<updated>2016-08-01T09:56:18+01:00</updated>
<published>2016-08-01T09:56:18+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=15904&amp;p=165184#p165184</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=15904&amp;p=165184#p165184"/>
<title type="html"><![CDATA[Re: ATMega8 Timer1 problem]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=15904&amp;p=165184#p165184"><![CDATA[
Proponuję wstawić kod programu, wtedy prędzej coś  będzie można powiedzieć. Fuse bity zmieniłeś ??<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=3441">Rafal9018</a> — 1 sie 2016, o 09:56</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[marcin13225]]></name></author>
<updated>2016-08-01T09:25:11+01:00</updated>
<published>2016-08-01T09:25:11+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=15904&amp;p=165182#p165182</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=15904&amp;p=165182#p165182"/>
<title type="html"><![CDATA[ATMega8 Timer1 problem]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=15904&amp;p=165182#p165182"><![CDATA[
Cześć, <br />mam problem z 16 bitowym Timerem1 w ATMedze8a. Otóż, gdy włączam przerwanie przy przepełnieniu reszta programu wykonuje się bardzo wolno. Przy preskalerze równym 64, czyli dla taktowania 8Mhz mamy przerwanie co ok 0,5s (1/8000000s * 64 * 65535). Jednak u mnie dzieje się inaczej. Mimo, że procedura przerwania jest pusta, program wykonuje się wielokrotnie dłużej niż bez włączonego przerwania. Ponadto wraz z przerwaniem ( tak mi się wydaje) miga podłączony ekran LCD. <br />Gdy ustawie preskaler  na 8 trudno w ogóle  cokolwiek na nim wyświetlić. Ktoś wie co się dzieje?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=14367">marcin13225</a> — 1 sie 2016, o 09:25</p><hr />
]]></content>
</entry>
</feed>