Szanowni koledzy czy ktoś z was może mi powiedzieć jaką mogę osiągnąć precyzję przy odmierzaniu czasu przy wykorzystaniu układu ATmega16 z zewnętrznym zegarem 8.000 MHZ(rezonator kwarcowy)?
Morduje to już drugi dzień i nie mogę zrobić tego w sposób precyzyjny - na każde odmierzone 10 minut atmege spieszy o ok 20s - taka zwłoka jest dla mnie niedopuszczalna - do przyjęcia było by ok 5 minut na dobę.
Czy taka zwłoka jest w ogóle możliwa do osiągnięcia przy 8MHZ kwarcu czy konieczne bedzię użycie wewnętrznego RTC z kwarcem zegarkowym ?
Potrzebuję napisać program którego jednym z podprogramów będzie minutnik odmierzający czas od 1 godziny do 48 godzin (długość odmierzanego czasu będzie wybierana klawiszami).
W poniższym listingu przedstawiam wykorzystywany listing odmierzający ilość sekund.
Morduje to już drugi dzień i nie mogę zrobić tego w sposób precyzyjny - na każde odmierzone 10 minut atmege spieszy o ok 20s - taka zwłoka jest dla mnie niedopuszczalna - do przyjęcia było by ok 5 minut na dobę.
Czy taka zwłoka jest w ogóle możliwa do osiągnięcia przy 8MHZ kwarcu czy konieczne bedzię użycie wewnętrznego RTC z kwarcem zegarkowym ?
Potrzebuję napisać program którego jednym z podprogramów będzie minutnik odmierzający czas od 1 godziny do 48 godzin (długość odmierzanego czasu będzie wybierana klawiszami).
W poniższym listingu przedstawiam wykorzystywany listing odmierzający ilość sekund.
'Przykład programu odmierzającego 1 sekundowe odcinki czasu z wykorzystaniem timer0
'Timer0 będzie odmierzał dokładnie 1 sekundę 8MHz/64/250/500 = 1 sekunda
'$regfile = "m16def.dat" 'rejestry mikrokontrolera atmega16
'$crystal = 8000000 'częstotliwo.ć taktowania mikrokontrolera
'Config Pinb.1 = Output 'linia pb1 jako wyj.cie
Config Timer0 = Timer , Prescale = 256 'deklaracja timera jako czasomierzab z prescalerem 64
On Timer0 Przerwanie_co_8ms 'deklaracja jaka etykieta obsługuje przepełnienie od timer0
Dim Licznik As Integer 'zmienna licznikowa
Dim Sek As Integer
Enable Interrupts 'odblokowanie globalnych przerwań
Enable Timer0 'odblokowanie przerwania od przepełnienia timer0
Timer0 = 6 'wpisanie warto.ci początkowej 6 do timera, czyli timer będzie zliczał 250 (256-6) impulsów
Licznik = 0 'wyzerowanie zmiennej licznikowej
Sek = 0 'wyzerowanie zmiennej sekundnika
Do
Upperline : Lcd " " ; Sek
'petla główna programu
Loop
End 'koniec programu
Przerwanie_co_8ms: 'podprogram przerwania od przepełnienia timer0 wywolywanego co 2 ms
Counter0 = Counter0 + 6 'ustawienie początkowej warto.ci timera0 poprzez dodanie do niego warto.ci 6 (odliczone zostanie dokładnie kolejne 250 impulsów)
Incr Licznik 'zwiększenie licznika
If Licznik = 125 Then 'je.li zmienna licznik równa się 500 (czyli odliczone zostało 500*2ms=1sek), to
Incr Sek 'dodaj jedna sekunde na wyswietlaczu
Licznik = 0 'wyzeruj zmienną licznik
End If
Return