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:
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..
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 ;)
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 ;-)
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.