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