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







Zitieren

Lesezeichen