RTC na uK atmega

Aug 09, 2006 6 Replies

witam



Napisa³em program, który realizuje programowo zegar czasu rzeczywistego na atmega8535 z kwarcem 8MHz. Jednak program nie dzia³a prawid³owo. Spó¼nia siê oko³o 1-2s na 15h (d³u¿ej nie testowa³em), a spodziewa³em siê lepszej dok³adno¶ci. Czym mo¿e to byæ spowodowane? W programie za³o¿y³em, ¿e timer1 bêdzie co sekundê wywo³ywa³ przerwanie porównania w trybie CTC. Prescaler ustawi³em na 256. Do rejestru OCR1A wprowadzi³em liczbê 8000000/256-1 (korzysta³em ze wzoru z datasheeta). Nie wiem czym mo¿e byæ spowodowany tak du¿y b³±d. Szuka³em na necie podobnego programu, ale bez skutecznie. W wiêkszo¶ci programów wykorzystywane jest przerwanie przepe³nienia - nie wiem dlaczego.



fragmenty kodu programu inicjalizuj±cy timer1:



ldi R16, high(8000000/256-1) //ma byc 31249 out OCR1AH, R16 ldi R16, low(8000000/256-1) out OCR1AL, R16


ldi R16, (1<<WGM12)|(1<<CS12)//prescaler 256 out TCCR1B, R16



in R16, TIMSK ori R16, 1<<OCIE1A out TIMSK, R16


//przerwanie OC:



Zegar: nop andi Cyfra5, 0x7F



inc Cyfra1 cpi Cyfra1, 10 brlo end_zegar ldi Cyfra1, 0



inc Cyfra2 cpi Cyfra2, 6 brlo end_zegar ldi Cyfra2, 0



inc Cyfra3 cpi Cyfra3, 10 brlo end_zegar ldi Cyfra3, 0



inc Cyfra4 cpi Cyfra4, 6 brlo end_zegar ldi Cyfra4, 0



inc Cyfra5



cpi Cyfra5, 4 brne nie_reset cpi Cyfra6, 2 brne nie_reset



clr Cyfra1 clr Cyfra2 clr Cyfra3 clr Cyfra4 clr Cyfra5 clr Cyfra6 rjmp end_zegar



nie_reset:



cpi Cyfra5, 10 brlo end_zegar ldi Cyfra5, 0



inc Cyfra6



nop end_zegar: ori Cyfra5, 0x80



reti



Reszta pogramu raczej nie jest istotna (obs³uga wy¶wietlaczy LED). Dodam jeszcze, ¿e zewnêtrzny kwarc na pewno jest w³±czony.



Pozdrawiam


Sirtap napisał(a):

Skąd wiesz, że kwarc ma 8000000 Hz? Błąd względny 2/(15*3600) to około

37 ppm, kwarce zegarkowe mają czasami 20 ppm, gotowe generatory kwarcowe (w metalowej obudowie DIL14) 25-100 ppm.

Na kwarcu jest napisane YIC B6 8.000 MHz

To raczej du¿o. Czy to znaczy, ¿e w zegarkach stosuje siê programow± korekcjê?

S¹ kondensatorki regulowane pozwalaj¹ce nieco przeci¹gn¹æ czêstotliwoœæ.

W OCR1x masz 31249, a zauwa¿, ¿e 15h * 3600 to 54000. Czyli zmniejszaj±c o 1 OCR1x (8000000/256-2) skorygujesz go o nieca³e 2 sekundy na 15h., a tyle w³a¶nie Ci spó¼nia. Móg³by¶ uzyskaæ dwa razy wiêksz± dok³adno¶æ mo¿liwo¶æ korekcji gdyby w OCR1x by³a dwa razy wiêksza warto¶æ. Tyle, ¿e w atmega8515 preskaler musia³by¶ wtedy ustawiæ na 1/128, a takiej mo¿liwo¶ci niestety nie ma. Mo¿na za to ustawiæ preskaler na 1/64 tylko wtedy musia³by¶ zmieniæ kwarc na

4MHz. Przy powy¿szej konfiguracji w OCR1x wpisujesz wstêpnie (8000000/128 -1). Teraz ka¿da zmiana o 1 w OCR1x wywo³uje w czasie 15h korekcjê nieco poni¿ej 1s.

Pozdrawiam Lucek

Czyli potrzebna jest programowa korekcja b³êdu wynikaj±cego z zastosowanego kwarcu. Pó¼niej wypróbuje asynchroniczny tryb pracy licznika z kwarcem

32,768kHz. Je¿eli i wtedy bêdzie taki b³±d, to wprowadzê korekcjê.

thx pozdrawiam

U¿ytkownik "Sirtap" snipped-for-privacy@poczta.pl napisa³ w wiadomo¶ci news:ebh49d$ara$ snipped-for-privacy@inews.gazeta.pl...

Nie bêdzie. Chyba, ¿e kwarc zupe³nie skopany.

Pozdrawiam FJ

Join the Discussion

Have something to add? Share your thoughts — no account required.

Didn't find your answer?

Ask the community — no account required