Как сделать один секундный таймер с atmega8?

Я хочу сделать таймер на одну секунду с atmega8 и timer0. Я использовал кристалл 8 МГц и prescale = 1, Каждые 125 нс timer0 увеличивается на единицу, поэтому, когда timer0 переполняется 31250 раз, у нас должна быть одна секунда, но она не работает должным образом и задерживается более чем на 5 секунд. Я использовал BascomAVR.

$regfile = "m8def.dat"
$crystal = 8000000
Config Lcd = 16 * 2
Config Lcdpin = Pin , Db4 = Portd.4 , Db5 = Portd.5 , Db6 = Portd.6 
,Db7 = Portd.7 , E = Portd.3 , Rs = Portd.2
Config Timer0 = Timer , Prescale = 1
Dim Second As Word , Minute As Word , Hour As Word , Z As Integer
Second = 0
Minute = 0
Hour = 0
Z = 0
Enable Interrupts
Enable Timer0
Enable Ovf0
On Ovf0 Ovfroutin
Timer0 = 0
Start Timer0
Cursor Off
Cls : Home
Lcd "00:00:00"
Do
Loop
End                                                         'end program

Ovfroutin:
  Incr Z
  If Z = 31250 Then
     Stop Timer0
     Z = 0
     Incr Second
     If Second = 60 Then
        Second = 0
        Incr Minute
        If Minute = 60 Then
           Minute = 0
           Incr Hour
           If Hour = 24 Then
              Hour = 0
           End If
           If Hour < 10 Then
              Locate 1 , 1
              Lcd "0"
              Locate 1 , 2
           Else
              Locate 1 , 1
           End If
           Lcd Hour
        End If
        If Minute < 10 Then
           Locate 1 , 4
           Lcd "0"
           Locate 1 , 5
        Else
           Locate 1 , 4
        End If
        Lcd Minute
     End If
     If Second < 10 Then
        Locate 1 , 7
        Lcd "0"
        Locate 1 , 8
     Else
        Locate 1 , 7
     End If
     Lcd Second
     Start Timer0
  End If
  Timer0 = 0
Return

0 ответов

Другие вопросы по тегам