Hallo Welt!
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.
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.
*Übergabe erfolgt als Referenz.
Der Funktionsrumpf:
Alles anzeigen
Hier ein vollständiges Beispiel.
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
- $Regfile = "m88def.dat"
- $Crystal = 8000000
- $hwstack = 40
- $swstack=16
- $framesize = 32
- dim buttonState as Byte
- Config portb.7 = input : Set PORTB.7 'Pull up
- do
- shift buttonState , left 'links-shift, bit 0 wird frei
- buttonState.0 = PINB.7 'Pinstatus nach bit 0 kopieren
- if buttonState = 128 then Print "gedrückt"
- if buttonState = 127 then Print "gelöst"
- Loop
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.
Parameter | Typ | Beschreibung |
pinRegister | *Byte | Pin-Port, z.B PORTB |
pinMask | Byte | PIN-Nr als Maske, also 2Pin-Nr |
buffer | *Byte | Für jeden Taster wird ein Buffer benötigt. Bei mehreren Tastern bietet sich ein Array an. |
levelCheck | Byte | Bitmuster, wann eine Rückgabe = 1 erfolgen soll# const debounceSignal_High = 127 const debounceSignal_Low = 128 |
*Übergabe erfolgt als Referenz.
Der Funktionsrumpf:
BASCOM-Quellcode
- const debounceSignal_High = 127
- const debounceSignal_Low = 128
- function debounceSignal(pinRegister as byte , byval pinMask as byte , buffer as byte , byval levelCheck as byte)as byte
- buffer = buffer * 2 'Linkshift-> bitstelle.0 = 0
- pinMask = PinRegister And pinMask 'PinRegisterInhalt maskieren
- if PinMask > 0 then incr buffer 'eine 1 wird übernommen
- if buffer = levelCheck then debounceSignal = 1 else debounceSignal = 0 'bitmusterprüfung
- end function
Hier ein vollständiges Beispiel.