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

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2015-10-13T20:16:37+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=4&amp;t=13215&amp;mode</id>
<entry>
<author><name><![CDATA[Krauser]]></name></author>
<updated>2015-10-13T20:16:37+01:00</updated>
<published>2015-10-13T20:16:37+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=13215&amp;p=142337#p142337</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=13215&amp;p=142337#p142337"/>
<title type="html"><![CDATA[Re: 2 przerwania - jedno z nich nie działa]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=13215&amp;p=142337#p142337"><![CDATA[
Jak już odblokujesz dane przerwanie to musi znaleźć się odpowiednia dla niego funkcja ISR chociażby pusta. Jak masz problem to uprość to sobie do maksimum. W funkcji main wstaw obydwie konfiguracje. Pamiętaj, że sei() to globalne zezwolenie na wszystkie przerwania. W funkcjach obsługi przerwań inkrementuj liczniki i migaj 2 diodami za pomocą 2 timerów.<br /><br />PS. Na końcu funkcji main umieść nieskończoną pętlę.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=465">Krauser</a> — 13 paź 2015, o 20:16</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Loreno]]></name></author>
<updated>2015-10-13T18:38:34+01:00</updated>
<published>2015-10-13T18:38:34+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=13215&amp;p=142324#p142324</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=13215&amp;p=142324#p142324"/>
<title type="html"><![CDATA[2 przerwania - jedno z nich nie działa]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=13215&amp;p=142324#p142324"><![CDATA[
Dobry wieczór,<br /><br />W swoim programie chciałem zastosować jednocześnie 2 przerwania: od Timera0 do multiplesowania wyświetlacza LED 7-segmentowego, oraz od Timera1 do innej części programu.<br /><br />Oto mój kod:<br />[syntax=c]int main()<br />{<br />init_7seg();<br />TCCR1B |= (1&lt;&lt;WGM12);  //TRYB CTC LICZNIKA TIMER1 16-BITOWEGO<br />TCCR1B |= (1&lt;&lt;CS12);   //PODZIAŁ 256 ZLICZANIA IMPULSÓW<br />OCR1A = 15624;<br />TIMSK |= (1&lt;&lt;OCIE1A);<br />w4 = 5;   //liczba 5 ma się wyświetlić na 4 wyświetlaczu LED<br />}[/syntax]<br /><br />A w drugim pliku:<br />[syntax=c]volatile int w1 = 16;                 //16 oznacza, że nic nie zostanie wyświetlone (patrz funckja cyfra())<br />volatile int w2 = 16;  //---||---<br />volatile int w3 = 16;  //---||---<br />volatile int w4 = 16;  //---||---<br /><br />void init_7seg()<br />{<br />DDRB = 0xFF;           //wyświetlacz 7-segmentowy<br />DDRA = 0xFF;<br />PORTA = 1;            //wybór wyświetlacza<br />PORTB = 0xFF;<br />set_int();    //aktywowanie przerwań (multipleksowanie wyświetlacza)<br />}<br /><br />void cyfra (int cyfra)<br />{<br />asm volatile(&quot;nop\n\t&quot;::);<br /><br />switch (cyfra)<br />{<br />    case 0: PORTB = 0b00000011; break;<br />case 1: PORTB = 0b10011111; break;<br />case 2: PORTB = 0b00100101; break;<br />case 3: PORTB = 0b00001101; break;<br />case 4: PORTB = 0b10011001; break;<br />case 5: PORTB = 0b01001001; break;<br />case 6: PORTB = 0b01000001; break;<br />case 7: PORTB = 0b00011111; break;<br />case 8: PORTB = 0b00000001; break;<br />case 9: PORTB = 0b00001001; break;<br />case 10: PORTB = 0b00010001; break;  //A<br />case 11: PORTB = 0b00000001; break;  //B = 8<br />case 12: PORTB = 0b01100011; break;  //C<br />case 13: PORTB = 0b00000011; break;  //D = 0<br />case 14: PORTB = 0b10010001; break;  //# = H<br />case 15: PORTB = 0b11111110; break;  //* = .<br />case 16: PORTB = 0b11111111; break;  //NIC<br />}<br />}<br /><br />void set_int()<br />{<br />sei();<br />TCCR0 |= (1&lt;&lt;WGM01);   //TRYB CTC<br />TCCR0 |= (1&lt;&lt;CS02) | (1&lt;&lt;CS00);   //preskaler = 1024<br />OCR0 = 38;                        //chcemy uzyskac 200Hz (50Hz na każdy wyświetlacz) (8000000/1024/38 = ~200)<br />TIMSK |= (1&lt;&lt;OCIE0);              //zezwolenie na przerwanie, gdy nastąpi równośc między timerem0 a rejestrem porównania OCR0<br /><br />}<br /><br />ISR(TIMER0_COMP_vect)<br />{<br />static int licznik = 0;<br />PORTA = (1&lt;&lt;licznik);<br />switch (licznik)<br />{<br />case 0: cyfra(w4); break;<br />case 1: cyfra(w3); break;<br />case 2: cyfra(w2); break;<br />case 3: cyfra(w1); break;<br />}<br />licznik++;<br />if (licznik == 4)<br />licznik = 0;<br />}[/syntax]<br /><br />Niestety okazuje się, że na wyświetlaczu LED nic się nie wyświetla. Kiedy jednak dodam fragment kodu odpowiedzialny za to drugie przerwanie, okazuje się, że działa ono bez problemów - także nie działa jedynie przerwanie od Timera0.<br /><br />Czy wiecie co może być przyczyną takiego stanu rzeczy?<br /><br />P.S. Ogólnie program jest grą na wyświetlaczu LCD, na LED mają pojawiać się punkty. Nie wstawiam całej gry, bo plik byłby zdecydowanie zbyt długi. Próbowałem odpalać program dając w komentarz wszystko poza fragmentem wstawionym powyżej i efekt był ten sam - nie działa. Tak więc sam kod gry jest w porządku. Zauważyłem jednak, że kiedy usunę fragment:<br />[syntax=c]TCCR1B |= (1&lt;&lt;WGM12);  //TRYB CTC LICZNIKA TIMER1 16-BITOWEGO<br />TCCR1B |= (1&lt;&lt;CS12);   //PODZIAŁ 256 ZLICZANIA IMPULSÓW<br />OCR1A = 15624;<br />TIMSK |= (1&lt;&lt;OCIE1A);[/syntax]<br />wyświetlacz LED zaczyna normalnie działać, czyli coś nie tak z przerwaniem od Timera1.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=5188">Loreno</a> — 13 paź 2015, o 18:38</p><hr />
]]></content>
</entry>
</feed>