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







Zitieren

Lesezeichen