Hallo,
in meinem Program ist unter anderem eine Uhr mit Sekundenanzeige. Zum test gebe ich die Uhrzeit jede Sekunde über RS232 und LCD aus! Über RS232 läuft alles - auf dem LCD kommen regelmäßig merkwürdige Zeichen- hier mal die Sekundenanzeige:
01
02
03
04
05
06
07
08
09
0:
0;
0<
0=
0>
0?
10
11
und dann läuft die Uhr weiter bis:
18
19
1:
1;
1<
1=
1>
1?
20
21 und so weiter...

Hat da jemand eine Erklärung für?

vielen Dank schon mal, Tobias

---schnipp---
'Timer
Dim Stunden As Byte
Dim Minuten As Byte
Dim Sekunden As Byte
Dim Sekunden_alt As Byte 'um Veränderungen zu merken

Stunden = Makebcd(stunden) 'in BCD wegen der Formatierung 00:00:00
Minuten = Makebcd(minuten)
Sekunden = Makebcd(sekunden)
...
Locate 1 , 1
Lcd "Uhrzeit: " ; Bcd(stunden) ; ":" ; Bcd(minuten) ; ":" ; Bcd(sekunden)
---schnipp---


Code:
'Konfiguration µC:

$regfile = "m8def.dat"                                      'AT-Mega8
$crystal = 3686400                                          'Quarz: 3.6864 MHz
$baud = 9600                                                'Baudrate der UART: 9600 Baud


'Analogmessung
Config Adc = Single , Prescaler = Auto , Reference = Avcc

'TIMER
On Timer1 Ontimer1overflow                                  'Timer1-Interruptroutine deklarieren
Config Timer1 = Timer , Prescale = 1024                     '3686400Hz/1024=3600Hz
Enable Timer1
Timer1 = 61935                                              'Sofort Timer1-Überlauf (Bei 16 Bit: 65535+1=0)
Enable Interrupts


'-------------------------------------------------------------------------------
'Ein- Ausgänge:

Ddrb = &B111111                                             '1 Ausgang, 0 Eingang = Pin PB5-0 als Ausgang
Ddrc = &B0000000                                            '1 Ausgang, 0 Eingang = Pin PC6-0 als Eingang


'-------------------------------------------------------------------------------
'LCD konfiguration
Config Lcd = 20 * 4                                         'LCD größe
Config Lcdpin = Pin , Db4 = Portd.2 , Db5 = Portd.3 , Db6 = Portd.4 , Db7 = Portd.5 , Rs = Portd.6 , E = Portd.7

Cursor Off Noblink


'-------------------------------------------------------------------------------
' Variablen
Dim Analog_in0 As Word                                      '=0-1023 vom Analogeingang



'Timer
Dim Stunden As Byte
Dim Minuten As Byte
Dim Sekunden As Byte
Dim Sekunden_alt As Byte                                    'um Veränderungen zu merken

Stunden = Makebcd(stunden)                                  'in BCD wegen der Formatierung 00:00:00
Minuten = Makebcd(minuten)
Sekunden = Makebcd(sekunden)


'Speicherplätze
Dim Zähler As Word                                          'zum Werte hochzählen
Dim Merker As Bit                                           'Werte speichern: damit nur um 1 hochgezählt wird
Dim Wert(470) As Word                                       'speichern des eigendlichen Wertes (470Werte?)

'Umrechnung in Liter
Dim Liter As Integer
Dim Liter1 As Single




'-------------------------------------------------------------------------------
'Programm:
'-------------------------------------------------------------------------------

Zähler = 0                                                  'damit mit Wert1 angefangen wird und nicht mit Wert0 (0 könnte Fehler geben)
Merker = 0                                                  'Werte speichern: damit nur um 1 hochgezählt wird

Do

Start Adc                                                   'Starte analog Messung

'-------------------------------------------------------------------------------
'Analogeingänge Auslesen:
Analog_in0 = Getadc(0)                                      'Wert aus Analogeingang0 laden


'-------------------------------------------------------------------------------
'Merker zurücksetzen
If Minuten = 1 Then                                         'damit jeder Wert nur einmal gespeichert wird
Merker = 0                                                  'Hilfsmerker wird beim speichern gesetzt und hier zurückgesetzt
End If

'---
If Minuten = 16 Then
Merker = 0
End If

'---
If Minuten = 31 Then
Merker = 0
End If

'---
If Minuten = 46 Then
Merker = 0
End If

'-------------------------------------------------------------------------------
'Analogwert umrechnen in Liter
 Liter1 = Analog_in0 * 4.80938416422287
 Liter = Liter1 - 984


'-------------------------------------------------------------------------------
'Werte Speichern alle 15 min:
 If Minuten = 0 And Merker = 0 Then                         'nur speichern, wenn hilfsmerker bereits zurückgesetzt wurde
 Incr Zähler                                                'Zähler für die nächste Speichervariable hochzählen
 Toggle Portb.2                                             'Led bei Speicherung umschalten
 Wert(zähler) = Liter                                       'umgerechneten Analogwert in Speicher (WertX) übertragen
 Merker = 1                                                 'Hilfsmerker setzen
 Print "Zähler: " ; Zähler ; " = " ; Wert(zähler)           'aktuellen Zähler mit Wert anzeigen
 End If

 '---
 If Minuten = 15 And Merker = 0 Then                        'nur speichern, wenn hilfsmerker bereits zurückgesetzt wurde
 Incr Zähler                                                'Zähler für die nächste Speichervariable hochzählen
 Toggle Portb.2                                             'Led bei Speicherung umschalten
 Wert(zähler) = Liter                                       'umgerechneten Analogwert in Speicher (WertX) übertragen
 Merker = 1                                                 'Hilfsmerker setzen
 Print "Zähler: " ; Zähler ; " = " ; Wert(zähler)           'aktuellen Zähler mit Wert anzeigen
 End If

 '---
 If Minuten = 30 And Merker = 0 Then                        'nur speichern, wenn hilfsmerker bereits zurückgesetzt wurde
 Incr Zähler                                                'Zähler für die nächste Speichervariable hochzählen
 Toggle Portb.2                                             'Led bei Speicherung umschalten
 Wert(zähler) = Liter                                       'umgerechneten Analogwert in Speicher (WertX) übertragen
 Merker = 1                                                 'Hilfsmerker setzen
 Print "Zähler: " ; Zähler ; " = " ; Wert(zähler)           'aktuellen Zähler mit Wert anzeigen
 End If

 '---
 If Minuten = 45 And Merker = 0 Then                        'nur speichern, wenn hilfsmerker bereits zurückgesetzt wurde
 Incr Zähler                                                'Zähler für die nächste Speichervariable hochzählen
 Toggle Portb.2                                             'Led bei Speicherung umschalten
 Wert(zähler) = Liter                                       'umgerechneten Analogwert in Speicher (WertX) übertragen
 Merker = 1                                                 'Hilfsmerker setzen
 Print "Zähler: " ; Zähler ; " = " ; Wert(zähler)           'aktuellen Zähler mit Wert anzeigen
 End If


 '-------------------------------------------------------------------------------
'Werte über RS232 Senden:
 If Pinc.3 = 0 Then                                         'Wenn Taster gedrückt
 Portb.3 = 1                                                'Led "EIN" Daten werden gesendet
 For Zähler = 1 To 470 Step 1                               'Zähler hochzählen um jede Variable (WertX) zu senden
 Print "Wert " ; Zähler ; ": " ; Wert(zähler)               'WertX senden
 Waitms 2                                                   'kurze Warte
 Next                                                       'wiederholen, bis alle Variablen gesendet wurden
 Zähler = 1                                                 'Zähler auf 1 zurücksetzen
 Else                                                       'wenn alle Variablen gesendet wurden
 Portb.3 = 0                                                'Led "AUS" kein Daten Senden
 End If




'-------------------------------------------------------------------------------

'-------------------------------------------------------------------------------
'UHR einstellen:

 'Minuten +
 'If Pind.3 = 1 And Minuten <= 59 Then
 'Minuten = Minuten + 1
 'Waitms 300
 'End If

 'Stunden+
 'If Pinc.2 = 1 And Stunden <= 23 Then
 'Stunden = Stunden + 1
 'Waitms 300
 'End If

Gosub Ausgabe

Loop



'-------------------------------------------------------------------------------
'Sprungmarken
'-------------------------------------------------------------------------------

'Uhrzeit erstellen
Ontimer1overflow:                                           'Timer1-Interruptroutine
  'Nächster Überlauf soll in einer Sekunde sein:
  Timer1 = 61936                                            'Überlauf nach 65535, also: 65535+1-3600=61936

  Incr Sekunden

  If Sekunden >= 60 Then
    Sekunden = 0
    Incr Minuten
  End If

  If Minuten >= 60 Then
      Minuten = 0
      Incr Stunden
  End If

  If Stunden >= 24 Then
        Stunden = 0
  End If

  Toggle Portb.0                                            'blink LED zum testen im Sekundentakt



Return


Ausgabe:

'LCD AUSGABE:
If Sekunden_alt <> Sekunden Then

Cls                                                         'Display löschen (IMMER ERST LCD LÖSCHEN UND DANN POSITION ANGEBEN!!!)
Locate 1 , 1
Lcd "Uhrzeit: " ; Bcd(stunden) ; ":" ; Bcd(minuten) ; ":" ; Bcd(sekunden)

Locate 2 , 1
Lcd "Merker doppelt: " + Str(merker) ;

Locate 3 , 1
Lcd "Wert " + Str(zähler) ; ":" + Str(wert(zähler)) ;

Locate 4 , 1
Lcd "Liter: " + Str(liter) ;


'RS232 AUSGABE:
  'Infos nur über RS232 senden, wenn nicht gerade die gespeicherten Daten gesendet werden
  If Portb.3 = 0 Then                                       'WENN Led "AUS" also keine Daten gesendet werden
  Print "Zeit: " ; Stunden ; " : " ; Minuten ; " : " ; Sekunden ; " Uhr"       'Uhrzeit senden
  Print "Analog_in0: " ; Analog_in0                         'Analog Eingangswert senden
  Print "Liter: " ; Liter                                   'umgerechneter Analogwert
  End If

  Sekunden_alt = Sekunden
  End If



  Return                                                      ' wichtig