[ATmega8] Sekunda

Witam serdecznie.

Właśnie pisze oprogramowanie do zegarka elektronicznego na procesorze ATmega8. Mam problem z idealnym odmierzeniem jednej sekundy. Jaką powinienem zastosować częstotliwość pracy CPU, rozdzielczość timera oraz wartość preskalera, aby dokładnie móc mierzyć sekunde. Dotychczas najlepszą wartość jaką udało mi się osiągnąć jest:

1MHz/(256*256) = 15,258 Hz

Z góry dziękuję za rady.

Reply to
Piotr
Loading thread data ...

Jeśli rezonator 32768Hz wystarczy (chodzi o wydajność procka) to właśnie taki się daje do zegarka.

TP.

Reply to
Tomasz Piasecki

Skoro chcesz podzielic 1MHz przez milion, to liczymy:

1000000 = 10^6 = 2^6 * 5^6.

Z czego wniosek ze najwiekszym preskalerem binarnym moze byc 64. Mozesz tez sprobowac innego kwarca, np 1.024 MHz.

Albo jeszcze inaczej - zostawiasz te 15.258 Hz, ale w przerwaniu dodajesz do zmiennej 65536 [w domysle - mikrosekund]. Jak zmienna osiegnie milion - odejmujesz ten milion od zmiennej i zmieniasz czas o sekunde. Nie bedzie to odmierzalo za kazdym razem dokladnie sekundy, ale w dlugim okresie dokladnosc bedzie zachowana.

Biorac pod uwage ze wspolny podzielnik obu tych liczb jest spory - mozesz obie liczby podzielic proporcjonalnie - np co przerwanie dodajesz 1024, a po przekroczeniu 15625 wyjdzie sekunda.

A moze warto zostawic longint, a nawet podniesc liczby - moglbys zastosowac programowa korekcje chodu - tzn zliczac sekunde nie co milion, ale np 1000001 czy 999998

A w ogole .. bedzie tam jakis akumulatorek ? Moze lepiej RTC, ustawianie zegarka po wylaczeniu zasilania wk* troche..

J.

Reply to
J.F.

Piotr snipped-for-privacy@diablo.ict.pwr.wroc.pl> napisał(a):

Tylko po co kombinować ;-) ATMegi(ósemka również) mają na pokładzie bardzo fajny sprzęt , który należy wykorzystać , jeśli zachodzi taka potrzeba.Weźmy na tapetę Timer2 , który ma "coś" co nazywa się "Clear Timer on Compare Match (Auto Reload)".

1)Do rejestru Ocr2 wpisujemy 125(0x7D). 2)Do zmienej np.Licznik wpisujemy również 125(0x7D). 3)Definiujemy procedurę przerwania od OC2 , a niej np.: OC2_Intr: Dec Licznik Brne koniec Ldi Licznik,125 Rcall zaktualizuj liczniki zegarka koniec: Reti 4)Zezwalamy na przerwanie od OC2 5)Zezwalamy na przerwania globalnie 6)Ustawiamy preskaler dla na 64 , oraz ustawiamy bit nr 3 (WGM21) i mamy dość dokładny zegarek ;)

Pozdrawiam Piotr

PS

125*125*64=1000000
Reply to
Piotrek Sz.

Użytkownik Piotr napisał:

Na kwarcu 1Mhz nie uzyskasz dobrej dokładności - po pierwsze się nie dzieli przez potęgę 2, a po drugie same kwarce nie są zbyt dokładne. Po to ATMega8 ma w sobie RTC - kupujesz kwarc "zegarkowy" 32,768kHz (tani, a znacznie dokładniejszy), podpinasz pod piny TOSC1/TOSC2 (bez żadnych kondensatorów), konfigurujest timer2 jako RTC (ustawiasz bit AS2 w rej. ASSR), ustawiasz preskaler timera 2 na ile tam chcesz - i masz całkiem fajny i dokładny zegarek ;-)

Reply to
zenon

zenon napisał(a):

Jest również na stronie atmela nota aplikacyjna (AVR134) n.t. temat z kodem przykładowym i wyliczeniem ile prądu będzie średnio procek pobierać.

Reply to
"Miłosz K."

ElectronDepot website is not affiliated with any of the manufacturers or service providers discussed here. All logos and trade names are the property of their respective owners.