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

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2014-09-13T21:44:36+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=8&amp;t=8487&amp;mode</id>
<entry>
<author><name><![CDATA[grochal7]]></name></author>
<updated>2014-09-13T21:44:36+01:00</updated>
<published>2014-09-13T21:44:36+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=8487&amp;p=95363#p95363</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=8487&amp;p=95363#p95363"/>
<title type="html"><![CDATA[Re: Zegarek na wyświetlaczach ledowych - kwarc 32khz?]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=8487&amp;p=95363#p95363"><![CDATA[
W sumie dość proste. <br />Dzięki za pomoc <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /><br />Bez Twoich porad nie byłoby tego co jest w tej chwili <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=5293">grochal7</a> — 13 wrz 2014, o 21:44</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[jacekk232]]></name></author>
<updated>2014-09-13T21:33:55+01:00</updated>
<published>2014-09-13T21:33:55+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=8487&amp;p=95361#p95361</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=8487&amp;p=95361#p95361"/>
<title type="html"><![CDATA[Re: Zegarek na wyświetlaczach ledowych - kwarc 32khz?]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=8487&amp;p=95361#p95361"><![CDATA[
Dzieląc częstotliwość kwarcu równą 32768Hz przez preskaler o wartości 256 wychodzi nam, że otrzymaną częstotliwość musimy podzielić jeszcze przez 128 aby otrzymać 1Hz.<br />Licznik TCNT2 liczy od zera więc to zero również musimy wziąć pod uwagę przy określaniu wartości rejestru OCR2. Przerwanie od porównania ma nastąpić po 128 impulsach. Licząc od zera do 127 mamy właśnie te 128 impulsów.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=204">jacekk232</a> — 13 wrz 2014, o 21:33</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[grochal7]]></name></author>
<updated>2014-09-13T21:43:04+01:00</updated>
<published>2014-09-13T20:06:00+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=8487&amp;p=95353#p95353</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=8487&amp;p=95353#p95353"/>
<title type="html"><![CDATA[Re: Zegarek na wyświetlaczach ledowych - kwarc 32khz?]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=8487&amp;p=95353#p95353"><![CDATA[
Ok, wszystko pięknie działa <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /><br />Teraz będę powoli zajmować się obsługą klawiszy <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" />  <br /><br />Takie pytanie... Dlaczego w przypadku przerwania asynchronicznego...<br /> [syntax=c]OCR2 = 127;[/syntax] <br />a nie <br /> [syntax=c]OCR2 = 128;[/syntax] ????<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=5293">grochal7</a> — 13 wrz 2014, o 20:06</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[grochal7]]></name></author>
<updated>2014-09-13T17:52:33+01:00</updated>
<published>2014-09-13T17:52:33+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=8487&amp;p=95338#p95338</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=8487&amp;p=95338#p95338"/>
<title type="html"><![CDATA[Re: Zegarek na wyświetlaczach ledowych - kwarc 32khz?]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=8487&amp;p=95338#p95338"><![CDATA[
Co do przerwania od multipleksowania dziś w przerwie w pracy czytałem troszkę książkę typowo o AVRkach i właśnie podkreślono że lepiej zmniejszyć częstotliwość przerwań w multipleksowaniu, żeby odciążyc procesor - tak też zrobię <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /><br /><br />A co do czasu mojej &quot;sekundy&quot;...<br /><br />Zmierzyłem wartość napięcia jaka podawana jest na nóżki atmegi..<br />Użyłem atmegi8A której wartość napięca pracy waha się od 4,5 do 5,5V. A niestety na nóżki atmegi podawane jest tyko 3,58V <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /><br />Podejrzewam, że w tym właśnie problem. Sprawdzę to a rezultatem podzielę się niżej <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=5293">grochal7</a> — 13 wrz 2014, o 17:52</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[jacekk232]]></name></author>
<updated>2014-09-13T10:05:04+01:00</updated>
<published>2014-09-13T10:05:04+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=8487&amp;p=95312#p95312</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=8487&amp;p=95312#p95312"/>
<title type="html"><![CDATA[Re: Zegarek na wyświetlaczach ledowych - kwarc 32khz?]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=8487&amp;p=95312#p95312"><![CDATA[
W przerwaniu zamiast <br />[syntax=c]sekundy++;<br />if(sekundy &gt; 119)//119 bo przerwanie mam co pół sekundy.[/syntax]<br />zrób sobie tak<br />[syntax=c]ISR(TIMER2_COMP_vect)<br />{<br />static uint8_t half_sec;<br /><br />half_sec++;  //zmienna zwiększana co pół sekundy<br /><br />//jeśli reszta z dzielenia zmiennej half_sec przez dwa wynosi zero<br />//to zwiększ wartości sekund<br />//sekundy będą zwiększana jeśli zmienna half_sec będzia miała wartości<br />//0,2,4,6,8 itd czyli co dwa przerwania<br />if(0 == (half_sec%2))<br />{<br />sekundy++;<br />if(sekundy &gt; 59)<br />{<br />sekundy = 0;<br />minuty++;<br />if(minuty &gt; 59)<br />{<br />minuty = 0;<br />godziny++;<br />if(godziny &gt; 24) godziny = 0;<br />}<br />}<br />}<br /><br />}[/syntax]<br />Bo jeśli będziesz chciał wyświetlać zmienną sekundy na wyświetlaczu to będzie to troszkę bardziej skomplikowane. A tak zmienna sekundy nadal zmienia się w zakresie 0...59.<br /><br />Przerwanie do obsługi multipleksowania wywołuje się co ok 3kHz. Wydaje mi się, że to jest troszkę dużo i spokojnie można zmniejszyć częstotliwość odświeżania wyświetlacza do momentu aż migotanie nie zacznie być dokuczliwe.<br /><br />A program sprawdziłem na Atmedze32 i zmienna sekund ładnie zwiększa swą wartość co... sekundę <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":-)" title="Szczęśliwy" /> Zrobiłem tylko tą modyfikację w przerwaniu od Timera2 bo bez tego sekundy na wyświetlacza zwiększały mi się co pół sekundy.<br /><br />Sprawdź dokładnie wszystko jeszcze raz. A zwłaszcza ten kwarc zegarkowy i kondensatory przy nim.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=204">jacekk232</a> — 13 wrz 2014, o 10:05</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[grochal7]]></name></author>
<updated>2014-09-12T23:26:56+01:00</updated>
<published>2014-09-12T23:26:56+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=8487&amp;p=95286#p95286</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=8487&amp;p=95286#p95286"/>
<title type="html"><![CDATA[Re: Zegarek na wyświetlaczach ledowych - kwarc 32khz?]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=8487&amp;p=95286#p95286"><![CDATA[
Cenna uwaga <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /><br /><br />I masz rację. Aktualny czas jest dość ważny zwłaszcza jeśli chcę do mojego programu dorzucić jakieś inne funkcje niż sam zegar <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /><br />Tylko mam problem z tym, że jakbym tego nie zapisał to za każdym razem coś nie gra.<br /><br />A konkretniej wyświetlają mi się same zera.<br />Tak jakby przerwanie nie wpływało na wartość zmiennych sekundy, minuty i godziny.<br /><br />Kod w tej chwili wygląda tak:<br /><br />[syntax=c]#include &lt;avr/io.h&gt;<br />#include &lt;avr/interrupt.h&gt; //obsluga przerwan<br />#include &lt;avr/pgmspace.h&gt;<br />#include &lt;util/delay.h&gt;<br />#include &lt;avr/eeprom.h&gt;<br /><br />#include &quot;wyswietlacz.h&quot; //dolaczenie pliku nagłówkowego<br />#include &quot;4_diody.h&quot;<br />#include &quot;przyciski.h&quot;<br /><br />volatile uint8_t cyfra_wyswietlacza1;<br />volatile uint8_t cyfra_wyswietlacza2;<br />volatile uint8_t cyfra_wyswietlacza3;<br />volatile uint8_t cyfra_wyswietlacza4;<br />volatile uint8_t cyfra_wyswietlacza5;<br />volatile uint8_t cyfra_wyswietlacza6;<br /><br />volatile uint8_t sekundy;<br />volatile uint8_t minuty;<br />volatile uint8_t godziny;<br /><br /><br /><br />//definicja tablic zawierajacej bitowe cyfry LED<br />uint8_t cyfry&#91;15&#93; PROGMEM = {<br />~(SEG_A|SEG_B|SEG_C|SEG_D|SEG_E|SEG_F),// 0<br />~(SEG_B|SEG_C),// 1<br />~(SEG_A|SEG_B|SEG_D|SEG_E|SEG_G),// 2<br />~(SEG_A|SEG_B|SEG_C|SEG_D|SEG_G),// 3<br />~(SEG_B|SEG_C|SEG_F|SEG_G),// 4<br />~(SEG_A|SEG_C|SEG_D|SEG_F|SEG_G),// 5<br />~(SEG_A|SEG_C|SEG_D|SEG_E|SEG_F|SEG_G),// 6<br />~(SEG_A|SEG_B|SEG_C|SEG_F),// 7<br />~(SEG_A|SEG_B|SEG_C|SEG_D|SEG_E|SEG_F|SEG_G),// 8<br />~(SEG_A|SEG_B|SEG_C|SEG_D|SEG_F|SEG_G),// 9<br />0xFF,// NIC (puste miejsce)<br />0x00//BOOM<br />};<br /><br />//**********  funkcja inicjalizujaca prace z wyswietlaczem multipleksowym    *************<br />void inicjalizacja_wyswietlacza(void)<br />{<br />LED_KIERUNEK = 0xFF; //piny portu D jako wyjscia<br />LED_PORT = 0xFF; //wygaszenie wszystkich katod -stan wysoki<br />//2 piny portu c jako wyjscia (anody)<br />ANODY_KIERUNEK |= PORT_WYSWIETLACZA_1 | PORT_WYSWIETLACZA_2 | PORT_WYSWIETLACZA_3 | PORT_WYSWIETLACZA_4  | PORT_WYSWIETLACZA_5 | PORT_WYSWIETLACZA_6;<br />//wygaszenie wszystkich wyswietlaczy<br />ANODY_PORT |= PORT_WYSWIETLACZA_1 | PORT_WYSWIETLACZA_2 | PORT_WYSWIETLACZA_3 | PORT_WYSWIETLACZA_4  | PORT_WYSWIETLACZA_5 | PORT_WYSWIETLACZA_6;<br /><br /><br />//ustawienie timera2<br />//przerwanie chce co 0.5 sek<br />ASSR |= (1&lt;&lt;AS2);<br />TCCR2 |= (1&lt;&lt;WGM21);//tryb ctc<br />//ustawienie preskalera<br />TCCR2 |=(1&lt;&lt;CS20)|(1&lt;&lt;CS22); //preskaler 128<br />OCR2 =127;//podział przez 52 (rejestr porównania)<br />TIMSK |=(1&lt;&lt;OCIE2); //zezwolenie na przerwanie compare match<br /><br /><br />//przerwanie dla timer 2 to ISR(TIMER2_COMP_vect){}<br /><br />//ustawienie timera 1<br /> TCCR1B |= (1 &lt;&lt; WGM12); // Ustawia timer1 w tryb CTC<br /> OCR1A = 300; // Ustawia wartość pożądaną na 200Hz dla preskalera 1<br /> TCCR1B |= (1 &lt;&lt; CS11); // Ustawia timer z preskalerem Fcpu/8<br /> TIMSK |= (1 &lt;&lt; OCIE1A); // Zezwolenie na przerwania dla CTC<br />//// przerwanie dla timer1 to ISR(TIMER1_COMPA_vect){}<br /><br /><br />}<br /><br />//procedury obslugi przerwań<br /><br />//przerwanie do odmierzania czasu<br /><br />ISR(TIMER2_COMP_vect)<br />{<br />        sekundy++;<br />        if(sekundy &gt; 119)//119 bo przerwanie mam co pół sekundy.<br />        {<br />                sekundy = 0;<br />                minuty++;<br />                if(minuty &gt; 59)<br />                {<br />                        minuty = 0;<br />                        godziny++;<br />                        if(godziny &gt; 24) godziny = 0;<br />                }<br />        }<br /><br />}<br /><br /><br />//przerwanie obsługujące multipleksowanie wywietlaczy<br />ISR(TIMER1_COMPA_vect)<br />{<br />//zmienna do przelaczania kolejno anod wyswietacza<br />static uint8_t licznik=PORT_WYSWIETLACZA_1;//dzieki static zmienna jest tworzona jako 1 tylko przy starcie programu. potem przyjmuje wartosci po zmianach.<br />//cykliczne przelaczanie w kazdym przerwaniu<br />//anod każdego wyswietlacza (wartosc jest negowana aby krazylo zero)<br /><br />ANODY_PORT = (ANODY_PORT &amp; 0xC0) | (~licznik &amp; 0x3F);// w pierwszym 0xF0 w drugim 0x0F dla 2 wyswietlaczy podwojnych (łatwo ogarnąć czemu co i jak)<br /><br />     if(licznik==PORT_WYSWIETLACZA_1) LED_PORT = pgm_read_byte(&amp;cyfry&#91;cyfra_wyswietlacza1&#93;);//gdy zapalony wyswietlacz 2 podaj stan zmiennej c1<br />else if(licznik==PORT_WYSWIETLACZA_2) LED_PORT = pgm_read_byte(&amp;cyfry&#91;cyfra_wyswietlacza2&#93;);//gdy zapalony wyswietlacz 2 podaj stan zmiennej c2<br />else if(licznik==PORT_WYSWIETLACZA_3) LED_PORT = pgm_read_byte(&amp;cyfry&#91;cyfra_wyswietlacza3&#93;);//gdy zapalony wyswietlacz 2 podaj stan zmiennej c3<br />else if(licznik==PORT_WYSWIETLACZA_4) LED_PORT = pgm_read_byte(&amp;cyfry&#91;cyfra_wyswietlacza4&#93;);//gdy zapalony wyswietlacz 2 podaj stan zmiennej c4<br />else if(licznik==PORT_WYSWIETLACZA_5) LED_PORT = pgm_read_byte(&amp;cyfry&#91;cyfra_wyswietlacza5&#93;);//gdy zapalony wyswietlacz 2 podaj stan zmiennej c5<br />else if(licznik==PORT_WYSWIETLACZA_6) LED_PORT = pgm_read_byte(&amp;cyfry&#91;cyfra_wyswietlacza6&#93;);//gdy zapalony wyswietlacz 2 podaj stan zmiennej c6<br /><br />//operacje cyklicznego przesuwania bitu zapalajacego anody w zmiennej licznik<br /><br />licznik &lt;&lt;= 1; //przesuniecie zawartosci bitow licznika o 1 w lewo<br />if(licznik&gt;PORT_WYSWIETLACZA_6) licznik =PORT_WYSWIETLACZA_1;//jesli licznik wiekszy od 2 to ustaw na 1<br /><br />}<br /><br />void czyszczenie_wyswietlacza(void){<br />cyfra_wyswietlacza1=NIC;<br />cyfra_wyswietlacza2=NIC;<br />cyfra_wyswietlacza3=NIC;<br />cyfra_wyswietlacza4=NIC;<br />cyfra_wyswietlacza5=NIC;<br />cyfra_wyswietlacza6=NIC;<br />}<br /><br /><br />void zegar(void){<br /><br /><br />cyfra_wyswietlacza6=sekundy%10;<br />cyfra_wyswietlacza5=sekundy/10;<br />cyfra_wyswietlacza4=minuty%10;<br />cyfra_wyswietlacza3=minuty/10;<br />cyfra_wyswietlacza2=godziny%10;<br />cyfra_wyswietlacza1=godziny/10;<br />}[/syntax]<br /><br />Trochę sporo już zawracam Ci głowę tym swoim programem. To mój pierwszy projekt i zależy mi żeby fajnie wszystko działało <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /><br /><br />Edit. przerwanie wpływa na wartość zmiennych sekundy minuty i godziny jednak sekunda niestety nie trwa sekundę tylko hm... Około 15 sekund.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=5293">grochal7</a> — 12 wrz 2014, o 23:26</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[jacekk232]]></name></author>
<updated>2014-09-12T22:25:11+01:00</updated>
<published>2014-09-12T22:25:11+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=8487&amp;p=95280#p95280</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=8487&amp;p=95280#p95280"/>
<title type="html"><![CDATA[Re: Zegarek na wyświetlaczach ledowych - kwarc 32khz?]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=8487&amp;p=95280#p95280"><![CDATA[
Nie stosuj takich warunków [syntax=c]if(s==60)[/syntax]<br />Bo co się stanie jeśli zmienna s będzie równa 59 i program, z różnych przyczyn, przez dłuższy czas nie sprawdzi tego warunku. A zmienna w tym czasie osiągnie wartość 61. Jeśli będzie to zmienna uint8_t to warunek się spełni za jakieś 256 sekund. Bo zmienna doliczy do 255 a potem od 0 do 60.<br />Takie warunki lepiej napisać tak<br />[syntax=c]if(s &gt;= 60)<br />//albo<br />if(s &gt; 59)[/syntax]<br /><br /><br />Ja osobiście aktualizowanie zmiennych sekund, minut i godzin zrobił bym w przerwaniu. Bo nawet jak pętla główna będzie bardzo zajęta przez dłuższy czas to przerwanie jednak się będzie wykonywać i te zmienne wciąż będą aktualne. Nawet jak byś wstrzymał pętlę główną na kilka minut to czas nadal będzie aktualny. Może z tym wstrzymaniem pętli głównej trochę przesadziłem, ale miało to zobrazować dlaczego wg mnie te zmienne aktualizować w przerwaniu. <br /><br />Piszesz, ze chcesz zmiennej s użyć do jakiegoś Timera. Domyślam się, że chodzi o timery programowe. A co szkodzi utworzyć jeszcze jedną zmienną i ją inkrementować w przerwaniu. Zegarek na dokładności raczej nie straci. Zegara atomowego z niego i tak nie zrobisz <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=204">jacekk232</a> — 12 wrz 2014, o 22:25</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[grochal7]]></name></author>
<updated>2014-09-12T20:10:17+01:00</updated>
<published>2014-09-12T20:10:17+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=8487&amp;p=95265#p95265</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=8487&amp;p=95265#p95265"/>
<title type="html"><![CDATA[Re: Zegarek na wyświetlaczach ledowych - kwarc 32khz?]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=8487&amp;p=95265#p95265"><![CDATA[
No i bawię się z tym przerwaniem. <br />Zrobiłem tak jak mówiłeś, jedno przerwanie dla multipleksowania a drugie.. no tu znów problem.<br />Nie lepiej byłoby użyć np<br />[syntax=c]ISR(TIMER2_COMP_vect)<br />{<br />s++;<br />}[/syntax]<br /><br /> żeby przerwanie zwiększało tylko ilość sekund? A dalsze sprawdzanie ilości godzin i minut zrobić w funkcji zegarek();?? W ten sposób mógłbym użyć tych sekund także np do Timera (którym mam zamiar się zająć jak już uporam się z samym zegarkiem ;p ) tylko czy to nie wpłynęłoby na dokładność mojej sekundy?<br /><br />reszta kodu:<br />[syntax=c]#include &lt;avr/io.h&gt;<br />#include &lt;avr/interrupt.h&gt; //obsluga przerwan<br />#include &lt;avr/pgmspace.h&gt;<br />#include &lt;util/delay.h&gt;<br />#include &lt;avr/eeprom.h&gt;<br /><br />#include &quot;wyswietlacz.h&quot; //dolaczenie pliku nagłówkowego<br />#include &quot;4_diody.h&quot;<br />#include &quot;przyciski.h&quot;<br /><br />volatile uint8_t cyfra_wyswietlacza1;<br />volatile uint8_t cyfra_wyswietlacza2;<br />volatile uint8_t cyfra_wyswietlacza3;<br />volatile uint8_t cyfra_wyswietlacza4;<br />volatile uint8_t cyfra_wyswietlacza5;<br />volatile uint8_t cyfra_wyswietlacza6;<br /><br />volatile uint8_t s;<br /><br /><br /><br /><br /><br /><br /><br />//definicja tablic zawierajacej bitowe cyfry LED<br />uint8_t cyfry&#91;15&#93; PROGMEM = {<br />~(SEG_A|SEG_B|SEG_C|SEG_D|SEG_E|SEG_F),// 0<br />~(SEG_B|SEG_C),// 1<br />~(SEG_A|SEG_B|SEG_D|SEG_E|SEG_G),// 2<br />~(SEG_A|SEG_B|SEG_C|SEG_D|SEG_G),// 3<br />~(SEG_B|SEG_C|SEG_F|SEG_G),// 4<br />~(SEG_A|SEG_C|SEG_D|SEG_F|SEG_G),// 5<br />~(SEG_A|SEG_C|SEG_D|SEG_E|SEG_F|SEG_G),// 6<br />~(SEG_A|SEG_B|SEG_C|SEG_F),// 7<br />~(SEG_A|SEG_B|SEG_C|SEG_D|SEG_E|SEG_F|SEG_G),// 8<br />~(SEG_A|SEG_B|SEG_C|SEG_D|SEG_F|SEG_G),// 9<br />0xFF,// NIC (puste miejsce)<br />0x00//BOOM<br />};<br /><br />//**********  funkcja inicjalizujaca prace z wyswietlaczem multipleksowym    *************<br />void inicjalizacja_wyswietlacza(void)<br />{<br />LED_KIERUNEK = 0xFF; //piny portu D jako wyjscia<br />LED_PORT = 0xFF; //wygaszenie wszystkich katod -stan wysoki<br />//2 piny portu c jako wyjscia (anody)<br />ANODY_KIERUNEK |= PORT_WYSWIETLACZA_1 | PORT_WYSWIETLACZA_2 | PORT_WYSWIETLACZA_3 | PORT_WYSWIETLACZA_4  | PORT_WYSWIETLACZA_5 | PORT_WYSWIETLACZA_6;<br />//wygaszenie wszystkich wyswietlaczy<br />ANODY_PORT |= PORT_WYSWIETLACZA_1 | PORT_WYSWIETLACZA_2 | PORT_WYSWIETLACZA_3 | PORT_WYSWIETLACZA_4  | PORT_WYSWIETLACZA_5 | PORT_WYSWIETLACZA_6;<br /><br /><br />//ustawienie timera2<br />ASSR |= (1&lt;&lt;AS2);<br />TCCR2 |= (1&lt;&lt;WGM21);//tryb ctc<br />//ustawienie preskalera<br />TCCR2 |=(1&lt;&lt;CS21)|(1&lt;&lt;CS22); //preskaler 256<br />OCR2 =127;//podział przez 52 (rejestr porównania)<br />TIMSK |=(1&lt;&lt;OCIE2); //zezwolenie na przerwanie compare match<br /><br /><br />//przerwanie dla timer 2 to ISR(TIMER2_COMP_vect){}<br /><br />//ustawienie timera 1<br /> TCCR1B |= (1 &lt;&lt; WGM12); // Ustawia timer1 w tryb CTC<br /> OCR1A = 300; // Ustawia wartość pożądaną na 200Hz dla preskalera 1<br /> TCCR1B |= (1 &lt;&lt; CS11); // Ustawia timer z preskalerem Fcpu/8<br /> TIMSK |= (1 &lt;&lt; OCIE1A); // Zezwolenie na przerwania dla CTC<br />//// przerwanie dla timer1 to ISR(TIMER1_COMPA_vect){}<br /><br /><br />}<br /><br />//procedury obslugi przerwań<br /><br />//przerwanie do odmierzania czasu<br />ISR(TIMER2_COMP_vect)<br />{<br />s++;<br />}<br /><br />//przerwanie obsługujące multipleksowanie wywietlaczy<br />ISR(TIMER1_COMPA_vect)<br />{<br />//zmienna do przelaczania kolejno anod wyswietacza<br />static uint8_t licznik=PORT_WYSWIETLACZA_1;//dzieki static zmienna jest tworzona jako 1 tylko przy starcie programu. potem przyjmuje wartosci po zmianach.<br />//cykliczne przelaczanie w kazdym przerwaniu<br />//anod każdego wyswietlacza (wartosc jest negowana aby krazylo zero)<br /><br />ANODY_PORT = (ANODY_PORT &amp; 0xC0) | (~licznik &amp; 0x3F);// w pierwszym 0xF0 w drugim 0x0F dla 2 wyswietlaczy podwojnych (łatwo ogarnąć czemu co i jak)<br /><br />     if(licznik==PORT_WYSWIETLACZA_1) LED_PORT = pgm_read_byte(&amp;cyfry&#91;cyfra_wyswietlacza1&#93;);//gdy zapalony wyswietlacz 2 podaj stan zmiennej c1<br />else if(licznik==PORT_WYSWIETLACZA_2) LED_PORT = pgm_read_byte(&amp;cyfry&#91;cyfra_wyswietlacza2&#93;);//gdy zapalony wyswietlacz 2 podaj stan zmiennej c2<br />else if(licznik==PORT_WYSWIETLACZA_3) LED_PORT = pgm_read_byte(&amp;cyfry&#91;cyfra_wyswietlacza3&#93;);//gdy zapalony wyswietlacz 2 podaj stan zmiennej c3<br />else if(licznik==PORT_WYSWIETLACZA_4) LED_PORT = pgm_read_byte(&amp;cyfry&#91;cyfra_wyswietlacza4&#93;);//gdy zapalony wyswietlacz 2 podaj stan zmiennej c4<br />else if(licznik==PORT_WYSWIETLACZA_5) LED_PORT = pgm_read_byte(&amp;cyfry&#91;cyfra_wyswietlacza5&#93;);//gdy zapalony wyswietlacz 2 podaj stan zmiennej c5<br />else if(licznik==PORT_WYSWIETLACZA_6) LED_PORT = pgm_read_byte(&amp;cyfry&#91;cyfra_wyswietlacza6&#93;);//gdy zapalony wyswietlacz 2 podaj stan zmiennej c6<br /><br />//operacje cyklicznego przesuwania bitu zapalajacego anody w zmiennej licznik<br /><br />licznik &lt;&lt;= 1; //przesuniecie zawartosci bitow licznika o 1 w lewo<br />if(licznik&gt;PORT_WYSWIETLACZA_6) licznik =PORT_WYSWIETLACZA_1;//jesli licznik wiekszy od 2 to ustaw na 1<br /><br />}<br /><br />void czyszczenie_wyswietlacza(void){<br />cyfra_wyswietlacza1=NIC;<br />cyfra_wyswietlacza2=NIC;<br />cyfra_wyswietlacza3=NIC;<br />cyfra_wyswietlacza4=NIC;<br />cyfra_wyswietlacza5=NIC;<br />cyfra_wyswietlacza6=NIC;<br />}<br /><br /><br />void zegar(void){<br /><br /><br />static uint8_t m=19;<br />static uint8_t g=20;<br /><br />if(s==60){<br />m++;<br />s=0;<br /><br />}<br />if(m==60){<br />g++; <br />s=0;<br />m=0;<br />//licznik=0;<br />}<br />if(g==24){ <br />m=0;<br />s=0;<br />g=0;<br />}<br />cyfra_wyswietlacza6=s%10;<br />cyfra_wyswietlacza5=s/10;<br />cyfra_wyswietlacza4=m%10;<br />cyfra_wyswietlacza3=m/10;<br />cyfra_wyswietlacza2=g%10;<br />cyfra_wyswietlacza1=g/10;<br />}[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=5293">grochal7</a> — 12 wrz 2014, o 20:10</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[grochal7]]></name></author>
<updated>2014-09-12T17:52:02+01:00</updated>
<published>2014-09-12T17:52:02+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=8487&amp;p=95249#p95249</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=8487&amp;p=95249#p95249"/>
<title type="html"><![CDATA[Re: Zegarek na wyświetlaczach ledowych - kwarc 32khz?]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=8487&amp;p=95249#p95249"><![CDATA[
Właściwie przed sekundą wpadłem na pewien materiał na innym forum gdzie ktoś miał podobny problem i zauważyłem właśnie że najlepiej będzie użyć dwóch różnych przerwań z dwóch różnych timerów.<br />Spróbuję to wykorzystać, trochę poczytam i jak tylko uda mi się zrobić tak jak należy (bądź nie uda się...) to umieszczę efekty pracy <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=5293">grochal7</a> — 12 wrz 2014, o 17:52</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[jacekk232]]></name></author>
<updated>2014-09-12T17:31:26+01:00</updated>
<published>2014-09-12T17:31:26+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=8487&amp;p=95245#p95245</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=8487&amp;p=95245#p95245"/>
<title type="html"><![CDATA[Re: Zegarek na wyświetlaczach ledowych - kwarc 32khz?]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=8487&amp;p=95245#p95245"><![CDATA[
Jeśli chcesz to koniecznie zrobić tylko na procku to do obsługi multipleksowania użył Timera0. <br />A Timera2 użyj do odmierzania sekund, minut i godzin np. tak<br />[syntax=c]//konfiguracja Timera2 - odmierzanie czasu<br />//tryb asynchroniczny - kwarc 32768Hz<br />//CTC = przerwanie co 1s<br />ASSR |= (1&lt;&lt;AS2);//tryb asynchroniczny<br />TCCR2 |= (1&lt;&lt;WGM21);//tryb CTC<br />TCCR2 |= (1&lt;&lt;CS22) | (1&lt;&lt;CS21);//preskaler 256<br />OCR2 = 127;<br />TIMSK |= (1&lt;&lt;OCIE2);<br /><br />ISR(TIMER2_COMP_vect)<br />{<br />sekundy++;<br />if(sekundy &gt; 59)<br />{<br />sekundy = 0;<br />minuty++;<br />if(minuty &gt; 59)<br />{<br />minuty = 0;<br />godziny++;<br />if(godziny &gt; 24) godziny = 0;<br />}<br />}<br /><br />}[/syntax]<br /><br />Możesz też użyć Timera2 do multipleksowania i odmierzania czasu. Oczywiście Timer2 w trybie asynchronicznym taktowany kwarcem 32768Hz. Ale wydaje mi się, że sposób z osobnymi timerami do multipleksowania i odmierzania czasu jest na początek prostszy i bardziej przejrzysty.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=204">jacekk232</a> — 12 wrz 2014, o 17:31</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[grochal7]]></name></author>
<updated>2014-09-12T14:05:29+01:00</updated>
<published>2014-09-12T14:05:29+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=8487&amp;p=95227#p95227</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=8487&amp;p=95227#p95227"/>
<title type="html"><![CDATA[Re: Zegarek na wyświetlaczach ledowych - kwarc 32khz?]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=8487&amp;p=95227#p95227"><![CDATA[
jacekk232 na numery pinów nie patrz, to tylko przykład znaleziony na necie <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /><br /><br />Procesor taktowany jest wewnętrznym oscylatorem - 8Mhz <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> (w jednym z innych tematów w których pomagałeś czytałem, że nie ważne jakie taktowanie wewnętrznego oscylatora kwarc zegarowy powinien pozwolić na otrzymanie niemal dokładnie 1 sekundy.)<br /><br />(&quot;Ustawiłem Timer2, w Atmedze32, w tryb asynchroniczny tak aby przerwanie od porównania wywoływane było co sekundę. W przerwaniu zmieniałem stan diody LED na przeciwny. Program ten sprawdziłem na taktowaniu od 1MHz do 20MHz. I z każdą wartością taktowania dioda migała z tą samą częstotliwością.&quot;)<br /><br />Intre  co do scalaka RTC DS3231 chętnie ale przy którymś z kolejnych projektów <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> <br />W tym wypadku mam już wytrawioną i polutowaną płytę <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> Małe poprawki mogę wprowadzić ale z dorzuceniem scalaka byłoby trochę ciężko  <img src="https://forum.atnel.pl/images/smilies/icon_e_biggrin.gif" alt=":D" title="Bardzo szczęśliwy" /> <br /><br />Schemat:<br /><br /><a href="http://forum.atnel.pl/_obrazki/o/5293/f037beeaf1b01bfb0dff8037aa63de5a.png"  class="postlink"><img src="http://forum.atnel.pl/_obrazki/o/thumb/5293/f037beeaf1b01bfb0dff8037aa63de5a.png" alt="Obrazek" /></a><br /><br />main.c<br /><br />[syntax=c]#include &lt;avr/io.h&gt;// dołączenie głównego systemowego  pliku nagłówkowego<br />#include &lt;avr/interrupt.h&gt;<br />#include &lt;util/delay.h&gt;<br /><br /><br />#include &quot;wyswietlacz.h&quot;// dołączenie naszego pliku nagłówkowego (obsługa LED)<br /><br /><br /><br />int main(void)<br />{<br />// ****** inicjalizacja *********<br />inicjalizacja_wyswietlacza();   // inicjalizacja wyświetlacza multipleksowanego<br /><br />// testowa inicjalizacja zmiennych oraz liczb mających się wyświetlać na wyrw. LED<br />cyfra_wyswietlacza1=8;<br />cyfra_wyswietlacza2=8;<br />cyfra_wyswietlacza3=8;<br />cyfra_wyswietlacza4=8;<br />cyfra_wyswietlacza5=8;<br />cyfra_wyswietlacza6=8;<br /><br /><br /><br />sei();// włączenie globalnego zezwolenia na przerwania<br /><br /><br /><br /><br />//**********************  pętla główna<br />while(1)<br />{<br />            //     zegar(); //wykomentowane - w tym wypadku powinno wyswietlać i wyświetla same ósemki<br />}<br />}[/syntax]<br /><br />wyswietlacz.h<br /><br />[syntax=c]#ifndef _wyswietlacz_h //dyrektywy zabezpieczaja przed dolaczeniem tego samego pliku naglowkowego jesli bedzie dolaczany w wielu roznych plikach programu<br />#define _wyswietlacz_h<br /><br />//definicje portow i pinow wyswietlacza uzywanych w programie<br /><br />#define LED_PORT PORTD<br />#define LED_KIERUNEK DDRD<br />#define ANODY_PORT PORTC<br />#define ANODY_KIERUNEK DDRC<br /><br /><br />#define PORT_WYSWIETLACZA_1 (1&lt;&lt;PC0) //numer wyswietlacza<br />#define PORT_WYSWIETLACZA_2 (1&lt;&lt;PC1) //numer wyswietlacza<br />#define PORT_WYSWIETLACZA_3 (1&lt;&lt;PC2) //numer wyswietlacza<br />#define PORT_WYSWIETLACZA_4 (1&lt;&lt;PC3) //numer wyswietlacza<br />#define PORT_WYSWIETLACZA_5 (1&lt;&lt;PC4) //numer wyswietlacza<br />#define PORT_WYSWIETLACZA_6 (1&lt;&lt;PC5) //numer wyswietlacza<br /><br /><br />#define SEG_A (1&lt;&lt;0)<br />#define SEG_B (1&lt;&lt;1)<br />#define SEG_C (1&lt;&lt;2)<br />#define SEG_D (1&lt;&lt;3)<br />#define SEG_E (1&lt;&lt;4)<br />#define SEG_F (1&lt;&lt;5)<br />#define SEG_G (1&lt;&lt;6)<br />#define SEG_DP (1&lt;&lt;7)<br />#define NIC 10<br />#define BOOM 11<br /><br /><br /><br /><br />extern volatile uint8_t cyfra_wyswietlacza1;<br />extern volatile uint8_t cyfra_wyswietlacza2;<br />extern volatile uint8_t cyfra_wyswietlacza3;<br />extern volatile uint8_t cyfra_wyswietlacza4;<br />extern volatile uint8_t cyfra_wyswietlacza5;<br />extern volatile uint8_t cyfra_wyswietlacza6;<br /><br /><br /><br />//funkcja<br /><br />void inicjalizacja_wyswietlacza(void);<br />void zegar(void);<br />void czyszczenie_wyswietlacza(void);<br /><br />#endif //koniec wyswietlacz.h[/syntax]<br /><br />wyswietlacz.c<br />[syntax=c]#include &lt;avr/io.h&gt;<br />#include &lt;avr/interrupt.h&gt; //obsluga przerwan<br />#include &lt;avr/pgmspace.h&gt;<br />#include &lt;util/delay.h&gt;<br />#include &lt;avr/eeprom.h&gt;<br /><br />#include &quot;wyswietlacz.h&quot; //dolaczenie pliku nagłówkowego<br /><br /><br />volatile uint8_t cyfra_wyswietlacza1;<br />volatile uint8_t cyfra_wyswietlacza2;<br />volatile uint8_t cyfra_wyswietlacza3;<br />volatile uint8_t cyfra_wyswietlacza4;<br />volatile uint8_t cyfra_wyswietlacza5;<br />volatile uint8_t cyfra_wyswietlacza6;<br /><br /><br /><br />//definicja tablic zawierajacej bitowe cyfry LED<br />uint8_t cyfry&#91;15&#93; PROGMEM = {<br />~(SEG_A|SEG_B|SEG_C|SEG_D|SEG_E|SEG_F),// 0<br />~(SEG_B|SEG_C),// 1<br />~(SEG_A|SEG_B|SEG_D|SEG_E|SEG_G),// 2<br />~(SEG_A|SEG_B|SEG_C|SEG_D|SEG_G),// 3<br />~(SEG_B|SEG_C|SEG_F|SEG_G),// 4<br />~(SEG_A|SEG_C|SEG_D|SEG_F|SEG_G),// 5<br />~(SEG_A|SEG_C|SEG_D|SEG_E|SEG_F|SEG_G),// 6<br />~(SEG_A|SEG_B|SEG_C|SEG_F),// 7<br />~(SEG_A|SEG_B|SEG_C|SEG_D|SEG_E|SEG_F|SEG_G),// 8<br />~(SEG_A|SEG_B|SEG_C|SEG_D|SEG_F|SEG_G),// 9<br />0xFF,// NIC (puste miejsce)<br />0x00//BOOM<br />};<br /><br />//**********  funkcja inicjalizujaca prace z wyswietlaczem multipleksowym    *************<br />void inicjalizacja_wyswietlacza(void)<br />{<br />LED_KIERUNEK = 0xFF; //piny portu D jako wyjscia<br />LED_PORT = 0xFF; //wygaszenie wszystkich katod -stan wysoki<br />//2 piny portu c jako wyjscia (anody)<br />ANODY_KIERUNEK |= PORT_WYSWIETLACZA_1 | PORT_WYSWIETLACZA_2 | PORT_WYSWIETLACZA_3 | PORT_WYSWIETLACZA_4  | PORT_WYSWIETLACZA_5 | PORT_WYSWIETLACZA_6;<br />//wygaszenie wszystkich wyswietlaczy<br />ANODY_PORT |= PORT_WYSWIETLACZA_1 | PORT_WYSWIETLACZA_2 | PORT_WYSWIETLACZA_3 | PORT_WYSWIETLACZA_4  | PORT_WYSWIETLACZA_5 | PORT_WYSWIETLACZA_6;<br /><br /><br />//ustawienie timera2<br /><br /><br />        //w przypadku gdy umieszczam tu załączenie trybu synchronicznego (ASSR |= (1&lt;&lt;AS2);) na wyświetlaczu nie pojawia się kompletnie nic. Chociaż układ działa bo diody między wyświetlaczami zapalają się i gasną. (nie wiem z jakim czasem)<br /><br />TCCR2 |= (1&lt;&lt;WGM21);//tryb ctc<br />//ustawienie preskalera<br />//musze uzyskac 300Hz bo mam 6 wyswietlacze ledowe. kazdy musi zapalac diode z czestotliwoscia powiedzmy 50Hz aby nie bylo widac migotania.<br />TCCR2 |=(1&lt;&lt;CS20)|(1&lt;&lt;CS21)|(1&lt;&lt;CS22); //preskaler 1024<br />OCR2 =26;//podział przez 52 (rejestr porównania)<br />TIMSK |=(1&lt;&lt;OCIE2); //zezwolenie na przerwanie compare match<br /><br />}<br /><br />//procedura obslugi przerwania<br /><br />ISR(TIMER2_COMP_vect)<br />{<br />//zmienna do przelaczania kolejno anod wyswietacza<br />static uint8_t licznik=PORT_WYSWIETLACZA_1;//dzieki static zmienna jest tworzona jako 1 tylko przy starcie programu. potem przyjmuje wartosci po zmianach.<br />//cykliczne przelaczanie w kazdym przerwaniu<br />//anod każdego wyswietlacza (wartosc jest negowana aby krazylo zero)<br /><br />ANODY_PORT = (ANODY_PORT &amp; 0xC0) | (~licznik &amp; 0x3F);// w pierwszym 0xF0 w drugim 0x0F dla 2 wyswietlaczy podwojnych (łatwo ogarnąć czemu co i jak)<br /><br />     if(licznik==PORT_WYSWIETLACZA_1) LED_PORT = pgm_read_byte(&amp;cyfry&#91;cyfra_wyswietlacza1&#93;);//gdy zapalony wyswietlacz 2 podaj stan zmiennej c1<br />else if(licznik==PORT_WYSWIETLACZA_2) LED_PORT = pgm_read_byte(&amp;cyfry&#91;cyfra_wyswietlacza2&#93;);//gdy zapalony wyswietlacz 2 podaj stan zmiennej c2<br />else if(licznik==PORT_WYSWIETLACZA_3) LED_PORT = pgm_read_byte(&amp;cyfry&#91;cyfra_wyswietlacza3&#93;);//gdy zapalony wyswietlacz 2 podaj stan zmiennej c3<br />else if(licznik==PORT_WYSWIETLACZA_4) LED_PORT = pgm_read_byte(&amp;cyfry&#91;cyfra_wyswietlacza4&#93;);//gdy zapalony wyswietlacz 2 podaj stan zmiennej c4<br />else if(licznik==PORT_WYSWIETLACZA_5) LED_PORT = pgm_read_byte(&amp;cyfry&#91;cyfra_wyswietlacza5&#93;);//gdy zapalony wyswietlacz 2 podaj stan zmiennej c5<br />else if(licznik==PORT_WYSWIETLACZA_6) LED_PORT = pgm_read_byte(&amp;cyfry&#91;cyfra_wyswietlacza6&#93;);//gdy zapalony wyswietlacz 2 podaj stan zmiennej c6<br /><br />//operacje cyklicznego przesuwania bitu zapalajacego anody w zmiennej licznik<br /><br />licznik &lt;&lt;= 1; //przesuniecie zawartosci bitow licznika o 1 w lewo<br />if(licznik&gt;PORT_WYSWIETLACZA_6) licznik =PORT_WYSWIETLACZA_1;//jesli licznik wiekszy od 2 to ustaw na 1<br /><br />}<br />void zegar(void){<br /><br />static uint16_t licznik=0;<br />static uint8_t s=00;<br />static uint8_t m=40;<br />static uint8_t g=10;<br />if(zwiekszanie_sekund==1)<br />s++;<br />if(zwiekszanie_minut==1)<br />m++;<br />zwiekszanie_sekund=0;<br />zwiekszanie_minut=0;<br /><br />if(licznik==1000){//tu dokładnie skalibrować dla kwarcu zegarkowego<br />s++;<br />licznik=0;<br />miganie_diod();<br />}<br />if(s==60){<br />m++;<br />s=0;<br /><br />}<br />if(m==60){<br />g++; //tu dodalem g++<br />s=0;<br />m=0;<br />//licznik=0;//usunalem to<br />}<br />if(g==24){ //ten caly if dodalem<br />m=0;<br />s=0;<br />g=0;<br />licznik=0;<br />}<br />cyfra_wyswietlacza6=s%10;<br />cyfra_wyswietlacza5=s/10;<br />cyfra_wyswietlacza4=m%10;<br />cyfra_wyswietlacza3=m/10;<br />cyfra_wyswietlacza2=g%10;<br />cyfra_wyswietlacza1=g/10;<br />_delay_ms(1);<br />licznik++;<br />}<br />void czyszczenie_wyswietlacza(void){<br />cyfra_wyswietlacza1=NIC;<br />cyfra_wyswietlacza2=NIC;<br />cyfra_wyswietlacza3=NIC;<br />cyfra_wyswietlacza4=NIC;<br />cyfra_wyswietlacza5=NIC;<br />cyfra_wyswietlacza6=NIC;<br />}[/syntax]<br /><br /><br /><br />Ogółem w większości sugerowałem się poradnikami Pana Mirka i innymi projektami jakie znalazłem w necie <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=5293">grochal7</a> — 12 wrz 2014, o 14:05</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Intre]]></name></author>
<updated>2014-09-12T13:33:57+01:00</updated>
<published>2014-09-12T13:33:57+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=8487&amp;p=95223#p95223</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=8487&amp;p=95223#p95223"/>
<title type="html"><![CDATA[Re: Zegarek na wyświetlaczach ledowych - kwarc 32khz?]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=8487&amp;p=95223#p95223"><![CDATA[
grochal7 a słuchaj może mała zmiana koncepcji, procesor do sterowania wyświetlaczem ale jako zegarek elegancki scalak RTC DS3231 <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /> <br /><br />Masz do niego rewelacyjny poradnik i libsa:<br /><a href="http://mirekk36.blogspot.com/2013/11/rtc-ds3231-najdokadniejszy-zegarek-na.html"  class="postlink">http://mirekk36.blogspot.com/2013/11/rtc-ds3231-najdokadniejszy-zegarek-na.html</a><br /><br />Wg. mnie nie ma co kombinować z sama Atmegą, programem i kwarcem bo nie osiągniesz takiej dokładności i stabilności zegara, dlaczego? to wyjaśnia już Mirek w w/w poradniku. Naprawdę polecam.<br /><br />A tu mój test z multiplexowaniem jego <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><br /><div style="width: 583px; height: 471px; margin: 0 auto; padding-left: 26px; padding-top: 48px; background: url('https://www.atnel.pl/download/atnel_tv.png') no-repeat;"> <strong>iframe</strong> </div><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1356">Intre</a> — 12 wrz 2014, o 13:33</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[jacekk232]]></name></author>
<updated>2014-09-12T12:24:11+01:00</updated>
<published>2014-09-12T12:24:11+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=8487&amp;p=95218#p95218</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=8487&amp;p=95218#p95218"/>
<title type="html"><![CDATA[Re: Zegarek na wyświetlaczach ledowych - kwarc 32khz?]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=8487&amp;p=95218#p95218"><![CDATA[
Najlepiej podaj tu cały kod. Schematu też by nie zaszkodziło pokazać. Bo widzę, że kwarc masz podpięty pod jakieś nóżki 12 i 13. To są numery pinów procesora czy może te cyfry oznaczają coś innego. <br /><br />Podaj jeszcze na jakim taktowaniu działa procesor. Nie chodzi mi o 32768Hz bo to jest taktowanie Timera2 odliczającego czas jednej sekundy. Timera2, którego używasz do multipleksowania wyświetlaczy.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=204">jacekk232</a> — 12 wrz 2014, o 12:24</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[grochal7]]></name></author>
<updated>2014-09-12T08:29:11+01:00</updated>
<published>2014-09-12T08:29:11+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=8487&amp;p=95201#p95201</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=8487&amp;p=95201#p95201"/>
<title type="html"><![CDATA[Re: Zegarek na wyświetlaczach ledowych - kwarc 32khz?]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=8487&amp;p=95201#p95201"><![CDATA[
Tak, pamiętałem. <br />Chodzi o to że jeśli dodaję do mojego kodu załączenie trybu asynchronicznego (ASSR |= (1&lt;&lt;AS2);) to wyświetlacze gasną. <br />Bez tej linijki kodu wszystko działa jak należy, jednak nie mam odliczania co dokładnie 1 sek.<br /><br />Edit. A może to jest problemem... <br /><br />Mam podobne podłączenie kwarcu i kondensatorów 22pF:<br /><a href="http://forum.atnel.pl/_obrazki/o/5293/15f7694866cb6477a67feae71aecb59d.png"  class="postlink"><img src="http://forum.atnel.pl/_obrazki/o/thumb/5293/15f7694866cb6477a67feae71aecb59d.png" alt="Obrazek" /></a><br /><br />Nie powinno być jak tu?:<br /><a href="http://forum.atnel.pl/_obrazki/o/5293/d987bc4506a5ac83edb2e6a1aec9d175.png"  class="postlink"><img src="http://forum.atnel.pl/_obrazki/o/thumb/5293/d987bc4506a5ac83edb2e6a1aec9d175.png" alt="Obrazek" /></a><br /><br />W sumie jeśli to byłby problem to spokojnie sobie płytę poprawię <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=5293">grochal7</a> — 12 wrz 2014, o 08:29</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[HCOOH]]></name></author>
<updated>2014-09-11T22:18:02+01:00</updated>
<published>2014-09-11T22:18:02+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=8487&amp;p=95192#p95192</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=8487&amp;p=95192#p95192"/>
<title type="html"><![CDATA[Re: Zegarek na wyświetlaczach ledowych - kwarc 32khz?]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=8487&amp;p=95192#p95192"><![CDATA[
Chyba musisz trochę więcej kodu udostępnić, bo tutaj wszystko wygląda na poprawne... Jeśli oczywiście dobrze interpretuję Twoje definicje <img src="https://forum.atnel.pl/images/smilies/icon_razz.gif" alt=":P" title="Pokazuje język" /><br /><br />Pamiętałeś o sei()? <img src="https://forum.atnel.pl/images/smilies/icon_e_biggrin.gif" alt=":D" title="Bardzo szczęśliwy" /><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=2954">HCOOH</a> — 11 wrz 2014, o 22:18</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[grochal7]]></name></author>
<updated>2014-09-11T21:58:19+01:00</updated>
<published>2014-09-11T21:58:19+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=8487&amp;p=95188#p95188</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=8487&amp;p=95188#p95188"/>
<title type="html"><![CDATA[Re: Zegarek na wyświetlaczach ledowych - kwarc 32khz?]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=8487&amp;p=95188#p95188"><![CDATA[
Spróbowałem, wyświetlacze kompletnie zgasły.. <br />Nie bardzo rozumiem dlaczego. Ogółem Twoją metodę rozumiem i widziałem ją gdzieś tu na forum (wcześniej pomagałeś komuś).<br />tu kod przerwania oraz konfiguracja timera (to co działa jednak nie co dokładnie 1 sek..)<br />[syntax=c]void inicjalizacja_wyswietlacza(void)<br />{<br />LED_KIERUNEK = 0xFF; //piny portu D jako wyjscia<br />LED_PORT = 0xFF; //wygaszenie wszystkich katod -stan wysoki<br />//2 piny portu c jako wyjscia (anody)<br />ANODY_KIERUNEK |= PORT_WYSWIETLACZA_1 | PORT_WYSWIETLACZA_2 | PORT_WYSWIETLACZA_3 | PORT_WYSWIETLACZA_4  | PORT_WYSWIETLACZA_5 | PORT_WYSWIETLACZA_6;<br />//wygaszenie wszystkich wyswietlaczy<br />ANODY_PORT |= PORT_WYSWIETLACZA_1 | PORT_WYSWIETLACZA_2 | PORT_WYSWIETLACZA_3 | PORT_WYSWIETLACZA_4  | PORT_WYSWIETLACZA_5 | PORT_WYSWIETLACZA_6;<br /><br /><br />//ustawienie timera2<br />TCCR2 |= (1&lt;&lt;WGM21);//tryb ctc<br />//ustawienie preskalera<br />//musze uzyskac 300Hz bo mam 6 wyswietlacze ledowe. kazdy musi zapalac diode z czestotliwoscia powiedzmy 50Hz aby nie bylo widac migotania.<br />TCCR2 |=(1&lt;&lt;CS20)|(1&lt;&lt;CS21)|(1&lt;&lt;CS22); //preskaler 1024<br />OCR2 =26;//podział przez 26 (rejestr porównania)<br />TIMSK |=(1&lt;&lt;OCIE2); //zezwolenie na przerwanie compare match<br /><br />}<br /><br />//procedura obslugi przerwania<br /><br />ISR(TIMER2_COMP_vect)<br />{<br />//zmienna do przelaczania kolejno anod wyswietacza<br />static uint8_t licznik=PORT_WYSWIETLACZA_1;//dzieki static zmienna jest tworzona jako 1 tylko przy starcie programu. potem przyjmuje wartosci po zmianach.<br />//cykliczne przelaczanie w kazdym przerwaniu<br />//anod każdego wyswietlacza (wartosc jest negowana aby krazylo zero)<br /><br />ANODY_PORT = (ANODY_PORT &amp; 0xC0) | (~licznik &amp; 0x3F);<br /><br />     if(licznik==PORT_WYSWIETLACZA_1) LED_PORT = pgm_read_byte(&amp;cyfry&#91;cyfra_wyswietlacza1&#93;);//gdy zapalony wyswietlacz 2 podaj stan zmiennej c1<br />else if(licznik==PORT_WYSWIETLACZA_2) LED_PORT = pgm_read_byte(&amp;cyfry&#91;cyfra_wyswietlacza2&#93;);//gdy zapalony wyswietlacz 2 podaj stan zmiennej c2<br />else if(licznik==PORT_WYSWIETLACZA_3) LED_PORT = pgm_read_byte(&amp;cyfry&#91;cyfra_wyswietlacza3&#93;);//gdy zapalony wyswietlacz 2 podaj stan zmiennej c3<br />else if(licznik==PORT_WYSWIETLACZA_4) LED_PORT = pgm_read_byte(&amp;cyfry&#91;cyfra_wyswietlacza4&#93;);//gdy zapalony wyswietlacz 2 podaj stan zmiennej c4<br />else if(licznik==PORT_WYSWIETLACZA_5) LED_PORT = pgm_read_byte(&amp;cyfry&#91;cyfra_wyswietlacza5&#93;);//gdy zapalony wyswietlacz 2 podaj stan zmiennej c5<br />else if(licznik==PORT_WYSWIETLACZA_6) LED_PORT = pgm_read_byte(&amp;cyfry&#91;cyfra_wyswietlacza6&#93;);//gdy zapalony wyswietlacz 2 podaj stan zmiennej c6<br /><br />//operacje cyklicznego przesuwania bitu zapalajacego anody w zmiennej licznik<br /><br />licznik &lt;&lt;= 1; //przesuniecie zawartosci bitow licznika o 1 w lewo<br />if(licznik&gt;PORT_WYSWIETLACZA_6) licznik =PORT_WYSWIETLACZA_1;//jesli licznik wiekszy od 2 to ustaw na 1<br /><br />}[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=5293">grochal7</a> — 11 wrz 2014, o 21:58</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[jacekk232]]></name></author>
<updated>2014-09-11T21:11:56+01:00</updated>
<published>2014-09-11T21:11:56+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=8487&amp;p=95182#p95182</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=8487&amp;p=95182#p95182"/>
<title type="html"><![CDATA[Re: Zegarek na wyświetlaczach ledowych - kwarc 32khz?]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=8487&amp;p=95182#p95182"><![CDATA[
Kwarc podłączony do TOSC1 i TOSC2 służy do taktowania Timera2 pracującego w tzw. trybie asynchronicznym a nie do taktowania procesora, który w tym czasie musi być taktowany albo wewnętrznym oscylatorem albo kwarcem zewnętrznym np. 16MHz. Timer2 w trybie asynchronicznym nie zlicza impulsów z oscylatora &quot;głównego&quot; tylko właśnie z rezonatora podłączonego do TOSC1 i TOSC2.<br /><br />Tak więc powinieneś ustawić taktowanie procesora na wewnętrzny oscylator np. 8MHz, a Timer2 ustawić w tryb asynchroniczny.<br />Poniżej przykładowa konfiguracja Timera2<br />[syntax=c]//konfiguracja Timera2 - odmierzanie czasu<br />//tryb asynchroniczny - kwarc 32768Hz<br />//tryb CTC - przerwanie co 1s<br />ASSR |= (1&lt;&lt;AS2);//tryb asynchroniczny<br />TCCR2 |= (1&lt;&lt;WGM21);//tryb CTC<br />TCCR2 |= (1&lt;&lt;CS22) | (1&lt;&lt;CS21);//preskaler 256<br />OCR2 = 127;<br />TIMSK |= (1&lt;&lt;OCIE2);[/syntax]<br /><br />Wtedy przerwanie od porównania będzie wywoływane co sekundę<br />[syntax=c]ISR(TIMER2_COMP_vect)<br />{<br />         //kod przerwania<br />}[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=204">jacekk232</a> — 11 wrz 2014, o 21:11</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[grochal7]]></name></author>
<updated>2014-09-11T20:47:51+01:00</updated>
<published>2014-09-11T20:47:51+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=8487&amp;p=95178#p95178</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=8487&amp;p=95178#p95178"/>
<title type="html"><![CDATA[Zegarek na wyświetlaczach ledowych - kwarc 32khz?]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=8487&amp;p=95178#p95178"><![CDATA[
Witam. <br />Realizuję od jakiegoś czasu swój projekt prostego zegarka sterowanego za pomocą atmegi8.<br />Problem polega na tym, że nie mam pojęcia jak ustawić fusebity za pomocą mkavrcalculatora dla kwarcu zegarkowego (32.768kHz). <br /><br /><br />(jeden procek już padł (w sumie nie wiem czemu skoro podobno za pomocą mkavrcalculatora nie da się zablokować procka -&gt; Mam talent xD))<br /><br />Może ktoś podpowie?<br />Oczywiście kwarc podpięty jest pod TOSC1 TOSC2 w otoczeniu dwóch kondensatorów ceramicznych 22pF.<br />Co chcę osiągnąć? Odliczanie dokładnie 1 sekundy. (W końcu to projekt zegarka <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=5293">grochal7</a> — 11 wrz 2014, o 20:47</p><hr />
]]></content>
</entry>
</feed>