logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

(BASCOM)(ATMEGA8)odmierzanie 1 sekundy i wylaczanie sie lcd

simpson777 17 Wrz 2009 14:17 2481 2
REKLAMA
  • #1 7027792
    simpson777
    Poziom 11  
    Witam

    Mam oto taki problem jak ww w temacie. Napisałem program na odmierzanie czasu przerwanie co 1 sekundę i ogólnie po wgraniu programu wszystko działa czas leci i jest wszystko OK. Lecz po chwili a dokładnie 9-14 sekundach wyłącza mi się lcd. Nie wiem w czym jest problem:( A o to program
    
    $regfile = "m8def.dat"
    $crystal = 8000000
    
    '$sim
    
    Config Lcdpin = Pin , Db4 = Portd.0 , Db5 = Portd.1 , Db6 = Portd.2 , Db7 = Portd.3 , E = Portd.7 , Rs = Portd.6
    Config Lcd = 16 * 2
    
    Config Portb = &B11110000
    Portb = &B11110000
    
    
    Config Timer0 = Timer , Prescale = 8
    Stop Timer0
    On Timer0 Przerwanie
    
    Dim Licz As Word
    
    Enable Interrupts                                           'Zgoda na wszystkie odblokowania.
    Enable Timer0                                               'Odblokuj Timer0.
    Stop Timer0
    
    Dim Sekundy As Byte , Minuty As Byte , Godziny As Byte
    Dim Sekundy_d As Byte , Minuty_d As Byte , Godziny_d As Byte
    Dim Flaga_1 As Bit
    
    Sekundy_d = 0
    Sekundy = 0
    Minuty_d = 0
    Minuty = 0
    Godziny_d = 1
    Godziny = 2
    
    
    Cls
    Cls
    Cursor Off
    Start Timer0
    
    Do
    Locate 1 , 1
    Lcd Godziny_d ; Godziny ; ":" ; Minuty_d ; Minuty ; ":" ; Sekundy_d ; Sekundy
    Loop
    End
    
    Przerwanie:
    Start Timer0
    Load Timer = 250
    Incr Licz
    If Licz = 4000 Then
    Licz = 0
    Cls
    Incr Sekundy
    Gosub Zegar
    End If
    Return
    
    
    Zegar:
    If Sekundy = 10 Then
       Sekundy = 0
       Incr Sekundy_d
       If Sekundy_d = 6 Then
          Sekundy_d = 0
          Incr Minuty
          If Minuty = 10 Then
             Minuty = 0
             Incr Minuty_d
             If Minuty_d = 6 Then
                Minuty_d = 0
                Incr Godziny
                If Godziny = 10 Then
                   Godziny = 0
                   Incr Godziny_d
                   If Godziny_d = 2 And Godziny = 4 Then
                      Godziny_d = 0
                      Godziny = 0
    End If
    End If
    End If
    End If
    End If
    End If
    Return
    
  • REKLAMA
  • #2 7028280
    Andy74
    Poziom 25  
    Za dużo kodu w przerwaniu + z obsługi przerwania wywołujesz podprogram = obsługa przerwania trwa za długo, nakładają się kolejne przerwania, stos się przepełnia.
    Spróbuj tak (wykorzystałem Twoją zadeklarowaną, a nie używaną flagę):

    $regfile = "m8def.dat"
    $crystal = 8000000
    
    '$sim
    
    Config Lcdpin = Pin , Db4 = Portd.0 , Db5 = Portd.1 , Db6 = Portd.2 , Db7 = Portd.3 , E = Portd.7 , Rs = Portd.6
    Config Lcd = 16 * 2
    
    Config Portb = &B11110000
    Portb = &B11110000
    
    
    Config Timer0 = Timer , Prescale = 8
    'Stop Timer0
    On Timer0 Przerwanie
    
    Dim Licz As Word
    
    Enable Interrupts                                           'Zgoda na wszystkie odblokowania.
    Enable Timer0                                               'Odblokuj Timer0.
    'Stop Timer0
    
    Dim Sekundy As Byte , Minuty As Byte , Godziny As Byte
    Dim Sekundy_d As Byte , Minuty_d As Byte , Godziny_d As Byte
    Dim Flaga_1 As Bit
    
    Sekundy_d = 0
    Sekundy = 0
    Minuty_d = 0
    Minuty = 0
    Godziny_d = 1
    Godziny = 2
    
    
    'Cls
    Cls
    Cursor Off
    Start Timer0
    
    Do
    If Flaga_1 = 1 Then
       Reset Flaga_1
       Incr Sekundy
       Gosub Zegar
    End If
    Locate 1 , 1
    Lcd Godziny_d ; Godziny ; ":" ; Minuty_d ; Minuty ; ":" ; Sekundy_d ; Sekundy
    Loop
    End
    
    Przerwanie:
    'Start Timer0
    Load Timer = 250
    Incr Licz
    If Licz = 4000 Then
    Licz = 0
    Set Flaga_1
    'Cls
    'Incr Sekundy
    'Gosub Zegar
    End If
    Return
    
    
    Zegar:
    If Sekundy = 10 Then
       Sekundy = 0
       Incr Sekundy_d
       If Sekundy_d = 6 Then
          Sekundy_d = 0
          Incr Minuty
          If Minuty = 10 Then
             Minuty = 0
             Incr Minuty_d
             If Minuty_d = 6 Then
                Minuty_d = 0
                Incr Godziny
                If Godziny = 10 Then
                   Godziny = 0
                   Incr Godziny_d
                   If Godziny_d = 2 And Godziny = 4 Then
                      Godziny_d = 0
                      Godziny = 0
    End If
    End If
    End If
    End If
    End If
    End If
    Return

    Co nieco zaremowałem, bo nie potrzebne. Swoją drogą trochę dziwna konstrukcja z tym liczeniem każdej cyfry zegara osobno, ale jak kto lubi :). Nie testowałem, ale teraz powinno działać. Prawdopodobnie wystarczyło by już wywalenie Cls z obsługi przerwania.
    Powodzenia
    Andy
  • #3 7029016
    Konto nie istnieje
    Poziom 1  
REKLAMA