- MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad         
Ergebnis 1 bis 6 von 6

Thema: Kleines Problem mit der Uhrzeit-Anzeige

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    07.11.2005
    Beiträge
    17

    Kleines Problem mit der Uhrzeit-Anzeige

    Hallo,
    Ich habe mir aus verschiedenen Code-Schippseln eine kleines Uhren-Programm gebastelt.
    Code:
    $regfile = "m8def.dat"
    $crystal = 16000000
    
    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 Timer1 = Timer , Prescale = 256
    On Timer1 Timer1int
    
    Dim Sekunde As Byte
    Dim Minute As Byte
    Dim Stunde As Byte
    
    Enable Interrupts
    
    Stunde = 18
    Minute = 13
    
    Enable Timer1
    
    Main:
    
    Initlcd
       Cls
       Cursor Off
    Do
    
    If Sekunde = 60 Then
       Gosub Minute1
    
    End If
    Locate 1 , 1
    
    If Stunde > 9 Then Lcd Stunde
    If Stunde < 10 Then Lcd "0" ; Stunde
    Lcd ":"
    If Minute > 9 Then Lcd Minute
    If Minute < 10 Then Lcd "0" ; Minute
    Lcd ":"
    If Sekunde > 9 Then Lcd Sekunde
    If Sekunde < 10 Then Lcd "0" ; Sekunde
    
    Loop
    
    Goto Main
    
    Timer1int:
    Timer1 = 3037                                               
    Sekunde = Sekunde + 1
    Return
    
    Minute1:
    Incr Minute
    Sekunde = 0
    If Minute = 60 Then
       Gosub Stunde1
    End If
    
    Return
    
    Stunde1:
    Incr Stunde
    Minute = 0
    If Stunde = 24 Then
       Stunde = 0
    End If
    Return
    Nach anfänglichen Problemen funktioniert das Programm jetzt ganz gut aber, wenn es z.B. 18:14:10 Uhr wird erscheint plötzlich hinter der Sekunden anzeige eine zusätzliche Null (18:14:100Uhr). Was ist das Problem in dem Code? Desweiteren würde ich mich über konstruktive Kritik im Allgemeinen freuen.
    Gruß André

  2. #2
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    25.02.2005
    Beiträge
    175
    Hallo André,

    versuch mal, zunächst die angezeigte Uhrzeit mittels

    locate 1,1
    lcd " " 'Entsprechende Anzahl Leerzeichen

    zu löschen, bevor Du die neue Zeit anzeigst.

    Außerdem, Du schreibst ja zyklisch alle Variablen der Uhrzeit auf´s Diplay - es ist normalerweise sinnvoller, nur die Variable zu schreiben, die sich geändert hat.

    Dafür brauchst Du eine If-then-Abfrage bei der Ausgabe, z. B.:

    if Stunde <> Stunde_alt then
    Stunde_alt = Stunde
    Locate 1,1
    Lcd " " 'Zwei Leerzeichen
    Locate 1,1
    Lcd Stunde
    End if

    (Natürlich noch mit der Formatierung auf Einer und Zehner...)

    Die Doppelpunkte und alle anderen unveränderlichen Texte brauchst Du auch nur 1x vor dem Einstieg in die Do-Loop aufs Display zu schreiben.

    Viele Grüße

    Torsten

  3. #3
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    22.12.2004
    Alter
    70
    Beiträge
    277
    Hallo,

    oh weh... Bitte nicht von hinten durch die Brust ins Auge

    Diese Zeile:
    If Sekunde < 10 Then Lcd "0" ; Sekunde
    um ein angehängtes Leerzeichen ergänzen:
    If Sekunde < 10 Then Lcd "0" ; Sekunde ; " "
    und gut isses.

    Viele Grüße
    Henrik

  4. #4
    Neuer Benutzer Öfters hier
    Registriert seit
    07.11.2005
    Beiträge
    17
    Hallo,
    danke für die Antworten. Durch das angehängte Leerzeichen funktionierts jetzt. Aber warum wird die Null ohne Leerzeichen überhaupt dargestellt? Wo kommt die her?
    Gruß Andre

  5. #5
    Neuer Benutzer Öfters hier
    Registriert seit
    07.11.2005
    Beiträge
    17
    Hallo,
    danke für die Antworten. Durch das angehängte Leerzeichen funktionierts jetzt. Aber warum wird die Null ohne Leerzeichen überhaupt dargestellt? Wo kommt die her?
    Gruß Andre

  6. #6
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    22.12.2004
    Alter
    70
    Beiträge
    277
    Zitat Zitat von OEP
    Hallo,
    danke für die Antworten. Durch das angehängte Leerzeichen funktionierts jetzt. Aber warum wird die Null ohne Leerzeichen überhaupt dargestellt? Wo kommt die her?
    Bei solchen doppelten IF Abragen kann es vorkommen, daß gerade in dem Moment die Sekunde umspringt und beide Bedingungen erfüllt werde. Resultat: Eine Ziffer zuviel.

    Daher statt:

    If Sekunde > 9 Then Lcd Sekunde
    If Sekunde < 10 Then Lcd "0" ; Sekunde

    besser ein solches Konstrukt:

    If sekunde >=10 Then
    Lcd sekunde
    else
    Lcd "0"; sekunde
    end if

    Das sollte man dann für alle Abfagen so machen.

    Es grüßt ein sehr zeitknapper
    Henrik

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad