-
Kann man die Zeit nicht einfach als "Uhrzeit" ausgeben also 00:00:00???
z.B. so in etwa:
Code:
Dim Sekunden As Byte , Minuten As Byte , Stunden As Byte 'ganz wichtig alles zusammen in eine Zeile!!!!
Dim Uhr As String * 8 'zum konvertieren in 00:00:00
Config Clock = Soft 'um die Uhrkonvertierung einzustellen!!!
Do
Uhr = Time(sekunden) 'konvertierung der Uhrzeit
Loop
Print "Uhrzeit" ; Uhr
war so ne Idee,
Tobi
-
Hallo Tobi!
Ich hab Deinen Vorschlag mal geladen, da geht nix. Macht aber nix, denn meine Anzeige funktioniert ja inzwischen wunderbar auch wenn's etwas umständlich gemacht ist.
Deines hab ich mir trotzdem mal abgespeichert.
Ich werde es mir bei Gelegenheit nochmal genauer ansehen.
Das mit den Bascom Uhrzeitbefehlen hatte ich schon mal über Weihnachten probiert und nicht hinbekommen.
Danke für die Mühe.
Gruß
Hans
-
Hallo,
hatte mal zum testen eine "Datenlogger" gebaut um Daten nur mal so - eben schnll zu speichern. Und da hab ich die Uhr drinn - und die funktioniert!
kannst ja mal das Prog laden:
Code:
'Stommessung mit AT MEGA 8 0/4-20mA A/D Wandler
'Version 0.1 (22.12.2007 fertiggestellt)
'1 Analogeingang mit 4*1kOhm paralell=250 Ohm -> 0-20mA = 0-5V = 0-100%
'Uhr
'Led 1 an PB0 blinkt im Sekundentakt
'Led 2 an PB2 leuchtet in dem Moment wenn ein Wert gespeichert wird
'Led 3 an PB2 leuchtet in dem Moment wenn die Werte gesendet werden
'Taster an PC3 um Daten zu senden (Widerstand auf +5V / Taster auf Masse)
'
'Version 0.2
'mit LCD Ausgabe
'Uhrzeit im richtigem Format 00:00:00
'Uhrzeit über PC4 und PC5 einstellbar
'Startzeit wird beim auslesen mitgesendet (Variable Uhr_Speicher)
'in der Variable Uhr_Speicher wird die Uhrzeit gespeichert die beim Zählerstand 0 aktuell war
'also erst Uhr stellen und dann Speicher auslesen um die Variable Zähler auf 0 zu setzen und die aktuelle Uhrzeit zu speichern
'-------------------------------------------------------------------------------
'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 Sekunden As Byte , Minuten As Byte , Stunden As Byte 'ganz wichtig alles zusammen in eine Zeile!!!!
Dim Uhr As String * 8 'zum konvertieren in 00:00:00
Config Clock = Soft 'um die Uhrkonvertierung einzustellen!!!
Dim Sekunden_alt As Byte 'um Veränderungen zu merken
Dim Uhr_speicher As String * 8 'um startzeit zu speichern
'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(450) 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
Uhr = Time(sekunden) 'konvertierung der Uhrzeit
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
'-------------------------------------------------------------------------------
'Startzeit speichern:
If Zähler = 0 Then
Uhr_speicher = Uhr
End If
'-------------------------------------------------------------------------------
'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
Print "Startzeit: " ; Uhr_speicher 'Startzeit senden
'Zeit ausgeben:
For Zähler = 1 To 450 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
'Variablen löschen:
For Zähler = 1 To 450 Step 1 'Zähler hochzählen um jede Variable (WertX) zu senden
Wert(zähler) = 0 'WertX löschen
Waitms 1 'kurze Warte
Next
Zähler = 0 'Zähler auf 0 zurücksetzen
Else 'wenn alle Variablen gesendet und gelöscht wurden
Portb.3 = 0 'Led "AUS" kein Daten Senden
End If
'-------------------------------------------------------------------------------
'-------------------------------------------------------------------------------
'UHR einstellen:
'Minuten +
If Pinc.4 = 0 And Minuten <= 59 Then
Minuten = Minuten + 1
Waitms 300
End If
'Stunden+
If Pinc.5 = 0 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: " ; + Str(stunden) ; ":" ; + Str(minuten) ; ":" ; + Str(sekunden)
Lcd "Uhrzeit: " ; Uhr
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: " ; 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
'===============================================================================
'Pinbelegung µC 4-20mA
'===============================================================================
' AT MEGA 8
'PD0 = RXD +---U---+
'PD1 = TXD Reset PC6 +1 28+ PC5 Taster1 (links)
'PD2 = Freigabe RXD PD0 +2 27+ PC4 Taster2 (mitte)
'PD3 = TXD PD1 +3 26+ PC3 Taster3 (rechts)
'PD4 = Freigabe PD2 +4 25+ PC2
'PD5 = PD3 +5 24+ PC1 (ADC1) 4-20mA von Freelance
'PD6 = LCD / DB7 PD4 +6 23+ PC0 (ADC0)
'PD7 = LCD / E Vcc +7 22+ GND
'PB0 = LCD / RS GND +8 21+ AREF
'PB1 = PWM / Motor PB6 +9 20+ AVCC
'PB2 = LCD / DB6 PB7 +10 19+ PB5
'PB3 = LCD / DB5 PD5 +11 18+ PB4 / LCD / DB4
'PB4 = LCD / DB4 / LCD / DB7 PD6 +12 17+ PB3 / LCD / DB5
'PB5 = / LCD / E PD7 +13 16+ PB2 / LCD / DB6
'PB6 = / LCD / RS PB0 +14 15+ PB1 / OC1 / PWM MOTOR
'PB7 = +-------+
'PC0 = (ADC0)
'PC1 = (ADC1) 4-20mA von Freelance
'PC2 =
'PC3 = Taster3
'PC4 = Taster2
'PC5 = Taster1
'PC6 =
'PC7 =
'===============================================================================
'Pinbelegung AM LCD!!!!!!! ACHTUNG!!!!!
'===============================================================================
'Pin 1: GND
'Pin 2: +5V
'Pin 3: Kontrast (0-5V)
'Pin 4: RS -> AVR
'Pin 5: R/W -> GND (read/write mode, nur writen)
'Pin 6: E -> AVR
'Pin 7-10: -> GND
'Pin 11-14: -> AVR -> 11=DB4 / 12=DB5 / 13=DB6 / 14=DB7
'Pin 15-16: Beleuchtung
-
Hallo Tobias!
Genau sowas habe ich gesucht. Ich hab mir ein paar Teile von Dir in mein Programm eingebaut und angepasst. => es geht! Super!!
Auch Deine Struktur gefällt mir, das werde ich ab jetzt auch so machen.
Danke auch für die Erklärungen die Du dazu geschrieben hast.
Gruß
Hans
-
Das freunt mich - ich find das auch besser als irgendwelche zusammenhangslose Codeschnipsel - die schwer zu verstehen sind
PS: ich hoffe die Uhr läuft jetzt auch :-)
-
Das freut mich - ich find das auch besser als irgendwelche zusammenhangslose Codeschnipsel - die schwer zu verstehen sind
PS: ich hoffe die Uhr läuft jetzt auch :-)
-
ups - dumm gelaufen - schade
-
Ja die läuft prima!
Danke nochmal.
Gruß
Hans
-
Uhr läuft nicht richtig
hallo habe das 2 Programm zum laufen gekriegt.
Benutz myAVR Board mit Atmega 8A
3,6864 MHz.
habe das Programm laufen und die Uhrzeit , zeigt 9:47:45 und es real 10:20
wie kann man das so schreiben das die Sekunden richtig laufen
-
Hallo Hans,
noch eine Anmerkung:
Code:
If Minuten = 60 Then
Minuten = 0
Incr Stunden
End If
Ist schlechter Programmierstil und unsicher!
Stell dir vor, Minuten hat den Wert 61.
So etwas kann immer mal durch eine Störung auftreten.
Wird jetzt noch eine 32-Bit Datentyp verwendet, dauert es Jahrhunderte bis zum Overflow auf 0.
Man sollte also immer
Code:
If Minuten => 60 Then
Minuten = 0
Incr Stunden
End If
oder
Code:
If Minuten > 59 Then
Minuten = 0
Incr Stunden
End If
verwenden!
Wie ich gesehen habe, wurde es in den anderen Code-Beispielen richtig gemacht.
Solche Details machen den Unterschied zwischen stabilen Programmen und den anderen, mit unerklärlichen Abstürzen aus.
Man sollte immer damit rechnen, dass auch einmal Störungen auftreten können oder das ein Modul mit falschen, ungültigen Parametern aufgerufen wird. In solchen Fällen sollte das Programm nicht gleich abstürzen, sondern irgendwie wieder auf die Füsse fallen!
Hier ein sehr bekanntes Beispiel, welches die Ursache darin hatte, dass man bewährte Software verwendet hat:
http://www4.in.tum.de/lehre/seminare...g-27-11-02.pdf
MfG Peter(TOO)