- LiFePO4 Speicher Test         
Ergebnis 1 bis 10 von 16

Thema: Pin zählen, merken, vergleichen

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    16.02.2006
    Beiträge
    1.113
    Natürlich kennt Bascom die OR Verknüpfung.
    Darüber hinaus auch ein Else im If ... Then ... Else ... End If. Also so:

    If Eingang = 1 And B < A Then
    Ausgang = 1
    Else
    Ausgang = 0
    End If

    Dass hier müsste übrigens auch noch äquivalent sein:

    If B < A Then
    Ausgang = Eingang
    Else
    Ausgang = 0
    End If

    Nun zum Debounce. Ich hatte mir nicht den ganzen Thread durchgelesen, daher auch nur die übliche Verwendung des Debounce vorgeschlagen.
    Wenn du über die externen Interrupts gehen willst, damit die Auswertung sicher sofort geschieht, könntest du verschiedene Wege gehen:
    1. Bei Flankenwechsel des INT0 Pins wird die zugehörige ISR angesprungen. Dort könntest du den Debounce Befehl benutzen, um eine Sub aufzurufen, in der dann irgendeine Aktion ausgeführt wird. Allerdings scheint mir das etwas von hinten rum durchs Auge in die Brust zu sein. Hierbei ist noch zu bedenken, dass die Ausführung der Sub um eine gewisse Zeit verzögert wird, falls die Bedingung im Debounce Befehl erfüllt ist. Siehe dazu Config Debounce.
    2. Die ISR wird wieder angesprungen, aber nun machst du die Auswertung selber. Selbst wenn der Kontakt jetzt noch prellt, die Aktion kannst du auf jeden Fall schon einmal ausführen. Das Prellen bewirkt aber, dass nach Beendigung der ISR diese sofort wieder aufgerufen wird. Um dies zu vermeiden, könntest du in der ISR einige ms warten und dann die zwischenzeitlich aufgetretenen Interrupt-Flags zu löschen. Damiet verhinderst du, dass die ISR durch das Prellen mehrfach aufgerufen wird. Warten in der ISR klingt zwar etwas frevelhaft, ist aber in diesem Fall ok. Es sei denn, dass du andere Arbeiten in deinem Programm hast, die durch das Warten gestört würden.
    Debounce wird eigentlich verwendet, wenn man relativ oft den Pin abfragen kann.

  2. #2
    Neuer Benutzer Öfters hier
    Registriert seit
    26.02.2011
    Beiträge
    16
    Hallo zusammen,

    ich bin mal wieder etwas ratlos.
    Für die, die den bisherigen Thread nicht gelesen haben, noch mal kurz was mein Ziel ist:
    Ein Atmega8 soll über einen Mosfet ein Magnetventil schalten, dieses wird erstmal nur durch eine Led simuliert.
    An den Interrupt-Eingängen sind zwei Hallsensoren angeschlossen. Diese zählen die Variablen „Klemmer“ und „Korb“.

    Außerdem gibt es zwei Eingänge: der Eingang "Messen" soll die Led auf Wunsch ausschalten, der Eingang "Var_reset" die Variablen bei Bedarf auf Null zurücksetzen.

    Die Led soll leuchten, wenn "Messen" high ist, bis Korb = Klemmer ist.

    Auf einem Display werden die Werte der Variablen angezeigt.

    Folgende Probleme treten auf:
    1. der Klemmer läßt sich nur hochzählen, wenn der Wert des Korbs höher als der des Klemmers ist. In der Anwendung muss aber der Klemmer erst gezählt werden, danach der Korb.
    2. erreicht der Wert des Klemmers den des Korbs, werden beide Werte Null.
    3. die Led leuchtet nicht wie sie soll dauerhaft, sondern geht nur kurz an, wenn der Klemmer ein Signal hatte.

    Hat jemand eine Idee?
    Hier der Code:
    Code:
    '------------------------------------------------------------------------------
    
    $regfile = "m8def.dat"
    $crystal = 1000000
    $hwstack = 100
    
    '--------- Ein- und Ausgaenge ------------------------------------------
    
    Config Pind.5 = Input
       Messen Alias Pind.5                         'Eingang um den Messvorgang zu starten
    Config Pind.6 = Input
       Var_reset Alias Pind.6                       'Eingang um die Variablen vor jeder Messung auf Null zu stellen
    Config Portb.4 = Output
       Led Alias Portb.4                              'Led und Magnetventil
    
    
    '--------- Variablen ---------------------------------------------------
    
    Dim Klemmer As Byte                            'Klemmer
    Dim Korb As Byte                                 'Korb
    
    Klemmer = 0                                        'Startwerte
    Korb = 0
    
    '--------- LCD --------------------------------------------------------
    
    Config Lcd = 16 * 2
       Config Lcdpin = Pin , Db4 = Portc.3 , Db5 = Portc.2 , Db6 = Portc.1 , Db7 = Portc.0 , E = Portc.4 , Rs = Portc.5
       Config Lcdbus = 4
    
    '-------- Interrupts --------------------------------------------------
    
    Config Int0 = Falling                            'Interrupts reagieren auf fallende Flanke
    Config Int1 = Falling
    Enable Interrupts
    Enable Int0                                        'Interrupts einschalten
    Enable Int1
    On Int0 Isr_von_int0
    On Int1 Isr_von_int1
    
    '-------- LCD-Starttext ------------------------------------------------
    
     Waitms 20
     Locate 1 , 1
     Lcd "Klemmer:"
     Locate 2 , 10
     Lcd Klemmer ; "   "
    
     Locate 2 , 1
     Lcd "Korb:"
     Locate 2 , 10
     Lcd Korb ; "   "
    
    
    '-------- Hauptprogramm -----------------------------------------------
    
    Main:
    Do
    
     If Var_reset = 1 Then                            'setzt Variablen auf Null
      Korb = 0
      Klemmer = 0
      Locate 1 , 10
      Lcd Klemmer ; "   "
      Locate 2 , 10
      Lcd Korb ; "   "
     End If
    
     If Messen= 1 And Korb < Klemmer Then        'schaltet Led
      Led = 1
       Else
       Led = 0
     End If
    
    Loop
    
    '--------- Interrupt-Routinen --------------------------------------------
    
    Isr_von_int0:
    
     Waitms 2                                             'Routine 2ms warten lassen
     Incr Klemmer                                        'Var Klemmer um eins erhöhen
    
     Locate 1 , 10                                        'Variable auf LCD aktualisieren
     Lcd Klemmer ; "   "
    
    Return
    
    
    Isr_von_int1:
    
     Waitms 2                                              'Routine 2ms warten lassen
     Incr Korb                                              'Var Korb um eins erhöhen
    
     Locate 2 , 10                                         'Variable auf LCD aktualisieren
     Lcd Korb ; "   "
    
    Return
    Prellen ist bei den Sensoren erfreulicherweise überhaupt kein Problem. Es wird jedes Ereignis sauber erkannt und gezählt.

    Vielen Dank in Voraus,
    Johannes
    Geändert von Fehlzuender (19.03.2011 um 20:19 Uhr)

  3. #3
    Neuer Benutzer Öfters hier
    Registriert seit
    26.02.2011
    Beiträge
    16
    Fehler gefunden! Habs oben im Code korrigiert.
    War ein ganz simpler Fehler bei der Angabe von Ports.

    Danke an alle die sich gedanken gemacht haben!
    Johannes

Berechtigungen

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

fchao-Sinus-Wechselrichter AliExpress