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

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2015-11-26T23:06:54+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=58&amp;t=13502&amp;mode</id>
<entry>
<author><name><![CDATA[jacekk232]]></name></author>
<updated>2015-11-26T23:06:54+01:00</updated>
<published>2015-11-26T23:06:54+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=13502&amp;p=146458#p146458</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=13502&amp;p=146458#p146458"/>
<title type="html"><![CDATA[Re: Projekt minutnika]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=13502&amp;p=146458#p146458"><![CDATA[
<div class="quotetitle">Krystek napisał(a):</div><div class="quotecontent"><br />No i właśnie ja, myślałem że przerwania działają w inny sposób, w sensie że najpierw wykona się kod (obsługa przycisku ), i dopiero po wykonaniu wychodzi z przerwania i kontynuuje program. Nie wiem czy dobrze rozumiem, ale w przerwaniu jedna instrukcja wykonuje się tak jakby co jeden impuls zegarowy ? Coś w tym stylu: impuls -&gt; instrukcja, impuls -&gt; instrukcja , i dotąd aż ilość impulsów osiągnie wartość wpisaną do OCR (uwzględniając preskaler) ?<br /></div><br />Troszkę inaczej to działa niż myślisz.<br />Licznik TCNT2 zlicza impulsy taktujące procesor podzielone przez dzielnik preskalera. Co 1024 impulsy taktujące zwiększana jest wartość licznika TCNT2. Jeśli wartość licznika zrówna się z wartością OCR2 to zostaje ustawiona flaga przerwania Compare Match i procesor przechodzi do obsługi funkcji tego przerwania. Jednocześnie licznik TCNT2 zostaje wyzerowany i zaczyna liczyć od początku.<br />Po wejściu do funkcji obsługi przerwania program przejdzie od początku funkcji do jej końca. A nie co przerwanie jedna instrukcja.<br /><br />Jak to będzie wyglądało w przypadku obsługi przycisku? Jeśli przycisk jest wciśnięty to w trakcie pierwszego przerwania wykona się ten fragment kodu<br />[syntax=c]if (!key_lock &amp;&amp; (KEY3_ON))<br />{<br />     key_lock=1;<br /> <br />     sprawdz_klawisz ^= (1&lt;&lt;0);<br />}[/syntax]<br />Po puszczeniu przycisku przez 255 przerwań będzie się wykonywać ten fragment<br />[syntax=c]else if (key_lock &amp;&amp; !(KEY3_ON)) key_lock++;[/syntax]<br />I przez ten czas (około 1s) pierwszy if a tym samym przycisk będą nieaktywne.<br /><br />Tak jak pisałem wcześniej obsługę przycisku można zrobić w przerwaniu ale nie tym sposobem.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=204">jacekk232</a> — 26 lis 2015, o 23:06</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[majster]]></name></author>
<updated>2015-11-26T19:52:38+01:00</updated>
<published>2015-11-26T19:52:38+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=13502&amp;p=146412#p146412</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=13502&amp;p=146412#p146412"/>
<title type="html"><![CDATA[Re: Projekt minutnika]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=13502&amp;p=146412#p146412"><![CDATA[
Kolego potraktuj go kwarcem 8 MHz albo 16MHz albo jakimś innym ale 1MHz to trochę mało <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><br /><br />Prosta obsługa timera programowego:<br /><br />w timerze ustawiasz sobie zmienną <br /><br />np uint8_t licz;<br /><br />[syntax=c]ISR(TIMER2_COMP_vect)<br />{<br /><br />uint8_t licz;<br /><br />licz = czas_led_tog;<br />if (n) czas_led_tog = --licz;<br /><br />}[/syntax]<br /><br /><br />nad int main void deklarujesz sobie zmienną<br /><br />[syntax=c]uint8_t czas_led_tog;[/syntax]<br /><br />a w pętli głównej używasz if'a:<br /><br />[syntax=c]if(!czas_led_tog){<br />LED_TOG;<br />czas_led_tog = 10;<br />}[/syntax]<br /><br />Zakładając że twój tick timera to 10 ms czyli czas_led_tog zmniejszy swoją wartość co 10 ms a że ma 10 ticków to 10 x 10 to 100 ms co oznacza że co 100 milisekund led ci mrugnie <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /> i jest niezależny od reszty programu brak delay brak zawieszania się procesora ...<br /><br />teraz postaraj się tę podpowiedz przenieść na twój kod i zastąpić delay'e timerem programowym<br /><br />następnie spróbuj użyć timera do przycisku ... po prostu pozbądź się delay;<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1628">majster</a> — 26 lis 2015, o 19:52</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Krystek]]></name></author>
<updated>2015-11-26T16:49:45+01:00</updated>
<published>2015-11-26T16:49:45+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=13502&amp;p=146399#p146399</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=13502&amp;p=146399#p146399"/>
<title type="html"><![CDATA[Re: Projekt minutnika]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=13502&amp;p=146399#p146399"><![CDATA[
Dziękuję za odpowiedzi:) No chyba czas pożegnać się z delayami i ogarnąc obsługe timerów programowych. Procka taktuję częstotliwością 1 MHz, więc przerwanie wykonuje się z częstotliwością ~200 Hz . No i właśnie ja, myślałem że przerwania działają w inny sposób, w sensie że najpierw wykona się kod (obsługa przycisku ), i dopiero po wykonaniu wychodzi z przerwania i kontynuuje program. Nie wiem czy dobrze rozumiem, ale w przerwaniu jedna instrukcja wykonuje się tak jakby co jeden impuls zegarowy ? Coś w tym stylu: impuls -&gt; instrukcja, impuls -&gt; instrukcja , i dotąd aż ilość impulsów osiągnie wartość wpisaną do OCR (uwzględniając preskaler) ?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1207">Krystek</a> — 26 lis 2015, o 16:49</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[jacekk232]]></name></author>
<updated>2015-11-24T14:15:21+01:00</updated>
<published>2015-11-24T14:15:21+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=13502&amp;p=146239#p146239</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=13502&amp;p=146239#p146239"/>
<title type="html"><![CDATA[Re: Projekt minutnika]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=13502&amp;p=146239#p146239"><![CDATA[
Obsługę przycisku umieściłeś w przerwaniu. Wg mnie to nie jest dobry pomysł. Tzn. nie w tej formie.<br />Najpierw powinieneś zrozumieć jak działa ta obsługa przycisku i dlaczego umieszczenie jej w przerwaniu, wywoływanym co kilka ms, nie jest dobrym pomysłem.<br /><br />Jeśli przycisk jest wciśnięty to zostaje spełniony ten warunek<br />[syntax=c]if (!key_lock &amp;&amp; (KEY3_ON))[/syntax]<br />Program zrobi to co ma zrobić i ustawia zmienną key_lock na jeden.<br /><br />Po puszczeniu przycisku, z każdym przerwaniem, zmienna jest zwiększana o jeden w tej linii<br />[syntax=c]else if (key_lock &amp;&amp; !(KEY3_ON)) key_lock++;[/syntax] <br />W tym czasie przycisk jest nieaktywny. Aby znów był aktywny zmienna key_lock musi osiągnąć wartość równą zero. Jeśli przerwanie było by wywoływane np. co 4ms to przycisk będzie nieaktywny na czas ok. jednej sekundy.<br /><br />Poza tym zastanawiam się jaką częstotliwością taktujesz procka. Bo jeśli jest to np. 8MHz to przerwania wywoływane są z częstotliwością ponad 2,5kHz. Jest ci aż tyle potrzebne do multipleksowania? No chyba, że w ustawieniach Timera2 OCR2 miało mieć wartość 38 a nie 3.<br /><br />W programie masz delaye, pętle while, pętle for, których są delaye. To wszystko sprawia, że cała pętla główna działa w sposób blokujący. Jedynie przerwanie działa w swoim rytmie bo mimo, że procek co chwilę &quot;wisi&quot; w jakimś delayu przerwanie i tak się wykonuje.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=204">jacekk232</a> — 24 lis 2015, o 14:15</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[majster]]></name></author>
<updated>2015-11-24T06:43:53+01:00</updated>
<published>2015-11-24T06:43:53+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=13502&amp;p=146221#p146221</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=13502&amp;p=146221#p146221"/>
<title type="html"><![CDATA[Re: Projekt minutnika]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=13502&amp;p=146221#p146221"><![CDATA[
Kolego zobacz masz w kodzie delay ms 100 i 250 i 500 w różnych sytuacjach blokujesz prace uC przez delay nie robi on nic innego jak jest zawieszony na zadany czas. Wlasnie przez te delaye raz ci przycisk zadziala a raz nie.<br /><br />Przy drganiach stykow widzialbys jak przycisk np zatrzymuje i startuje czas i dzialal by on zawsze. A tak przez te delay musisz sie wstrzelic z przyciskiem wtedy gdy uC nie jestczawieszony.<br /><br />Postaraj sie zrobic timer programowy by zastapic te delaye a wtedy wszystko zacznie ci pieknie dzialac.<br /><br />Rozpocznij prace nad timer i pytaj.<br /><br />Namazane ze smarta.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1628">majster</a> — 24 lis 2015, o 06:43</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Krystek]]></name></author>
<updated>2015-11-24T00:48:48+01:00</updated>
<published>2015-11-24T00:48:48+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=13502&amp;p=146216#p146216</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=13502&amp;p=146216#p146216"/>
<title type="html"><![CDATA[Re: Projekt minutnika]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=13502&amp;p=146216#p146216"><![CDATA[
Pomoże ktoś ?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1207">Krystek</a> — 24 lis 2015, o 00:48</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Krystek]]></name></author>
<updated>2015-11-20T18:18:31+01:00</updated>
<published>2015-11-20T18:18:31+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=13502&amp;p=145938#p145938</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=13502&amp;p=145938#p145938"/>
<title type="html"><![CDATA[Re: Projekt minutnika]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=13502&amp;p=145938#p145938"><![CDATA[
Dodałem na początku funkcji minutnik wyświetlanie zmiennej i od razu zaskoczyło, nie myślałem że to takie proste <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /> <br />Bawiłem się trochę kodem i próbowałem ogarnąć obsługę przycisku w przerwaniu, który odpowiada za zatrzymywanie i kontynuowanie odliczania. Przycisk działa, ale tylko czasami. W sensie że muszę parę razy nacisnąć żeby się zatrzymał albo wznowił, a za innym razem od razu zaskoczy. Mam świadomość, że to pewnie chodzi o drgania styków. Czytałem bloga Mirka i zastosowałem w przerwaniu jeden z kodów który jest w <a href="http://mirekk36.blogspot.com/2012/10/obsuga-klawiszy-drgania-stykow-cd2.html"  class="postlink">tym artykule</a> , ale własnie ten kod jakoś mi nie działa. <br /><br />[syntax=c]/*<br /> * main.c<br /> *<br /> *  Created on: 7 lis 2015<br /> *      Author: Krystek<br /> */<br /><br /><br /><br />#include &lt;avr/io.h&gt;<br />#include &lt;avr/interrupt.h&gt;<br />#include &lt;util/delay.h&gt;<br /><br /><br />#include &quot;def.h&quot;<br /><br /><br />int main (void)<br />{<br />//************************INICJALIZACJA*********************<br /><br />d_led_init(); // inicjalizacja wywietlacza<br /><br />sei(); // włączenie globalnego zezwolenia na przerwania<br /><br />KEYS &amp;= ~( KEY1_PIN | KEY2_PIN | KEY3_PIN); //kierunek pinu PB2- wejsciowy<br />KEY_PORT |= (KEY1_PIN | KEY2_PIN | KEY3_PIN); //podciągnięcie pinu do VCC (wewnętrzny rezystor)<br />BUZ_DIR; // ustawienie wyjścia na buzzer<br /><br /><br /><br />while (1)<br />{<br /><br />migaj_wyswietlaczem();<br /><br />uint8_t min=0;<br /><br />min = ustaw_czas();<br /><br />_delay_ms(100);<br /><br />minutnik(min);<br /><br />wyswietl_zera();<br /><br />}<br />}[/syntax]<br /><br /><br />[syntax=c]/*<br /> * funkcje.c<br /> *<br /> *  Created on: 7 lis 2015<br /> *      Author: Krystek<br /> */<br /><br /><br /><br />#include &lt;avr/io.h&gt;<br />#include &lt;avr/interrupt.h&gt;<br />#include &lt;util/delay.h&gt;<br /><br />#include &quot;def.h&quot;<br />#include &quot;wys_7_seg.h&quot;<br /><br /><br />/* Definicje zmiennych globalnych przechowywujących cyfry do wywietlenia<br /> * volatile - ponieważ będą wykorzystywane do odczytu i zapisu zarówno<br /> * w przerwaniu i programie głównym. Trzeba więc wyłączyć optymalizację<br /> * dostępu do nich . (Zmienne ulotne)<br /> */<br /><br />volatile uint8_t cy1;<br />volatile uint8_t cy2;<br />volatile uint8_t cy3;<br />volatile uint8_t cy4;<br />volatile uint8_t sprawdz_klawisz;<br /><br /><br />//************Definicja funkcji inicjalizującej pracę z wywietlaczem multipleksowanym*******************<br /><br />void d_led_init(void)<br />{<br />LED_DATA_DIR = 0xFF ; // Wszystkie piny portu D jako WYJŚCIA<br />LED_DATA = 0x00 ;     // Wygaszenie wszystkich segmentów - STAN NISKI<br /><br />// 4 PINY PORTU C JAKO WYJŚCIA<br /><br />KATODY_DIR |= CA1 | CA2 | CA3 | CA4 ;<br /><br />// Wygaszenie wszystkich wywietlaczy - KATODY<br /><br />KATODY_PORT |= CA1 | CA2 | CA3 | CA4 ;<br /><br /><br /><br />// USTAWIENIA TIMERA 2<br /><br />TCCR2 |= (1&lt;&lt;WGM21);  // Tryb CTC<br />TCCR2 |= (1&lt;&lt;CS20) | (1&lt;&lt;CS21) | (1&lt;&lt;CS22) ; // Preskaler = 1024<br />OCR2 =3 ;<br />TIMSK |= (1&lt;&lt;OCIE2); //zezwolenie na przerwanie COMPARE MATCH<br />}<br /><br /><br />// =================== PROCEDURA OBSŁUGI PRZERWANIA  - COMPARE MATCH ========================================<br /><br /><br />ISR (TIMER2_COMP_vect)<br />{<br />//zmienna do przełaczania kolejno katod wywietlacza<br /><br />static uint8_t licznik=1 , key_lock;<br /><br />//cykliczne przełączanie w każdym przerwaniu katod każdego wywietlacza<br /><br />KATODY_PORT = licznik ;<br /><br />// gdy zapalony wysw.1 podaj stan zmiennej cy1<br />if (licznik==1) LED_DATA = cy1;<br />// gdy zapalony wysw.2 podaj stan zmiennej cy2<br />else if (licznik==2) LED_DATA = cy2;<br />// gdy zapalony wysw.3 podaj stan zmiennej cy3<br />else if (licznik==4) LED_DATA = cy3;<br />// gdy zapalony wysw.4 podaj stan zmiennej cy4<br />else if (licznik==8) LED_DATA = cy4;<br /><br />//operacje cyklicznego przesuwania bitu zapalającego katody w zmiennej licznik<br /><br />licznik &lt;&lt;= 1; // przesunięcie zawartosci bitów licznika o 1 w lewo<br />if (licznik&gt;8) licznik = 1; // jesli licznik wiekszy niz 8 to ustaw na 1<br /><br /><br />if (!key_lock &amp;&amp; (KEY3_ON))<br />{<br />key_lock=1;<br /><br />sprawdz_klawisz ^= (1&lt;&lt;0);<br /><br />} else if (key_lock &amp;&amp; !(KEY3_ON)) key_lock++;<br /><br /><br /><br />}<br /><br />void wyswietl_sekundy (uint8_t liczba_s)<br />{<br />uint8_t jednosci,dziesiatki;<br /><br />jednosci = liczba_s%10;<br />dziesiatki =(liczba_s/10)%10;<br /><br />cy1 = cyfry&#91;jednosci&#93;;<br />cy2 = cyfry&#91;dziesiatki&#93;;<br /><br />}<br /><br />void wyswietl_minuty (uint8_t liczba_m)<br />{<br />uint8_t j,d;<br /><br />j = liczba_m%10;<br />d =(liczba_m/10)%10;<br /><br />cy3 = cyfry&#91;j&#93;|cyfry&#91;19&#93;;<br />cy4 = cyfry&#91;d&#93;;<br /><br />}<br /><br />void stoper (void)<br />{<br /><br />uint8_t sekundy ;<br />static uint8_t minuty;<br /><br /><br /><br />for (sekundy=0;sekundy&lt;=59;sekundy++)<br />{<br /><br />wyswietl_sekundy(sekundy);<br />_delay_ms(980);<br /><br />if (KEY1_ON)<br />{<br />minuty=minuty+1;<br />wyswietl_minuty(minuty);<br />}<br /><br />else if (KEY2_ON)<br />{<br />minuty=minuty-1;<br />wyswietl_minuty(minuty);<br /><br />}<br />}<br /><br />minuty++;<br /><br />wyswietl_minuty(minuty);<br /><br /><br /><br />}<br /><br />uint8_t minutnik (uint8_t x)<br />{<br />static uint8_t sekundy ;<br /><br /><br />x = x-1 ;   // po wejsciu w funkcje pomniejsz minuty o 1<br />wyswietl_minuty(x);<br /><br />while (1)<br />{<br />for (sekundy=60;sekundy&gt;=1;sekundy=sekundy-1)  // Pętla zliczająca sekundy w dół<br />{<br /><br />//Pętla zatrzymująca funkcję minutnik , sprawdzanie w przerwaniu czy klawisz został wcisniety<br />//za pomocą zmiany stanu zmiennej z 0 na 1 dzięki operacji przesuniec bitowych (XOR)<br /><br />while(sprawdz_klawisz)<br />{<br /><br />}<br /><br />wyswietl_sekundy(sekundy-1);<br />//_delay_ms(980);<br />_delay_ms(100);<br /><br /><br />if (sekundy==1)  // Jesli sekundy dobiegną do zera, zmniejsz minuty o 1<br />{<br />x = x-1;<br />wyswietl_minuty(x);<br />}<br /><br />if (x&lt;1&amp;&amp;sekundy==2)  // Jeśli sekundy i minuty mają wartośc zero<br />{<br />wyswietl_sekundy(sekundy-2);<br />bzykaj();    // uruchom alarm<br /><br />return 0;    // wyjdź z funkcji<br />}<br /><br /><br />}<br />}<br />}<br /><br />void bzykaj (void)<br />{<br />uint8_t i;<br /><br />for (i=0;i&lt;10;i++)<br />{<br />BUZ_TOG;<br />_delay_ms(500);<br />}<br />}<br /><br />void migaj_wyswietlaczem(void)<br />{<br />static uint8_t i=0;<br /><br />for(i=0;i&lt;3;i++)<br />{<br />cy1=cy2=cy3=cy4 = cyfry&#91;8&#93; | cyfry&#91;19&#93; ;<br /><br />_delay_ms(250);<br /><br />cy1=cy2=cy3=cy4 = cyfry&#91;20&#93; ;<br /><br />_delay_ms(250);<br />}<br />}<br /><br />uint8_t ustaw_czas (void)<br />{<br /> static uint8_t minuty=0;<br /><br /> uint8_t wyjscie=0;<br /><br />//Zapalenie zer i kropki<br /><br />cy1=cyfry&#91;0&#93;;<br />cy2=cyfry&#91;0&#93;;<br />cy3=cyfry&#91;0&#93; | cyfry&#91;19&#93;;<br />cy4=cyfry&#91;0&#93;;<br /><br />while (1)<br />{<br />if (KEY1_ON)<br />{<br />minuty=minuty+1;<br />wyswietl_minuty(minuty);<br />_delay_ms(100);<br /><br />if (minuty&gt;=59) // jeśli minuty przekroczą 59 ustaw spowrotem na 0<br />{<br />minuty = 0 ;<br />}<br />}<br /><br />else if (KEY2_ON)<br />{<br />minuty=minuty-1;<br />wyswietl_minuty(minuty);<br />_delay_ms(100);<br /><br />if (minuty&lt;=0) // jeśli minuty przekroczą 0 ustaw na 59<br />{<br />minuty = 59;<br />}<br />}<br /><br />if (KEY3_ON) // Jesli nacisnięto klawisz 3, wyjdź z funkcji i przekaż wartośc zmiennej wyjscie<br />{<br />wyjscie = minuty;<br /><br />return wyjscie;<br />}<br />}<br />}<br /><br />void wyswietl_zera(void)<br />{<br />cy1=cyfry&#91;0&#93;;<br />cy2=cyfry&#91;0&#93;;<br />cy3=cyfry&#91;0&#93; | cyfry&#91;19&#93;;<br />cy4=cyfry&#91;0&#93;;<br />}[/syntax]<br /><br />Jedynie co zmieniłem w mirkowym kodzie to sposób zapisu warunków, ponieważ zastosowałem makra:<br /><br />[syntax=c]#define KEY3_PIN       (1&lt;&lt;PB1)<br />#define KEY3_ON        !(PINB &amp; KEY3_PIN)[/syntax]<br /><br /><br />Jeszcze jedno co mnie nurtuje, to jak mógłbym zrealizować zmianę wartości minut w czasie gdy uruchomiony jest timer? Próbowałem to zrobić też w przerwaniu. Powołałem zmienną zmienną &quot;x&quot; z atrybutem volatile i w zależności który klawisz był wciśnięty dekrementowało lub inkrementowało zmienną &quot;x&quot; o 1. Nie działało to w ogóle. Może dlatego, że zmienna &quot;x&quot; jest użyta w funkcji &quot;minuty&quot; ? Jesli to jest problemem to jak zrobić, żeby przekazywać do funkcji wartośc która uległa zmianie w przerwaniu ?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1207">Krystek</a> — 20 lis 2015, o 18:18</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[MirkoT]]></name></author>
<updated>2015-11-10T08:18:15+01:00</updated>
<published>2015-11-10T08:18:15+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=13502&amp;p=144959#p144959</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=13502&amp;p=144959#p144959"/>
<title type="html"><![CDATA[Re: Projekt minutnika]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=13502&amp;p=144959#p144959"><![CDATA[
owszem tu jest.<br />Ale na początku funkcji minutnik nie masz <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";-)" title="Puszcza oko" /><br />A tam przecież też dekrementujesz zmienną min, prawda?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=189">MirkoT</a> — 10 lis 2015, o 08:18</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Krystek]]></name></author>
<updated>2015-11-09T23:32:10+01:00</updated>
<published>2015-11-09T23:32:10+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=13502&amp;p=144953#p144953</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=13502&amp;p=144953#p144953"/>
<title type="html"><![CDATA[Re: Projekt minutnika]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=13502&amp;p=144953#p144953"><![CDATA[
Wydaje mi się że w tym warunku jest wywoływana funkcja wyświetlania minut po każdej zmianie zmiennej min, chyba że źle rozumuję :<br /><br />[syntax=c]if (sekundy==1)<br />                                {<br />                                        min = min-1;<br />                                        wyswietl_minuty(min);<br />                                }[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1207">Krystek</a> — 9 lis 2015, o 23:32</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[MirkoT]]></name></author>
<updated>2015-11-09T15:31:19+01:00</updated>
<published>2015-11-09T15:31:19+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=13502&amp;p=144894#p144894</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=13502&amp;p=144894#p144894"/>
<title type="html"><![CDATA[Re: Projekt minutnika]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=13502&amp;p=144894#p144894"><![CDATA[
<div class="quotetitle">HomoChemicus napisał(a):</div><div class="quotecontent"><br />A próbowałeś użyć predekrementacji? Chodzi mi o &quot;--sekundy&quot;.<br /></div><br />To akurat nic nie pomoże ze względu na budowę funkcji odliczającej napisanej przez kolegę.<br /><br />Jeszcze raz trzeba przemyśleć algorytm. <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";-)" title="Puszcza oko" /><br />Trzeba po prostu wyświetlanie minut wywoływać po każdej zmianie zmiennej min <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=189">MirkoT</a> — 9 lis 2015, o 15:31</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[HomoChemicus]]></name></author>
<updated>2015-11-09T14:47:36+01:00</updated>
<published>2015-11-09T14:47:36+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=13502&amp;p=144890#p144890</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=13502&amp;p=144890#p144890"/>
<title type="html"><![CDATA[Re: Projekt minutnika]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=13502&amp;p=144890#p144890"><![CDATA[
A próbowałeś użyć predekrementacji? Chodzi mi o &quot;--sekundy&quot;.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=10470">HomoChemicus</a> — 9 lis 2015, o 14:47</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Krystek]]></name></author>
<updated>2015-11-09T12:29:56+01:00</updated>
<published>2015-11-09T12:29:56+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=13502&amp;p=144885#p144885</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=13502&amp;p=144885#p144885"/>
<title type="html"><![CDATA[Re: Projekt minutnika]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=13502&amp;p=144885#p144885"><![CDATA[
A takie pytanie: jak zrobić żeby zmienna którą przekazuję do funkcji była od razu pomniejszona o jeden ?  Wybieram liczbę minut załóżmy 13 naciskam przycisk start, program przechodzi do wykonywania funkcji minutnik, ale zlicza od 13:59 zamiast 12:59 . Próbowałem zrobić to tak :<br /><br />[syntax=c]void minutnik (uint8_t min)<br />        {<br />                static uint8_t sekundy ;<br /><br />                min = min-1 ;<br /> <br />                while (1)<br />                {<br />                        for (sekundy=60;sekundy&gt;=1;sekundy=sekundy-1)<br />                        {<br />                                wyswietl_sekundy(sekundy-1);<br />                                _delay_ms(100);<br /> <br />                                if (sekundy==1)<br />                                {<br />                                        min = min-1;<br />                                        wyswietl_minuty(min);<br />                                }<br />                        }<br />                }<br />        }[/syntax]<br /><br />i w pętli głównej main : <br /><br />[syntax=c]int main (void)<br />{<br />//************************INICJALIZACJA*********************<br /><br />d_led_init(); // inicjalizacja wywietlacza<br /><br />sei(); // włączenie globalnego zezwolenia na przerwania<br /><br />KEYS &amp;= ~( KEY1_PIN | KEY2_PIN | KEY3_PIN); //kierunek pinu PB2- wejsciowy<br />KEY_PORT |= (KEY1_PIN | KEY2_PIN | KEY3_PIN); //podciągnięcie pinu do VCC (wewnętrzny rezystor)<br />BUZ_DIR; // ustawienie wyjścia na buzzer<br /><br />migaj_wyswietlaczem();<br /><br />uint8_t min=0;<br /><br />min = ustaw_czas();<br /><br />        min = min - 1 ;<br /><br />minutnik(min);<br /><br />while (1)<br />{<br /><br />}<br />}[/syntax]<br /><br />W obu przypadkach zmienna minuty zmniejsza się o jeden dopiero wtedy jak wykona się instrukcja for, a przecież przed funkcją for zmniejszam tą zmienną.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1207">Krystek</a> — 9 lis 2015, o 12:29</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Krystek]]></name></author>
<updated>2015-11-08T14:52:53+01:00</updated>
<published>2015-11-08T14:52:53+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=13502&amp;p=144804#p144804</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=13502&amp;p=144804#p144804"/>
<title type="html"><![CDATA[Re: Projekt minutnika]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=13502&amp;p=144804#p144804"><![CDATA[
Dzięki MirkoT <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /> Dzięki Twoim wskazówkom udało mi się rozwiązać ten problem, funkcje ładnie działają. Dużo mi pomógł symulator Atmel Studio. We funkcji ustaw_czas dodałem obsługę przycisku start/stop, i dzięki sprawdzeniu warunku funkcja poprawnie zwraca ustawioną wartość <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><br /><br />Tak wygląda teraz kod :<br /><br />main.c: <br /><br />[syntax=c]/*<br /> * main.c<br /> *<br /> *  Created on: 7 lis 2015<br /> *      Author: Krystek<br /> */<br /><br /><br /><br />#include &lt;avr/io.h&gt;<br />#include &lt;avr/interrupt.h&gt;<br />#include &lt;util/delay.h&gt;<br /><br /><br />#include &quot;def.h&quot;<br /><br /><br />int main (void)<br />{<br />//************************INICJALIZACJA*********************<br /><br />d_led_init(); // inicjalizacja wywietlacza<br /><br />sei(); // włączenie globalnego zezwolenia na przerwania<br /><br />KEYS &amp;= ~( KEY1_PIN | KEY2_PIN | KEY3_PIN); //kierunek pinu PB2- wejsciowy<br />KEY_PORT |= (KEY1_PIN | KEY2_PIN | KEY3_PIN); //podciągnięcie pinu do VCC (wewnętrzny rezystor)<br />BUZ_DIR; // ustawienie wyjścia na buzzer<br /><br />migaj_wyswietlaczem();<br /><br />uint8_t min=0;<br /><br />min = ustaw_czas();<br /><br />minutnik(min);<br /><br />while (1)<br />{<br /><br />}<br />}[/syntax]<br /><br />funkcje.c <br /><br />[syntax=c]void minutnik (uint8_t min)<br />{<br />static uint8_t sekundy ;<br /><br />while (1)<br />{<br />for (sekundy=60;sekundy&gt;=1;sekundy=sekundy-1)<br />{<br />wyswietl_sekundy(sekundy-1);<br />_delay_ms(100);<br /><br />if (sekundy==1)<br />{<br />min = min-1;<br />wyswietl_minuty(min);<br />}<br />}<br />}<br />}<br /><br /><br />uint8_t ustaw_czas (void)<br />{<br /> static uint8_t minuty;<br /><br /> uint8_t wyjscie=0;<br /><br />//Zapalenie zer i kropki<br /><br />cy1=cyfry&#91;0&#93;;<br />cy2=cyfry&#91;0&#93;;<br />cy3=cyfry&#91;0&#93; | cyfry&#91;19&#93;;<br />cy4=cyfry&#91;0&#93;;<br /><br />while (1)<br />{<br />if (KEY1_ON)<br />{<br />minuty=minuty+1;<br />wyswietl_minuty(minuty);<br />_delay_ms(100);<br /><br />if (minuty&gt;=59) // jeśli minuty przekroczą 59 ustaw spowrotem na 0<br />{<br />minuty = 0 ;<br />}<br />}<br /><br />else if (KEY2_ON)<br />{<br />minuty=minuty-1;<br />wyswietl_minuty(minuty);<br />_delay_ms(100);<br /><br />if (minuty&lt;=0) // jeśli minuty przekroczą 0 ustaw na 59<br />{<br />minuty = 59;<br />}<br />}<br /><br />if (KEY3_ON)<br />{<br />wyjscie = minuty;<br /><br />return wyjscie;<br />}<br />}<br />}[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1207">Krystek</a> — 8 lis 2015, o 14:52</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[MirkoT]]></name></author>
<updated>2015-11-08T12:21:53+01:00</updated>
<published>2015-11-08T12:21:53+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=13502&amp;p=144777#p144777</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=13502&amp;p=144777#p144777"/>
<title type="html"><![CDATA[Re: Projekt minutnika]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=13502&amp;p=144777#p144777"><![CDATA[
Tak w ogóle to powinieneś zastanowić się jak właściwie ma działać Twój program.<br />I porównać to z tym jak działa w tej chwili.<br />Musisz pamiętać o tym, że procesor jest bardzo szybki <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";-)" title="Puszcza oko" /><br />Wybieranie czasu minutnika nie działało i nadal nie działa.<br />a Tobie tylko się wydawało, że coś ustawiasz.<br />Na początku programu wywołujesz funkcję do ustawiania minut, ale...<br />musiałbyś już mieć w tym momencie wciśnięty przycisk, żeby cokolwiek się stało.<br />Nim zdążysz go wcisnąć program już z powrotem jest w głównym &quot;nurcie&quot; i odpoczywa<br />sobie aż minie delay.<br />Kolejny problem to funkcji odliczania do zera.<br />Jak wrzuciłeś do głównej pętli to jasne jest, że za każdym razem niezależnie jaki parametr<br />prześlesz będzie liczył tylko te &quot;sekundy&quot;.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=189">MirkoT</a> — 8 lis 2015, o 12:21</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Krystek]]></name></author>
<updated>2015-11-08T11:51:16+01:00</updated>
<published>2015-11-08T11:51:16+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=13502&amp;p=144773#p144773</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=13502&amp;p=144773#p144773"/>
<title type="html"><![CDATA[Re: Projekt minutnika]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=13502&amp;p=144773#p144773"><![CDATA[
Wrzuciłem funkcję minutnik do maina, lecz teraz nie działa wybieranie minut, a sam minutnik zlicza tylko sekundy. Nie wiem, moze coś źle z funkcjami robię ?<br /><br />[syntax=c]int main (void)<br />{<br />//************************INICJALIZACJA*********************<br /><br />d_led_init(); // inicjalizacja wywietlacza<br /><br />sei(); // włączenie globalnego zezwolenia na przerwania<br /><br />KEYS &amp;= ~( KEY1_PIN | KEY2_PIN ); //kierunek pinu PB2- wejsciowy<br />KEY_PORT |= (KEY1_PIN | KEY2_PIN); //podciągnięcie pinu do VCC (wewnętrzny rezystor)<br />BUZ_DIR; // ustawienie wyjścia na buzzer<br /><br />migaj_wyswietlaczem();<br /><br />uint8_t min;<br /><br />min = ustaw_czas();<br /><br />_delay_ms(5000);   // Przerwa na wprowadzenie danych<br /><br />while (1)<br />{<br />minutnik(min);<br />}<br />}[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1207">Krystek</a> — 8 lis 2015, o 11:51</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Rafał555]]></name></author>
<updated>2015-11-08T10:45:42+01:00</updated>
<published>2015-11-08T10:45:42+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=13502&amp;p=144768#p144768</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=13502&amp;p=144768#p144768"/>
<title type="html"><![CDATA[Re: Projekt minutnika]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=13502&amp;p=144768#p144768"><![CDATA[
Mam na myśli wywoływanie funkcji. Na początek chociaż samą funkcję <strong>minutnik();</strong> wrzuć do while(1) w pliku main.c.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=2697">Rafał555</a> — 8 lis 2015, o 10:45</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Krystek]]></name></author>
<updated>2015-11-08T10:28:15+01:00</updated>
<published>2015-11-08T10:28:15+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=13502&amp;p=144765#p144765</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=13502&amp;p=144765#p144765"/>
<title type="html"><![CDATA[Re: Projekt minutnika]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=13502&amp;p=144765#p144765"><![CDATA[
Chodzi o deklaracje ? Bo jeśli tak to sa one w pliku def.h<br /><br />[syntax=c]/*<br /> * def.h<br /> *<br /> *  Created on: 7 lis 2015<br /> *      Author: Krystek<br /> */<br /><br />#ifndef DEF_H_<br />#define DEF_H_<br /><br /><br />#define LED_DATA      PORTD<br />#define LED_DATA_DIR  DDRD<br />#define KATODY_PORT   PORTC<br />#define KATODY_DIR    DDRC<br /><br />#define KEYS           DDRB<br />#define KEY_PORT       PORTB<br />#define KEY1_PIN       (1&lt;&lt;PB2)<br />#define KEY1_ON        !(PINB &amp; KEY1_PIN)<br />#define KEY2_PIN       (1&lt;&lt;PB3)<br />#define KEY2_ON        !(PINB &amp; KEY2_PIN)<br /><br />#define BUZ_PIN        (1&lt;&lt;PB5)<br />#define BUZ_DIR        DDRB  |= BUZ_PIN<br />#define BUZ_ON         PORTB |= BUZ_PIN<br />#define BUZ_OFF        PORTB &amp;= ~BUZ_PIN<br />#define BUZ_TOG        PORTB ^= BUZ_PIN<br /><br /><br />#define CA1           (1&lt;&lt;PC3)<br />#define CA2           (1&lt;&lt;PC2)<br />#define CA3           (1&lt;&lt;PC1)<br />#define CA4           (1&lt;&lt;PC0)<br /><br />/* Same DEKLARACJE zmiennych globalnych na potrzeby wykorzystania<br /> * ich w innych plikach projektu<br /> * przydomek extern powoduje , ze te zmienne będą dostępne we<br /> * wszystkich modułach, które dołączą plik d_led.h za pomocą dyrektywy #include<br /> */<br /><br />extern volatile uint8_t cy1;<br />extern volatile uint8_t cy2;<br />extern volatile uint8_t cy3;<br />extern volatile uint8_t cy4;<br /><br />// obszar deklaracji funkcji udostępnionych dla innych modułów<br /><br />void d_led_init(void);<br />void odliczanie(void);<br />void wyswietl_sekundy (uint8_t);<br />void wyswietl_minuty (uint8_t);<br />void zapal_kropke (void);<br />void stoper (void);<br />void minutnik (uint8_t);<br />void migaj_wyswietlaczem (void);<br />uint8_t ustaw_czas (void);<br /><br />#endif /* DEF_H_ */[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1207">Krystek</a> — 8 lis 2015, o 10:28</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Rafał555]]></name></author>
<updated>2015-11-08T10:07:47+01:00</updated>
<published>2015-11-08T10:07:47+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=13502&amp;p=144764#p144764</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=13502&amp;p=144764#p144764"/>
<title type="html"><![CDATA[Re: Projekt minutnika]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=13502&amp;p=144764#p144764"><![CDATA[
<img src="https://forum.atnel.pl/images/smilies/icon_eek.gif" alt=":shock:" title="Zaszokowany" /> <br /> Może wyprowadź wywołania tych funkcji do pętli głównej w main.c.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=2697">Rafał555</a> — 8 lis 2015, o 10:07</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Krystek]]></name></author>
<updated>2015-11-08T09:53:54+01:00</updated>
<published>2015-11-08T09:53:54+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=13502&amp;p=144761#p144761</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=13502&amp;p=144761#p144761"/>
<title type="html"><![CDATA[Projekt minutnika]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=13502&amp;p=144761#p144761"><![CDATA[
Tworzę sobie minutnik w celach edukacyjnych, lecz napotkałem pewien problem którego jakoś nie potrafię przeskoczyć. <br /><br />1. Napisałem sobie funkcję która jest odpowiedzialna za wybieranie liczby minut i koncepcja jest taka, aby po wybraniu tej liczby przekazać ją do funkcji minutnik, która już zlicza do zera. Jednak program zatrzymuje się na wybieraniu liczb i dalej nie rusza (delaya dałem po to aby był czas na wprowadzenie danych - tymczasowo zamiast przycisku start). <br />2. Jeśli wywołam funkcję minuty ale wpiszę np tak minuty(15); to owszem ta liczba zostaje przekazana do funkcji minuty, ale nie zmniejsza się . Doradźcie coś bo już nie mam pomysłu.<br /><br />main.c<br /><br />[syntax=c]/*<br /> * main.c<br /> *<br /> *  Created on: 7 lis 2015<br /> *      Author: Krystek<br /> */<br /><br /><br /><br />#include &lt;avr/io.h&gt;<br />#include &lt;avr/interrupt.h&gt;<br />#include &lt;util/delay.h&gt;<br /><br /><br />#include &quot;def.h&quot;<br /><br /><br />int main (void)<br />{<br />//************************INICJALIZACJA*********************<br /><br />d_led_init(); // inicjalizacja wywietlacza<br /><br />sei(); // włączenie globalnego zezwolenia na przerwania<br /><br />KEYS &amp;= ~( KEY1_PIN | KEY2_PIN ); //kierunek pinu PB2- wejsciowy<br />KEY_PORT |= (KEY1_PIN | KEY2_PIN); //podciągnięcie pinu do VCC (wewnętrzny rezystor)<br />BUZ_DIR; // ustawienie wyjścia na buzzer<br /><br />migaj_wyswietlaczem();<br /><br />uint8_t min;<br /><br />min = ustaw_czas();<br /><br />_delay_ms(5000);   // Przerwa na wprowadzenie danych <br /><br />minutnik(min);<br /><br /><br />while (1)<br />{<br /><br /><br />}<br />}[/syntax] <br /><br />funkcje.c <br /><br />[syntax=c]/*<br /> * funkcje.c<br /> *<br /> *  Created on: 7 lis 2015<br /> *      Author: Krystek<br /> */<br /><br /><br /><br />#include &lt;avr/io.h&gt;<br />#include &lt;avr/interrupt.h&gt;<br />#include &lt;util/delay.h&gt;<br /><br />#include &quot;def.h&quot;<br />#include &quot;wys_7_seg.h&quot;<br /><br /><br />/* Definicje zmiennych globalnych przechowywujących cyfry do wywietlenia<br /> * volatile - ponieważ będą wykorzystywane do odczytu i zapisu zarówno<br /> * w przerwaniu i programie głównym. Trzeba więc wyłączyć optymalizację<br /> * dostępu do nich . (Zmienne ulotne)<br /> */<br /><br />volatile uint8_t cy1;<br />volatile uint8_t cy2;<br />volatile uint8_t cy3;<br />volatile uint8_t cy4;<br /><br /><br />//************Definicja funkcji inicjalizującej pracę z wywietlaczem multipleksowanym*******************<br /><br />void d_led_init(void)<br />{<br />LED_DATA_DIR = 0xFF ; // Wszystkie piny portu D jako WYJŚCIA<br />LED_DATA = 0x00 ;     // Wygaszenie wszystkich segmentów - STAN NISKI<br /><br />// 4 PINY PORTU C JAKO WYJŚCIA<br /><br />KATODY_DIR |= CA1 | CA2 | CA3 | CA4 ;<br /><br />// Wygaszenie wszystkich wywietlaczy - KATODY<br /><br />KATODY_PORT |= CA1 | CA2 | CA3 | CA4 ;<br /><br /><br /><br />// USTAWIENIA TIMERA 2<br /><br />TCCR2 |= (1&lt;&lt;WGM21);  // Tryb CTC<br />TCCR2 |= (1&lt;&lt;CS20) | (1&lt;&lt;CS21) | (1&lt;&lt;CS22) ; // Preskaler = 1024<br />OCR2 =3 ;<br />TIMSK |= (1&lt;&lt;OCIE2); //zezwolenie na przerwanie COMPARE MATCH<br />}<br /><br /><br />// =================== PROCEDURA OBSŁUGI PRZERWANIA  - COMPARE MATCH ========================================<br /><br /><br />ISR (TIMER2_COMP_vect)<br />{<br />//zmienna do przełaczania kolejno katod wywietlacza<br /><br />static uint8_t licznik=1;<br /><br />//cykliczne przełączanie w każdym przerwaniu katod każdego wywietlacza<br /><br />KATODY_PORT = licznik ;<br /><br />// gdy zapalony wysw.1 podaj stan zmiennej cy1<br />if (licznik==1) LED_DATA = cy1;<br />// gdy zapalony wysw.2 podaj stan zmiennej cy2<br />else if (licznik==2) LED_DATA = cy2;<br />// gdy zapalony wysw.3 podaj stan zmiennej cy3<br />else if (licznik==4) LED_DATA = cy3;<br />// gdy zapalony wysw.4 podaj stan zmiennej cy4<br />else if (licznik==8) LED_DATA = cy4;<br /><br />//operacje cyklicznego przesuwania bitu zapalającego katody w zmiennej licznik<br /><br />licznik &lt;&lt;= 1; // przesunięcie zawartosci bitów licznika o 1 w lewo<br />if (licznik&gt;8) licznik = 1; // jesli licznik wiekszy niz 8 to ustaw na 1<br />}<br /><br />void wyswietl_sekundy (uint8_t liczba_s)<br />{<br />uint8_t jednosci,dziesiatki;<br /><br />jednosci = liczba_s%10;<br />dziesiatki =(liczba_s/10)%10;<br /><br />cy1 = cyfry&#91;jednosci&#93;;<br />cy2 = cyfry&#91;dziesiatki&#93;;<br /><br />}<br /><br />void wyswietl_minuty (uint8_t liczba_m)<br />{<br />uint8_t j,d;<br /><br />j = liczba_m%10;<br />d =(liczba_m/10)%10;<br /><br />cy3 = cyfry&#91;j&#93;|cyfry&#91;19&#93;;<br />cy4 = cyfry&#91;d&#93;;<br /><br />}<br /><br />void minutnik (uint8_t min)<br />{<br />uint8_t sekundy ;<br /><br />uint8_t temp;<br /><br />temp = min ;<br /><br /><br />for (sekundy=60;sekundy&gt;=1;sekundy=sekundy-1)<br />{<br />wyswietl_sekundy(sekundy-1);<br />_delay_ms(100);<br />}<br /><br />temp=temp-1;<br />wyswietl_minuty(temp);<br />}<br /><br />void migaj_wyswietlaczem(void)<br />{<br />static uint8_t i=0;<br /><br />for(i=0;i&lt;3;i++)<br />{<br />cy1=cy2=cy3=cy4 = cyfry&#91;8&#93; | cyfry&#91;19&#93; ;<br /><br />_delay_ms(250);<br /><br />cy1=cy2=cy3=cy4 = cyfry&#91;20&#93; ;<br /><br />_delay_ms(250);<br />}<br />}<br /><br />uint8_t ustaw_czas (void)<br />{<br /> uint8_t minuty;<br /><br />//Zapalenie zer i kropki<br /><br />cy1=cyfry&#91;0&#93;;<br />cy2=cyfry&#91;0&#93;;<br />cy3=cyfry&#91;0&#93; | cyfry&#91;19&#93;;<br />cy4=cyfry&#91;0&#93;;<br /><br />while (1)<br />{<br />if (KEY1_ON)<br />{<br />minuty=minuty+1;<br />wyswietl_minuty(minuty);<br />_delay_ms(100);<br /><br />if (minuty&gt;=59) // jeśli minuty przekroczą 59 ustaw spowrotem na 0<br />{<br />minuty = 0 ;<br />}<br />}<br /><br />else if (KEY2_ON)<br />{<br />minuty=minuty-1;<br />wyswietl_minuty(minuty);<br />_delay_ms(100);<br /><br />if (minuty&lt;=0) // jeśli minuty przekroczą 0 ustaw na 59<br />{<br />minuty = 59;<br />}<br />}<br /><br />return minuty;  // zwraca wartośc minut<br />}<br /><br /><br />}[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1207">Krystek</a> — 8 lis 2015, o 09:53</p><hr />
]]></content>
</entry>
</feed>