RTC na uK atmega
Sirtap - 15-08-2006 19:35
RTC na uK atmega 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
Filip Ozimek - 15-08-2006 19:35
Sirtap napisał(a):
> 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?
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.
--
Filip.
Sirtap - 15-08-2006 19:35
> Skąd wiesz, że kwarc ma 8000000 Hz?
Na kwarcu jest napisane YIC B6 8.000 MHz
> kwarce zegarkowe mają czasami 20 ppm
To raczej dużo. Czy to znaczy, że w zegarkach stosuje się programową
korekcję?
Bogdan Gutknecht - 15-08-2006 19:35
>
> > kwarce zegarkowe mają czasami 20 ppm
>
> To raczej dużo. Czy to znaczy, że w zegarkach stosuje się programową
> korekcję?
>
Są kondensatorki regulowane pozwalające nieco przeciągnąć częstotliwość.
Luk - 15-08-2006 19:35
> 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.
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
Sirtap - 15-08-2006 19:35
> 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.
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
Filip J - 15-08-2006 19:36
Użytkownik "Sirtap" <null@poczta.pl> napisał w wiadomości
news:ebh49d$ara$1@inews.gazeta.pl...
> 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ę.
Nie będzie. Chyba, że kwarc zupełnie skopany.
Pozdrawiam
FJ
zanotowane.pldoc.pisz.plpdf.pisz.plkonstruktor.keep.pl