Sirtap
Guest
Wed Aug 09, 2006 8:22 pm
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
Guest
Wed Aug 09, 2006 8:57 pm
Sirtap napisał(a):
Quote:
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
Guest
Wed Aug 09, 2006 9:51 pm
Quote:
Skąd wiesz, że kwarc ma 8000000 Hz?
Na kwarcu jest napisane YIC B6 8.000 MHz
Quote:
kwarce zegarkowe mają czasami 20 ppm
To raczej dużo. Czy to znaczy, że w zegarkach stosuje się programową
korekcję?
Bogdan Gutknecht
Guest
Thu Aug 10, 2006 4:41 am
Quote:
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
Guest
Thu Aug 10, 2006 9:44 pm
Quote:
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
Guest
Fri Aug 11, 2006 5:23 am
Quote:
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
Guest
Fri Aug 11, 2006 9:03 am
Użytkownik "Sirtap" <null@poczta.pl> napisał w wiadomości
news:ebh49d$ara$1@inews.gazeta.pl...
Quote:
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