Próbuję napisać program zegara z wykorzystaniem LCD. Próbuję i próbuję, ale nie mogę poradzić sobie z problemem spóźniania się. Tak napisany program gubi 10 sekund już przy 5 minutach. Czy może ktoś pobieżnie zerknąć w kod i podpowiedzieć mi, co robię nie tak. Walczę już z tym tydzień czasu a że jestem bardzo „świeży” to efekt jest mizerny.
Będę bardzo wdzięczny za wszelkie wskazówki.
Pozdrawiam
Tomek
Kod: Zaznacz cały
$crystal = 4000000
$regfile "attiny2313.dat"
Config Lcd = 16 * 2
Config Portb = &B11111111
Portb = &B01111111
Config Portd = &B1111111
Portd = &B0111111
Config Timer0 = Timer , Prescale = 64
Enable Interrupts
Enable Timer0
On Timer0 Co4ms 'po przepełnieniu licznika T/C0 skocz do etykiety o nazwie Co4ms
Dim Opoznienie As Byte
Dim A As Byte
Dim Dg As Byte 'Dziesiątki godzin
Dim Jg As Byte 'Jednostki godzin
Dim Dm As Byte 'itd
Dim Jm As Byte 'itd
Dim Ds As Byte 'itd
Dim Js As Byte 'itd
Dg = 0 'wstępnie wpisana wartość
Jg = 9
Dm = 5
Jm = 9
Ds = 5
Js = 0
Opoznienie = 0
A = 0
Portd.2 = 0
Cls
Do
Loop
End 'to jest główny program - pusta nieskończona pętla
Co4ms: 'przerwanie
Timer0 = 6 'skrócenie zliczania do 4ms
Gosub Zegar
Return
Zegar:
If Opoznienie = 250 Then
Opoznienie = 0
Incr Js 'zwiększanie sekund w kółko
If Js = 10 Then 'skrócenie zliczania jednostek sekund do 9
Incr Ds 'zwiększenie dziesiątek sekund
Js = 0 'wyzerowanie jednostek sekund
End If
If Ds = 6 Then 'skrócenie dziesiątek sekund do 60
Incr Jm 'zwiększenie jednostek minut
Ds = 0 'wyserowanie dziesiątek sekund
End If
If Jm = 10 Then 'jw
Incr Dm
Jm = 0
End If
If Dm = 6 Then
Incr Jg
Dm = 0
End If
If Jg = 10 Then
Incr Dg
Jg = 0
End If
If Dg = 2 And Jg = 4 Then 'sprawdzenie czy nie ma godziny 24:00
Dg = 0 : Jg = 0 'jeśli tak to wyzerowanie zegara i liczenie od nowa
End If
Gosub Wyswietlacz
Else
Incr Opoznienie
End If
Return
Wyswietlacz:
Cls
Locate 1 , 1 'lokacja dziesiątek godzin
If Dg > 0 Then 'jeśli jest przed dziesiątą wygaś pierwsze zero
Lcd ; Dg 'wyświetlenie dziesiątek godzin
Else
Cursor Off
End If
Locate 1 , 2 'lokacja jednostek godzin
Lcd ; Jg 'jw
Locate 1 , 3
Lcd ":"
Locate 1 , 4
Lcd ; Dm
Locate 1 , 5
Lcd ; Jm
Locate 1 , 6
Lcd ":"
Locate 1 , 7
Lcd ; Ds
Locate 1 , 8
Lcd ; Js
Cursor Off
Return