- 3D-Druck Einstieg und Tipps         
Seite 2 von 2 ErsteErste 12
Ergebnis 11 bis 16 von 16

Thema: Pin zählen, merken, vergleichen

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    26.02.2011
    Beiträge
    16
    Danke, den Befehl "Incr" kannte ich noch nicht.
    Ich muss das Programm mal auf einer Platine mit Hallsensoren testen,
    in der Bascom-Simulation gibts noch Ungereimtheiten, der Ausgang geht nur an, wenn man den Eingang ein paar mal an und aus geschaltet hat...

    Zwei Fragen noch:
    1. Kennt Bascom kein "Or"?
    2. Wenn ich "Debounce" einbauen will, muss das laut Hilfe in dem Hauptprogramm passieren. Wie bringe ich dann die jetzigen If..Then-Aufgaben des Hauptprogramms unter?

    Hier der Code:

    Code:
    '------------------------------------------------------------------------------
    
    $regfile = "m8def.dat"
    $crystal = 1000000
    $hwstack = 100
    
    '--------- Ein- und Ausgaenge ------------------------------------------
    
    Config Pinb.3 = Input
       Eingang Alias Pinb.3
    Config Portb.4 = Output
       Ausgang Alias Portb.4
    
    
    '--------- Variblen ---------------------------------------------------
    
    Dim A As Byte                                               'Klemmer
    Dim B As Byte                                               'Korb
    
    A = 0                                                       'Startwerte
    B = 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 = Rising                                        'Interrupts reagieren auf steigende Flanke
    Config Int1 = Rising
    Enable Interrupts
    Enable Int0                                                 'Interrups einschalten
    Enable Int1
    On Int0 Isr_von_int0
    On Int1 Isr_von_int1
    
    '-------- Hauptprogramm -----------------------------------------------
    
    Main:
    Do
    
     If Eingang = 1 And B < A Then
      Ausgang = 1
     End If
    
     If Eingang = 0 Then
      Ausgang = 0
     End If
    
     If A <= B Then
      Ausgang = 0
     End If
    
    
     Cls                                                        'LCD
     Locate 1 , 1
     Lcd "Klemmer:"
     Locate 1 , 10
     Lcd A
     Locate 2 , 1
     Lcd "Korb:"
     Locate 2 , 10
     Lcd B
    
    Loop
    
    '--------- Interrupt-Routinen --------------------------------------------
    
    Isr_von_int0:
     Waitms 2                                                   'Routine 2ms warten lassen
     Incr A                                                     'Var A um eins erhöhen
    Return
    
    Isr_von_int1:
     Waitms 2                                                   'Routine 2ms warten lassen
     Incr B                                                     'Var B um eins erhöhen
    Return
    Gruß,
    Johannes

  2. #2
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    16.02.2006
    Beiträge
    1.113
    Den Debounce Befehl setzt du zusätzlich in deine Do...Loop, z.B. an den Anfang oder ans Ende.
    Die Schleife solltest du dir aber noch einmal ansehen. Die läuft im Moment vollkommen ungebremst durch. Dadurch wird etwa 25 mal pro Sekunde ein CLS und die Anzeige der Variablen A und B durchgeführt. Das ist bestimmt eine schöne Flimmerei.
    Es würde sicherlich reichen, wenn du die ein paar mal pro Sekunde schreibst. Dazu würde ich allerdings auf das CLS verzichten.

  3. #3
    Neuer Benutzer Öfters hier
    Registriert seit
    26.02.2011
    Beiträge
    16
    Sorry, nochmal zum debouncen von Int0 und Int1:
    Gebe ich im Debounce-Befehl das Label der ISR an? Ich dachte, wenn der Interrupt-Eingang High ist, wird sofort in die ISR gesprungen. Dann würde das debouncen doch überhaupt nicht beachtet?

    Hier nochmal Schnipsel:
    Code:
    ...
    Enable Interrupts
    Enable Int0                                                 'Interrups einschalten
    Enable Int1
    On Int0 Isr_von_int0
    On Int1 Isr_von_int1
    
    '-------- Hauptprogramm -----------------------------------------------
    
    Main:
    Do
    
    Debounce Int0 , 1 , Isr_von_int0
    Debounce Int1 , 1 , Isr_von_int1
    
     If BlaBla
    Loop
    
    '--------- Interrupt-Routinen --------------------------------------------
    
    Isr_von_int0:
     Bla Bla
    Return
    
    Isr_von_int1:
     Blabla
    Return

  4. #4
    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.

Seite 2 von 2 ErsteErste 12

Berechtigungen

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

Labornetzteil AliExpress