PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Uhrzeit h:m:s in BASCOM auf LCD darstellen?



Hans55
22.01.2008, 20:59
Hallo!
Ich versuche die Uhrzeit am LCD darzustellen. Aber bei den Sekunden
bleibt beim umschalten z.B. von 23:59:59 auf 0:0:0 jedesmal die 59
bei den sekunden stehen.
Das schaut dann so aus: 0:0:0:59
Sonst läufts aber.
Was mach ich da falsch, weiß das jemand?

Das ist der Code:


' ATMEGA8- SelbstBauModul
$regfile = "m8def.dat"
$crystal = 14745600 'ext. Quarz
' /// UHR
Dim Sekunde As Word
Dim Minute As Word
Dim Stunde As Word

'// Zum setzten von Stunde Minute Sekunde setzen
Sekunde = 55
Minute = 59
Stunde = 23

'/// LCD ///
Config Lcd = 20 * 4
Config Lcdbus = 4

' LCD im 4Bit I/O Mode
Config Lcdpin = Pin , Db4 = Portd.2 , Db5 = Portd.3 , Db6 = Portd.4
Config Lcdpin = Pin , Db7 = Portd.5 , E = Portd.7 , Rs = Portd.6
Cls
'/// TIMER ////

Config Timer1 = Timer , Prescale = 256
Const Startwert = 7936

On Timer1 Ontimer1 'Interrupt-Routine für Timer1-Overflow
Enable Timer1 'Timer1-Overflow-Interrupt einschalten
Enable Interrupts 'Interrupts global zulassen
'-------------------------------------------------------------------------------
Main:
Do
'Uhrzeit in Sekunde Minute Stunde
If Sekunde = 60 Then
Sekunde = 0
Incr Minute
End If

If Minute = 60 Then
Minute = 0
Incr Stunde
End If

If Stunde = 24 Then
Stunde = 0
End If

'/// LCD Anzeige Stunde Minute Sekunde
Cursor Off Noblink
Home
Lcd Stunde ; ":" ; Minute ; ":" ; Sekunde
Waitms 100
Loop
Goto Main

End
'//////////////////
Ontimer1:
Timer1 = Startwert
Incr Sekunde
Return

Sauerbruch
22.01.2008, 23:34
Ist glaub´ ich ganz einfach:

23:59:59 sind 8 Stellen, während 0:0:0 nur 5 Zeichen sind. Die letzten 3 werden folglich nicht überschrieben, wenn die Uhr auf 0 Uhr umspringt, und deshalb hängt noch der Rest ":59" hinten dran.

(Das gleiche Problem nur mit weniger Zeichen müsste auftreten, wenn die Sekunden oder Minuten von 59 auf 0 umspringen - dann müssten hinten auch noch ein bis zwei überflüssige Zeichen rauslugen - stimmt´s?)

Die einfachste Lösung wäre die, dass Du hinter die Sekunden noch 3 Leerzeichen hängst:


LCD Stunde; ":"; Minute; ":"; Sekunde; " "

Oder Du machst jedesmal ein "CLS", wenn eine der Variablen auf 0 gesetzt wird und der "Text" dadurch kürzer wird.

Hans55
23.01.2008, 07:14
Hallo und Danke für die Info!
Ja mit einem CLS bei den Sek,Min,H funktionierts!
Danke
Gruß
Hans

Sauerbruch
23.01.2008, 09:52
Super!

Und als Code-Minimierer hab´ ich noch bemerkt, dass ein einziges CLS bei den Sekunden reichen müsste, denn einem Reset der Minuten und Stunden geht ja immer und zwingend ein Rücksetzen der Sekunden voraus.

Aber der Ehrgeiz einen oder zwei Befehle einsparen zu können, kommt mit der Zeit ganz von selbst - Hauptsache, dass das Programm erstmal das macht, was Du möchtest O:)

Gruß,

Daniel

Hans55
23.01.2008, 18:48
Hallo Daniel!
Ja, mit einem cls gehts auch!
Danke nochmal.

Gruß
Hans

Stromi
23.01.2008, 23:48
Naja mit dem Locate-Befehl steht die Anzeige, auch mit Vornullen, immer richtig.
Müste auch ähnlich mit Fusing oder Format gehen, dann muss vorher aber in Strings gewandelt werden.




$sim
' ATMEGA8- SelbstBauModul
$regfile = "m8def.dat"
$crystal = 14745600 'ext. Quarz
' /// UHR
Dim Sekunde As Word
Dim Minute As Word
Dim Stunde As Word
Dim H As String * 2
Dim H1 As String * 2
Dim M As String * 2
Dim M1 As String * 2
Dim S As String * 2
Dim S1 As String * 2



'// Zum setzten von Stunde Minute Sekunde setzen
Sekunde = 55
Minute = 59
Stunde = 3

'/// LCD ///
Config Lcd = 20 * 4
Config Lcdbus = 4

' LCD im 4Bit I/O Mode
Config Lcdpin = Pin , Db4 = Portd.2 , Db5 = Portd.3 , Db6 = Portd.4 , Db7 = Portd.5 , E = Portd.7 , Rs = Portd.6

'/// TIMER ////

Config Timer1 = Timer , Prescale = 256
Const Startwert = 7936

On Timer1 Ontimer1 'Interrupt-Routine für Timer1-Overflow
Enable Timer1 'Timer1-Overflow-Interrupt einschalten
Enable Interrupts 'Interrupts global zulassen
Cursor Off Noblink
Cls

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

Do
'Uhrzeit in Sekunde Minute Stunde
If Sekunde > 59 Then
Sekunde = 0
Incr Minute
End If

If Minute > 59 Then
Minute = 0
Incr Stunde
End If

If Stunde > 23 Then
Stunde = 0
End If

'/// LCD Anzeige Stunde Minute Sekunde

Home
H = Str(stunde)
H1 = Format(h , "00")
M = Str(minute)
M1 = Format(m , "00")
S = Str(sekunde)
S1 = Format(s , "00")
Lcd H1 ; ":" ; M1 ; ":" ; S1
'Waitms 100
Loop


End
'//////////////////
Ontimer1:
Timer1 = Startwert
Incr Sekunde
Return
Hier mal ein Beispiel das ich aus dem www habe:

$sim
$regfile = "M128def.dat"
$crystal = 16000000
$hwstack = 128 ' default use 32 for the hardware stack
$swstack = 128 'default use 10 for the SW stack
$framesize = 128 'default use 40 for the frame space

'$lib "lcd4busy.lbx"
'$lib "lcd4.lbx"
'$lib "i2c_twi.lbx"
'$baud = 19200

Config Portb = Input
Config Portd = Input
Portb = 255
Config Portg = Input
Portg.0 = 1
Config Portc = Output
'Config Portd = Output
Ddra = 00000000
Porta = 255

Dim Count As Byte
Dim Stunden As Byte
Dim Temp As Byte
Dim Tag As Byte
Dim Tag_str As String * 2
Dim Plus As Byte
Dim Minus As Byte
Dim Uhrzeit(10) As Byte 'enthält die uhrzeit und das datum vorteil kann leicht erweitert werden.
Dim Uhr_help As Byte

Dim Uhrzeit_std As String * 2
Dim Uhrzeit_min As String * 2
Dim Tag_datum As String * 2
Dim Monat As String * 2
Dim Jahr As String * 2


Enable Interrupts

Config Lcd = 20 * 4a , Chipset = Ks077
Config Lcdpin = Pin , Db4 = Portc.4 , Db5 = Portc.5 , Db6 = Portc.6 , Db7 = Portc.7 , E = Portc.2 , Rs = Portc.1

Initlcd
'we run it in bus mode and I hooked up only db4-db7

'tell about the bus mode
'[now init the clock]

Config Date = Dmy , Separator = / ' Deutsches-Format
Config Clock = Soft '

'The format isTag/Monat/Jahr
Date$ = "18/04/07"
Time$ = "00:00:00"

'---------------------------------------------------
'clear the LCD display
Cls
Cursor Off Noblink
Do
Gosub Page
Gosub Tastenabfrage 'Hauptprogramm
Loop

End

Tag:
Tag = Dayofweek()
Select Case Tag
Case 0 : Tag_str = "Mo" 'Die softclock liefert nur zahlen von
Case 1 : Tag_str = "Di" 'zahlen von 0-6 dewswegen muss
Case 2 : Tag_str = "Mi" 'die zahl in einem string gewandelt werden
Case 3 : Tag_str = "Do"
Case 4 : Tag_str = "Fr"
Case 5 : Tag_str = "Sa"
Case 6 : Tag_str = "So"
End Select
Return

Tastenabfrage:
Debounce Pina.1 , 0 , Taste_rechts , Sub

Return
'##########################################
Uhrstellen:
Debounce Pina.3 , 0 , Tasteplus , Sub
Debounce Pina.4 , 0 , Tasteminus , Sub
Debounce Pina.1 , 0 , Taste_rechts_uhr , Sub
Debounce Pina.6 , 0 , Taste_links , Sub
Debounce Pina.2 , 0 , Enter_raus , Sub
Return
'----------------------------------------
Tasteplus:
If Plus = 1 Then Incr Uhrzeit(1)
If Plus = 2 Then Incr Uhrzeit(2)
If Plus = 3 Then Incr Uhrzeit(3)
If Plus = 4 Then Incr Uhrzeit(4)
If Plus = 5 Then Incr Uhrzeit(5)
If Plus = 6 Then Incr Uhrzeit(6)
If Plus = 7 Then Incr Uhrzeit(7)
If Plus = 8 Then Incr Uhrzeit(8)
If Plus = 9 Then Incr Uhrzeit(9)
If Plus = 10 Then Incr Uhrzeit(10)

If Uhrzeit(1) > 2 Then Uhrzeit(1) = 0
If Uhrzeit(2) > 9 Then Uhrzeit(2) = 0
If Uhrzeit(3) > 5 Then Uhrzeit(3) = 0
If Uhrzeit(4) > 9 Then Uhrzeit(4) = 0
If Uhrzeit(5) > 3 Then Uhrzeit(5) = 0
If Uhrzeit(6) > 9 Then Uhrzeit(6) = 0
If Uhrzeit(7) > 1 Then Uhrzeit(7) = 0
If Uhrzeit(8) > 9 Then Uhrzeit(8) = 0
If Uhrzeit(9) > 9 Then Uhrzeit(9) = 0
If Uhrzeit(10) > 9 Then Uhrzeit(10) = 0


Return
'-----------------------------
Tasteminus:
If Plus = 1 Then Decr Uhrzeit(1)
If Plus = 2 Then Decr Uhrzeit(2)
If Plus = 3 Then Decr Uhrzeit(3)
If Plus = 4 Then Decr Uhrzeit(4)
If Plus = 5 Then Decr Uhrzeit(5)
If Plus = 6 Then Decr Uhrzeit(6)
If Plus = 7 Then Decr Uhrzeit(7)
If Plus = 8 Then Decr Uhrzeit(8)
If Plus = 9 Then Decr Uhrzeit(9)
If Plus = 10 Then Decr Uhrzeit(10)

If Uhrzeit(1) > 2 Then Uhrzeit(1) = 2
If Uhrzeit(2) > 9 Then Uhrzeit(2) = 9
If Uhrzeit(3) > 5 Then Uhrzeit(3) = 5
If Uhrzeit(4) > 9 Then Uhrzeit(4) = 9
If Uhrzeit(5) > 3 Then Uhrzeit(5) = 3
If Uhrzeit(6) > 9 Then Uhrzeit(6) = 9
If Uhrzeit(7) > 1 Then Uhrzeit(7) = 0
If Uhrzeit(8) > 9 Then Uhrzeit(8) = 0
If Uhrzeit(9) > 9 Then Uhrzeit(9) = 0
If Uhrzeit(10) > 9 Then Uhrzeit(10) = 0


Return
'-----------------
Taste_rechts:
Cursor On Noblink
Cls
Plus = 1
Locate 1 , 8
Lcd "--:--"
Locate 2 , 8
Lcd "00/00/07"
Locate 1 , 8
Do
Gosub Uhrstellen
Select Case Plus
Case 1 : Locate 1 , 8
Lcd Uhrzeit(1)
Locate 1 , 8
Case 2 : Locate 1 , 9
Lcd Uhrzeit(2)
Locate 1 , 9
Case 3 : Locate 1 , 11
Lcd Uhrzeit(3)
Locate 1 , 11
Case 4 : Locate 1 , 12
Lcd Uhrzeit(4)
Locate 1 , 12
Case 5 : Locate 2 , 8
Lcd Uhrzeit(5)
Locate 2 , 8
Case 6 : Locate 2 , 9
Lcd Uhrzeit(6)
Locate 2 , 9
Case 7 : Locate 2 , 11
Lcd Uhrzeit(7)
Locate 2 , 11
Case 8 : Locate 2 , 12
Lcd Uhrzeit(8)
Locate 2 , 12
Case 9 : Locate 2 , 14
Lcd Uhrzeit(9)
Locate 2 , 14
Case 10 : Locate 2 , 15
Lcd Uhrzeit(10)
Locate 2 , 15

End Select

Loop Until Pina.2 = 0
Uhrzeit_std = Str(uhrzeit(1)) + Str(uhrzeit(2)) 'wandelt zahl in string um und packt 2 zahlen in eine speicherstelle
Uhrzeit_min = Str(uhrzeit(3)) + Str(uhrzeit(4)) ' 00000001+ 00000010 = 0000000100000010 ----> "12 "
Tag_datum = Str(uhrzeit(5)) + Str(uhrzeit(6))
Monat = Str(uhrzeit(7)) + Str(uhrzeit(8))
Jahr = Str(uhrzeit(9)) + Str(uhrzeit(10))
_hour = Val(uhrzeit_std )
_min = Val(uhrzeit_min) 'umwanden vom string in eine zahle und übergabe an die uhr internen variablen.
_day = Val(tag_datum)
_month = Val(monat)
_year = Val(jahr)
_sec = 00
Cls
Return
'-----------------------------
Taste_links:
Decr Plus
If Plus > 10 Then Plus = 10

Return
'------------------------------
Enter:

Return
'------------------------
Enter_raus:

Return
Taste_rechts_uhr:
Incr Plus
If Plus > 10 Then Plus = 1

Return

'-----------------------
Page:
Gosub Tag
'cursor home
Locate 1 , 7
Lcd Date$
Locate 2 , 7
Lcd Time$
Locate 3 , 10
'show the date and time
Lcd Tag_str
Locate 4 , 13
Lcd "Press >"
Return

Hans55
24.01.2008, 20:02
Hallo Stromi!
Das Programm mit der Umwandlung in String, hab ich geladen, es zeigt gar nix an. Irgendwas huscht aber über die Zeilen.
Keine Ahnung wo der Fehler liegt.

Gruß
Hans

Hans55
24.01.2008, 21:32
Hallo Stromi!
Ich hab den Fehler gefunden. Bei "... String * 2" muss statt der *1 die *2 stehen dann gehts.
Die Anzeige ist allerdings auch nicht anders, nur dass man erst in String umwandelt und dann anzeigt.
Hat das irgendeinen Vorteil?
Gruß
Hans

Stromi
24.01.2008, 22:52
Die Anzeige ist, zumindest im Simulator, immer mit den Doppelpunkten nach links verrutscht. Und jetzt bleiben die Doppelpunkte wo sie sind. Zum Testen am Anfang des Codes $Sim schreiben kennst du, dann den Timerinterupt triggern und Spass haben....
Teste mal deinen orginalen Code, dann den mit CLS und dann mit Strings und berichte. Scheinbar willst du noch mehr machen, du benutzt 4 Zeilendisplay und Main und goto Main, brauchst du so nicht, weißt du sicher.

Hans55
25.01.2008, 18:13
Hallo Stromi!
Ich hatte das Problem bei meinem Code, dass durch das CLS natürlich immer die Anzeige kurz ausging. Das schaut bescheuert aus. Vor allem wenn auf dem Display noch andere Werte angezeigt werden.
Ich habs nun so gelöst:
Bei Zeitwerten <10 wird einfach an die richtige Stelle eine 0 hingestellt. Das schaut dann in der Anzeige so aus: 09:01 Uhr
Sobald der Wert von 9 auf 10 springt bleibt alles an der richtigen Stelle, außerdem schauts besser aus, wenn ein Null davor steht. Es ruckt nichts hin und her. Das ganze nur durch ein paar Codezeilen mehr.
Den Doppelpunkt ":" und die Anzeige "Uhr" lasse ich immer an der gleichen Stelle. Es funktioniert so wunderbar.
Du hast natürlich recht, der Code ist noch nicht so optimal! Bevor ich weitermache muß ich erst noch ein wenig optimieren und einigen Unsinn rauswerfen. z.B. werde ich mehr in Unterprogramme reinpacken die ich dann nur aufrufe. Das mit dem Optimieren ergibt sich vermutlich automatisch je mehr Ahnung ich von der Programmierung habe.
Noch bin ich ein Anfänger.
Meine Schaltung und der Controller machen aber inzwischen das, was ich wollte. => Zeigt Strom (0....100A) und Spannung (0...20V) und die Uhrzeit auf dem Display an. Außerdem bekomme ich eine SMS geschickt, wenn die Batteriespannung unter die Entladeschlußspannung fällt.
Was noch fehlt ist eine Temperaturanzeige, das will ich mit einem DS1620 machen oder wie der heißt, muß mich erst noch informieren.
Wie gesagt, es ist noch nicht optimal aber es fällt mir jeden Tag was neues ein was man mit den freien Ein/Ausgängen noch so alles machen könnte.

Danke nochmal für die Hilfe!
Gruß
Hans

TobiasBlome
25.01.2008, 21:37
Kann man die Zeit nicht einfach als "Uhrzeit" ausgeben also 00:00:00???

z.B. so in etwa:


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

Hans55
25.01.2008, 22:03
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

TobiasBlome
25.01.2008, 22:39
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:


'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

Hans55
26.01.2008, 09:10
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

TobiasBlome
26.01.2008, 09:41
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 :-)

TobiasBlome
26.01.2008, 09:42
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 :-)

TobiasBlome
26.01.2008, 09:43
ups - dumm gelaufen - schade

Hans55
26.01.2008, 11:54
Ja die läuft prima!
Danke nochmal.
Gruß
Hans

Unregistriert
05.05.2015, 10:21
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

Peter(TOO)
05.05.2015, 15:54
Hallo Hans,

noch eine Anmerkung:


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

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


oder

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/ps/WS0203/desaster/Riedl-Arianne5-Ausarbeitung-27-11-02.pdf

MfG Peter(TOO)

Unregistriert
06.05.2015, 09:17
$regfile = "m8def.dat"
$crystal = 16000000
$hwstack = 100
$swstack = 100
$framesize = 100


Config Lcdpin = Pin , Db4 = Portd.4 , Db5 = Portd.5 , Db6 = Portd.6 , Db7 = Portd.7 , E = Portd.3 , Rs = Portd.2
Config Lcd = 16 * 2

$baud = 9600
$regfile "m8def.dat"
$crystal = 16000000
Config Lcd = 16 * 2
Dim Sekunde As Word
Dim Minute As Word
Dim Stunde As Word
Dim S1 As String * 2
Dim S2 As String * 2
Dim S3 As String * 2

'Minuten Einstellen
Config Pinb.4 = Input
Portb.4 = 1
Taster0 Alias Pinb.4

'Stunden Einstellen
Config Pinb.5 = Input
Portb.5 = 1
Taster1 Alias Pinb.5


Config Timer1 = Timer , Prescale = 64

Enable Timer1
On Timer1 Test
Enable Interrupts
Timer1 = 240

Cls
Cursor Off Noblink
'------------ Uhr Voreinstellung ----------------------------------------------
Sekunde = 0
Minute = 0
Stunde = 0

Do

'-------------------- Formatkonvertierung für Uhrzeit -------------------------
S1 = Str(stunde)
S1 = Format(s1 , "00")
'----------------------------------
S2 = Str(minute)
S2 = Format(s2 , "00")
'------------------------------------
S3 = Str(sekunde)
S3 = Format(s3 , "00")
'--------------------------------------
' S1 ist nun die Variable für Stunde
' S2 ist nun die Variable für Minuten
' S3 ist nun die Variable für Sekunden

'----------- Anzeige Stunden , Minuten, Sekunden auf Display ------------------

Locate 2 , 13
Lcd S3
Locate 2 , 11
Lcd ":"
Locate 2 , 8
Lcd S2
Locate 2 , 6
Lcd ":"
Locate 2 , 3
Lcd S1
Locate 1 , 1
Lcd "Aktuelle Uhrzeit"
Waitms 50


If Sekunde > 59 Then Minute = Minute + 1
If Sekunde > 59 Then Sekunde = 0
If Minute > 59 Then Stunde = Stunde + 1
If Minute > 59 Then Minute = 0
If Stunde > 23 Then Stunde = 0

'--------------Uhr einstellen Minute ------------------------------------------
If Taster0 = 0 Then
Waitms 50
Incr Stunde
End If
'--------------Uhr einstellen Stunde -----------------------------------------
If Taster1 = 0 Then
Waitms 50
Incr Minute
End If
'--------Uhr komplett auf Null stellen ----------------------------------------
If Taster0 = 0 And Taster1 = 0 Then
Sekunde = 0
Minute = 0
Stunde = 0
Waitms 50
End If
'------------------------------------------------------------------------------
Loop

End

Test:
Incr Sekunde


Return


Es läuft eigentlich Gut Tasten kann man Minute und Stunde einstellen