Entprellen leicht gemacht I

    Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

    Aufgrund technischer Veränderungen ist der Mailverkehr innerhalb des Forums (Private Nachrichten) nur noch eingeschränkt möglich. Die Einschränkung ist notwendig, um zusätzliche Betriebskosten für das Forum zu vermeiden. Näheres zu den Hintergründen im Thread "Aktuelles zum Forum".Wir bitten um Verständnis.

    Hinweis kann nach Kenntnisnahme deaktiviert werden!

    • Entprellen leicht gemacht I

      Hallo Welt! :cursing: :love:

      Hier eine simple Methode den Ausgangspegel eines einzelnen Tasters ohne viele Worte durch Software zu entprellen.

      Das zugrunde liegende Prinzip dabei ist, dass stets der logische Zustand eines Pins in ein Byte kopiert wird, siehe Zeile 10. Das Byte wird im Vorfeld um ein Bit nach links geschoben (9) um für das neue Bit Platz zu schaffen. So bildet sich nach und nach ein Bitmuster. Eine entsprechende Auswertung (11/12) ermöglicht dann ein einmaliges Triggern einer Aktion.

      Hinweis: Der Vorliegende Programmcode ist eher etwas für den Simulator und dient nur der Verdeutlichung.

      BASCOM-Quellcode

      1. $Regfile = "m88def.dat"
      2. $Crystal = 8000000
      3. $hwstack = 40
      4. $swstack=16
      5. $framesize = 32
      6. dim buttonState as Byte
      7. Config portb.7 = input : Set PORTB.7 'Pull up
      8. do
      9. shift buttonState , left 'links-shift, bit 0 wird frei
      10. buttonState.0 = PINB.7 'Pinstatus nach bit 0 kopieren
      11. if buttonState = 128 then Print "gedrückt"
      12. if buttonState = 127 then Print "gelöst"
      13. Loop
      Alles anzeigen


      Das Ganze lässt sich auch in eine komfortable Funktion verpacken. Der Aufruf der Funktion, bezogen auf einen Pin, erfolgt dann etwa alle 1 bis 3 Millisekunden, je nach Tastertyp.

      BASCOM-Quellcode

      1. function debounceSignal(pinRegister as byte , byval pinMask as byte , buffer as byte , byval levelCheck as byte)as byte





      ParameterTypBeschreibung
      pinRegister*BytePin-Port, z.B PORTB
      pinMaskBytePIN-Nr als Maske, also 2Pin-Nr
      buffer*ByteFür jeden Taster wird ein Buffer benötigt. Bei mehreren Tastern bietet sich ein Array an.
      levelCheckByteBitmuster, wann eine Rückgabe = 1 erfolgen soll#
      const debounceSignal_High = 127
      const debounceSignal_Low = 128

      *Übergabe erfolgt als Referenz.


      Der Funktionsrumpf:

      BASCOM-Quellcode

      1. const debounceSignal_High = 127
      2. const debounceSignal_Low = 128
      3. function debounceSignal(pinRegister as byte , byval pinMask as byte , buffer as byte , byval levelCheck as byte)as byte
      4. buffer = buffer * 2 'Linkshift-> bitstelle.0 = 0
      5. pinMask = PinRegister And pinMask 'PinRegisterInhalt maskieren
      6. if PinMask > 0 then incr buffer 'eine 1 wird übernommen
      7. if buffer = levelCheck then debounceSignal = 1 else debounceSignal = 0 'bitmusterprüfung
      8. end function
      Alles anzeigen





      Hier ein vollständiges Beispiel.
    • Hm, ich kapier' das nicht a_59_ac03eae5 . Seh' ich das richtig, dass 7x hintereinander die pin-Abfrage 1 sein muss, damit der Taster als gerückt erkannt wird? Dann hat der Puffer den Inhalt &B01111111. Wenn mal los lässt, wandern die bit nach links und bei &B10000000 sind genug Nuller da, das es als 'nicht gedrückt' erkannt wird. Und wenn ich länger draufdrück, dass auch bit 7=1 wird? Dann wird das If Buffer = Levelcheck Then Debouncesignal = 1 Else Debouncesignal = 0 'bitmusterprüfung dann 'nicht gedrückt' ergeben.
      a_27_b277ca12
      Raum für Notizen

      -----------------------------------------------------------------------------------------------------

      -----------------------------------------------------------------------------------------------------
    • Michael schrieb:

      tschoeatsch schrieb:

      dass 7x hintereinander die pin-Abfrage 1 sein muss, damit der Taster als gerückt erkannt wird?
      der Trick dabei ist, das Muster 10000000 oder 01111111 zu erkennen, das prinzipiell nur einmal pro Tastenaktion vorkommt.Bleibt der Taster weiter gedrückt (oder gelöst), dann gibt es dieses Muster nicht mehr.
      Exactement a_15_a5ddcf85
    • Dann tritt der else-Teil in Kraft. 'Buffer = Levelcheck' trifft 1x zu. a_19_23577ce2 Ok, langsam sickert mir's in den Kopf, wenn ich den Knopf weiter gedrückt halte, wurde die Aktion dafür ausgeführt und wird erst wieder erneut ausgeführt, wenn ich zwischendurch 'lange genug' nicht gedrückt habe.
      Na gut, könnte vielleicht doch funktionieren :whistling:

      BASCOM-Quellcode

      1. Const Debouncesignal_high = 127
      2. Const Debouncesignal_low = 128
      3. Function Debouncesignal(pinregister As Byte , Byval Pinmask As Byte , Buffer As Byte , Byval Levelcheck As Byte)as Byte
      4. Buffer = Buffer * 2 'Linkshift-> bitstelle.0 = 0
      5. Pinmask = Pinregister And Pinmask 'PinRegisterInhalt maskieren
      6. If Pinmask > 0 Then Incr Buffer 'eine 1 wird übernommen
      7. If Buffer = Levelcheck Then Debouncesignal = 1 Else Debouncesignal = 0 'bitmusterprüfung
      8. End Function
      Alles anzeigen
      Raum für Notizen

      -----------------------------------------------------------------------------------------------------

      -----------------------------------------------------------------------------------------------------

      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von tschoeatsch ()