RTV forum PL | NewsGroups PL

Dokładność RTC na ATmega8535 z kwarcem 8MHz - opóźnienia w odmierzaniu czasu

RTC na uK atmega

NOWY TEMAT

elektroda NewsGroups Forum Index - Elektronika Polska - Dokładność RTC na ATmega8535 z kwarcem 8MHz - opóźnienia w odmierzaniu czasu

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

elektroda NewsGroups Forum Index - Elektronika Polska - Dokładność RTC na ATmega8535 z kwarcem 8MHz - opóźnienia w odmierzaniu czasu

NOWY TEMAT

Regulamin - Zasady uzytkowania Polityka prywatnosci Kontakt RTV map News map