-
        

Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 12

Thema: Betriebsstundenzähler mit Bascom

  1. #1
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    05.09.2007
    Beiträge
    101

    Betriebsstundenzähler mit Bascom

    Anzeige

    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

  2. #2
    Erfahrener Benutzer Robotik Einstein Avatar von Jaecko
    Registriert seit
    16.10.2006
    Ort
    Lkr. Rottal/Inn
    Alter
    35
    Beiträge
    1.987
    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.
    #ifndef MfG
    #define MfG

  3. #3
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    05.09.2007
    Beiträge
    101
    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

  4. #4
    Erfahrener Benutzer Robotik Einstein Avatar von Jaecko
    Registriert seit
    16.10.2006
    Ort
    Lkr. Rottal/Inn
    Alter
    35
    Beiträge
    1.987
    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.
    #ifndef MfG
    #define MfG

  5. #5
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    05.09.2007
    Beiträge
    101
    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

  6. #6
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    05.09.2007
    Beiträge
    101
    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

  7. #7
    Erfahrener Benutzer Robotik Einstein Avatar von Jaecko
    Registriert seit
    16.10.2006
    Ort
    Lkr. Rottal/Inn
    Alter
    35
    Beiträge
    1.987
    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
    #ifndef MfG
    #define MfG

  8. #8
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    05.09.2007
    Beiträge
    101
    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

  9. #9
    Benutzer Stammmitglied
    Registriert seit
    20.06.2007
    Ort
    ja
    Beiträge
    53
    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

  10. #10
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    20.10.2004
    Ort
    Thüringen
    Beiträge
    133
    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

Seite 1 von 2 12 LetzteLetzte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •