Hallo zusammen!
Der Zähler zählt zwar in Abhängigkeit des Einganges. d.h. wenn Eingang da wird gezählt, wenn Eingang weg wird gestoppt usw.
Die Anzeige geht auch so einigermaßen.
Die Betriebsstunden werden im folgenden Format angezeigt:
h=0000:00 bis h=9999:59
Das Problem ist:
Wenn ich die Betriebsspannung kurz wegnehme oder einen Reset mache
ist alles wieder weg und er fängt mit den Betriebsstunden von vorne an.
Mit dem Fusebit habe ich rumgespielt und dachte jetzt gehts, aber das war nicht.
Das Fusebits steht so: "0:Preserve EEPROM when chip erase"
Immer bei Reset, Spannung Aus/Ein oder beim auslesen "EEPROM in Buffer" mit dem Bascomcompiler löscht er alles und fängt wieder von vorne an.
Was mach ich da falsch?
So hab ichs gemacht:
Code:
'///////////////////////////////////////////////////////////////////////////////
'// Stand: 22.02.2008
'// Name: "Betriebsstunden"
'///////////////////////////////////////////////////////////////////////////////
'// ATMEGA8- SelbstBauModul
' Funktion:
' Zählt die Betriebsstunden im Format: h=0000:00 bis 9999:59
'
'
'///////////////////////////////////////////////////////////////////////////////
$regfile = "m8def.dat"
$crystal = 14745600 'Externes Quarz 14,7456 Mhz
$baud = 9600
'-------------------------------------------------------------------------------
'/// Definitionen //////////////////////////////////////////////////////////////
'-------------------------------------------------------------------------------
Config Lcd = 20 * 4
Config Lcdbus = 4
Config Lcdpin = Pin , Db4 = Portd.2 , Db5 = Portd.3 , Db6 = Portd.4
Config Lcdpin = Pin , Db7 = Portd.5 , E = Portd.7 , Rs = Portd.6
Cursor Off Noblink
Cls
'/// UHRZEIT ///////////////////////////////////////////////////////////////////
Dim Sekunde As Word
Dim Minute As Word
Dim Stunde As Word
'/// Betriebstundenzähler //////////////////////////////////////////////////////
Dim M As Word
Dim H As Word
Dim S As Word
Dim M_eprom As Eram Word 'Zum abspeichern der Min ins Eprom
Dim H_eprom As Eram Word 'Zum Abspeichern der h ins Eprom
'/// Eingänge //////////////////////////////////////////////////////////////////
Config Pinb.0 = Input ' Pin B.0 Switch 0
Config Pinb.1 = Input ' Pin B.1 Switch 1
'/// Ausgänge //////////////////////////////////////////////////////////////////
Config Pinb.2 = Output ' Pin B.2 als OUTPUT => da hängt das Relais+LED
'/// TIMER 1 vorbesetzen ///////////////////////////////////////////////////////
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
'Zum Test Betriebsstunden setzen
'S = 57
'H = 9998
'-------------------------------------------------------------------------------
'////////////////////////// HAUPTPROGRAMM //////////////////////////////////////
'-------------------------------------------------------------------------------
Main:
Do
If Pinb.0 = 0 Then 'Motor= Ein => d.h. Zähler läuft
Gosub Betr_h_motor 'Betriebs h Motor zählen
End If
Loop
End
'-------------------------------------------------------------------------------
'/// Timer1 aufruf für Sekundentakt ////////////////////////////////////////////
'-------------------------------------------------------------------------------
Ontimer1: 'Interrupt-Routine
Timer1 = Startwert
'Toggle Portb.2 'Relais und LED am Ausg D.2 im SekTakt
Incr Sekunde
Incr S
If Sekunde = 60 Then
Sekunde = 0
Incr Minute 'Eine Minute ist um
Incr M 'Für Betriebsstunden min
End If
If Minute = 60 Then
Minute = 0
Incr Stunde
Incr H 'Für Betriebsstunden h
End If
If Stunde = 24 Then
Stunde = 0
End If
Return
'-------------------------------------------------------------------------------
'/// LCD Anzeige der Betriebsstunden und Minuten in Form "h=9999:59" ///////////
'-------------------------------------------------------------------------------
Betr_h_motor:
'Anzeige des "h="
Locate 4 , 1
Lcd "h="
Waitms 100
'TRENNZEICHEN zwischen Stunden und Minuten
Locate 4 , 7
Lcd ":"
Waitms 100
'M I N U T E N A N Z E I G E
'Bei 0...9 eine Null davorstellen 09
If S <= 9 Then
Locate 4 , 8
Lcd "0"
Waitms 100
Locate 4 , 9
Lcd S
Waitms 100
End If
If S > 9 Then
Locate 4 , 8
Lcd S
Waitms 100
End If
'Stunden hochzählen wenn Sekunden >59 auf Null setzen
If S >= 59 Then
S = 0
H = H + 1
End If
'Stunden bei >9999h auf Null sezen
If H > 9999 Then
H = 0
End If
' S T U N D E N A N Z E I G E
'Zwischen 0...9 drei Nullen davorstellen 0009
If H =< 9 Then
Locate 4 , 3
Lcd "000"
Waitms 100
Locate 4 , 6
Lcd H
Waitms 100
End If
'Zwischen 10...99 zwei Nullen davorstellen 0099
If H >= 10 And H <= 99 Then
Locate 4 , 3
Lcd "00"
Waitms 100
Locate 4 , 5
Lcd H
Waitms 100
End If
'Zwischen 100... 999 eine Null davorstellen 0999
If H >= 100 And H <= 999 Then
Locate 4 , 3
Lcd "0"
Waitms 100
Locate 4 , 4
Lcd H
Waitms 100
End If
'Zwischen 1000 ... 9999 direkt anzeigen
If H >= 1000 And H <= 9999 Then
Locate 4 , 3
Lcd H
Waitms 100
End If
'Aktuellen Wert ins EEPROM speichern
Writeeeprom S , &H00 'Variable S auf Adresse 00 im EEPROM speichern
Writeeeprom H , &H10 'Variable H auf Adresse 00 im EEPROM speichern
Return
Lesezeichen