Witam,
Próbuję uruchomić zegarek na procku ATtiny2313. Problem w tym że zegarek (stoper) działa za wolno - nie chodzi tu o precyzyjne odmierzanie czasu ale dziesiątki sekund zmieniają sie z prędkością sekund.
Program jest z mikroprocesorowej oślej łączki z edw. Tam użyty był at90s2313, ale jeżeli dobrze wyczytałem w nocie katalogowej to timer0 w obu działa tak samo. Czy ktoś wie w czym tkwi błąd? Wewnętrzny oscylator jest ustawiony na 4Mhz, więc teorytycznie powinno to chodzić.
Aha - w orginalny program był na wyświetlaczach LED a nie LCD- jeśli ma to znaczenie.
Program:
Próbuję uruchomić zegarek na procku ATtiny2313. Problem w tym że zegarek (stoper) działa za wolno - nie chodzi tu o precyzyjne odmierzanie czasu ale dziesiątki sekund zmieniają sie z prędkością sekund.
Program jest z mikroprocesorowej oślej łączki z edw. Tam użyty był at90s2313, ale jeżeli dobrze wyczytałem w nocie katalogowej to timer0 w obu działa tak samo. Czy ktoś wie w czym tkwi błąd? Wewnętrzny oscylator jest ustawiony na 4Mhz, więc teorytycznie powinno to chodzić.
Aha - w orginalny program był na wyświetlaczach LED a nie LCD- jeśli ma to znaczenie.
Program:
'C012a Bardzo prosty stoper 0,1-sekundowy
Dim Dziesek As Byte , Sekjed As Byte , Sekdzies As Byte , Minjed As Byte
Dim 100ms As Byte , Ktorywysw As Byte , Licz As Bit
Config Portb = 255 : Portb = &B11111111 : Config Portd = &B1111100 : Portd = &B1111111
Config Timer0 = Timer , Prescale = 64 : Enable Interrupts : Enable Timer0
Dziesek = 0 : Sekjed = 0 : Sekdzies = 0 : Minjed = 0
On Timer0 Co4ms
Config Lcd = 16 * 2
Do : Loop : End 'to jest główny program - pusta nieskończona pętla
Co4ms: 'procedura obsługi przerwania od Timera T/C0 wykonywana co 4ms
Timer0 = 6 'załaduj do Timera0, żeby zliczył 250 (=256-6) impulsów
If Pind.0 = 0 Then Licz = 1 'sprawdź stan S1 i ewentualnie rozpocznij zliczanie czasu
If Pind.1 = 0 Then Licz = 0 'sprawdź stan S2 i ewentualnie zakończ zliczanie czasu
If Licz = 1 Then 'tylko wtedy, gdy stoper ma liczyć czas
Incr 100ms 'co 4ms zwiększ wartość licznika o nazwie 100ms
If 100ms = 25 Then 'skróc cykl licznika 100ms właśnie do 100ms
100ms = 0 'czyli 0,1 sekundy
Incr Dziesek 'co 0,1s zwiększ stan licznika dziesiatych części sekundy
If Dziesek = 10 Then 'ten licznik liczy do dziesieciu
Dziesek = 0 'czyli cykl trwa 1 sekundę
Incr Sekjed 'co 1 sekundę zwiększ licznik jednostek sekund
If Sekjed = 10 Then
Sekjed = 0 'co 10 sekund
Incr Sekdzies 'zwiększ stan licznika dziesiatek sekund
If Sekdzies = 6 Then 'liczy do 6 bo minuta ma 60 sekund
Sekdzies = 0
Incr Minjed 'co 60 sekund zwiększ stan licznika minut
If Minjed = 10 Then Minjed = 0 '0...9 minut
End If 'więc maksymalny stan licznika to:
End If '9 minut, 59 sekund i 9 dziesiatych sekundy
End If
End If
End If
Cls
Lcd Minjed ; " " ; Sekdzies ; Sekjed ; " " ; Dziesek ; 100ms
Return 'koniec procedury obsługi przerwania