PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Betriebsstundenzähler mit Bascom



Hans55
23.02.2008, 07:11
Hallo zusammen!
Ich hab ein Problem.
Ich möchte die Motorlaufzeit in Stunden und Minuten zählen, am LCD anzeigen und im Eprom abspeichern.
Immer dann, wenn der Motor eingeschaltet wird, soll er die Summe aus STUNDE und MINUTE aus dem EPROM holen und die neue Laufzeit hinzu addieren. Beim Abschalten des Motors die Laufzeit zur Gesamtlaufzeit hinzuaddieren und ablegen.
Pro Tag etwa 1h Laufzeit, nur Minutengenau.
So sollte ich auch keine Probleme mit der internen Epromzelle bekommen die ja endlich ist.

Ich hab mir folgendes gedacht:

Ich gebe einen Minutentakt über einen PortPin nach außen auf einen Schmitt Trigger z.B. ein 74LS14.
An PIN1 des UND Gatters lege ich den Min- Takt vom Ausgang des AVR an.
An PIN2 des UND-Gatters die 12V (über Vorwiderstand) vom Zündschlüssel des Motors.
Den Ausgang des UND -Gatters führe ich wieder in den AVR.
Als Programm müßte ich nur einen internen Counter laufen lassen, der die Pulse zählt und diese ins EPROM brennt.

Macht man das so? Oder geht das noch einfacher?
Gruß
Hans

Jaecko
23.02.2008, 08:07
Also ich würds anders machen:
Wenn vom Motor ein Signal kommt ob an oder aus, dann diese einfach an einen Pin hängen (wenns 12V noch nen Spannungsteiler davor).
Dann nen Timer im AVR einstellen; z.B. Timer1 im Sekundentakt ne Variable hochzählen lassen. Ist die bei 60 (=1 Minute) einfach prüfen: Welchen Zustand hat der Pin vom Motorsignal? Läuft der Motor: Betriebbstundenzähler erhöhen. Steht er: nix tun.
Da sparst dir die äusseren Logikgatter.

Hans55
23.02.2008, 15:34
Hallo Jaecko!
Erst mal Danke für die Antwort.

Vermutlich hast du Recht, ich werde mir das zusätzlich IC sparen.
Ich bin noch am kämpfen mit dem Programm. Die Betriebsstunden werden abgespeichert, ich sehe sie auch im EPROM aber manchmal isses wieder gelöscht und die Stunden fangen wieder von vorne an zu zählen. Irgendwie scheint da noch der Wurm drin zu sein.
Naja mal sehen.
Gruß
Hans

Jaecko
23.02.2008, 15:44
Kanns sein, dass die Daten gelöscht wurden, nachdem das Programm neu übertragen wurde? Im Compiler oder den Fusebits des AVR gibts eine Funktion, dass der EEProm beim Programmieren gelöscht werden soll. Diese mal abschalten, dann müssten die Daten bleiben.

Hans55
23.02.2008, 18:26
Hallo Jaecko !
Du hattest recht, das Fusebit war auf 1. Jetzt funzt es. Danke!
Kann sein, dass ich mich demnächst nochmal melden muß.
Gruß
Hans

Hans55
24.02.2008, 12:33
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:



'///////////////////////////////////////////////////////////////////////////////
'// 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

Jaecko
24.02.2008, 12:51
Wenn die Variablen eh schon als ERAM deklariert sind, speicher doch einfach die Werte mit "M_Eprom = M" bzw. "H_Eprom = H"; macht im Prinzip das gleiche wie Writeeprom, nur dass Bascom sich eben um die Speicherposition kümmert. Das Laden der Werte geht entsprechend andersrum.

Bei der Anzeige wüsst ich auch was kürzeres: Ich machs immer so, dass ich z.B. bei ner 4-Stelligen Anzeige vor den anzuzeigenden String immer 3 "0" anhänge, dann davon einfach wieder die rechten 4 Zeichen.
z.B. H = 38, dann soll die Anzeige 0038 sein:

lcdstring = "000" + str(h) 'ergibt 00038
lcdstring = right(lcdstring,4) 'ergibt 0038

Hans55
25.02.2008, 20:42
Ich hatte schon mal geantwortet, das wurde leider nicht angezeigt.
Nun nochmal.

Hallo Jaecko!
Nun gehts. Ich hatte zwar ins EEPROM abgespeichert aber nicht ausgelesen.
Danke für die Tipps! Das mit dem Fusebit geht natürlich auch so wie du beschrieben hast.
Ich werde das mit der Anzeige so machen wie du vorgeschlagen hast, ist übersichtlicher und kürzer.

Gruß
Hans

Magic_X
27.07.2008, 12:33
Hallo, Hans55,

scheint so, als hättest du das gebaut, was ich brauche!
Ist es möglich, dass du den überarbeiteten Code zur Verfügung stellst?

Würde mich drüber freuen.
Gruß
Magic_X

dl1akp
29.07.2008, 10:09
Hallo Hans,

würde mich auch interessieren.
Speziell hier das schreiben und lesen in den EEPROM.
Wäre super, wenn Du den Code für den Betriebsstundenzähler posten köntest.

Gruß, dl1akp

dl1akp
29.07.2008, 10:23
Ach ja, hatte ich noch vergessen.

Schließ doch die komplette Schaltung an den Zündungsplus an.
Bei Start, wert aus eeprom lesen und immer aufaddieren.

An der Schaltung ein Goldcap, oder großer ELKO.
Die Betriebsspannung an einen Interrupt-Eingang, Rest der Schaltung mit Diode entkoppelt.
Bei Spannungsverlust, Interrupt ausgelöst, speichern in eeprom.
Die Zeit des Goldcaps reicht dazu aus.

Mfg, dl1akp

Hans55
04.08.2008, 09:19
Hallo!

Ich bin noch nicht weiter wie im Forum angegeben. Das Programm sollte so funktionieren.
Seit 02/08 hab ich nichts mehr dran getan, hab keine Zeit.

dl1akp/ Hallo Andreas! Das mit dem Zählerstart und dem abspeichern des letzten Wertes funktioniert wunderbar. Ich hatte beim schreiben ins Eprom nur noch einen Fehler mit den Fusebits drin.

Gruss