sitemap link mailform link home

Tastenentprellung

PDF Programmierung des AVR-Controllers (Diplomarbeit von Bianca-Charlotte Liehr)

PDF Datenblatt ATtiny2313


Eine (nicht ganz einfache) Programmier-Aufgabe für den Anfang:

Taste 1 schaltet LED-Leuchtmittel 1 ein bzw. aus.
Taste 2 schaltet LED-Leuchtmittel 2 ein bzw. aus.
Taste 3 schaltet LED-Leuchtmittel 3 ein bzw. aus.


Jede der drei Tasten ist also jeweils einem LED-Leuchtmittel zugeordnet.


Die Funktion der Taster nennt man toggle. Das kommt aus dem Englischen und bedeutet hin- und herschalten bzw. umschalten.

Unsere erste Programmversion arbeitet nur in der while-Schleife - also nicht mit Interrupt bzw. Timer.

Mit den Tastern fangen unsere Probleme an - sie prellen ganz erheblich:

Tastenprellen

Oszilloskop-Aufnahme eines mechanischen Tasters-  Bildquelle Wikipedia

Das heißt, dass ein mechanischer Schalter / Taster erst mehrfach ein- und ausschaltet, bevor der Kontakt sicher geschlossen ist. Hier im Bild sind es ca. 150 us "Prellzeit".

Unsere 3 Tasten an den Eingängen PD0, PD1 und PD2 müssen software-technisch entprellt werden.
Ansonsten führt jeder Tastendruck zu einem superschnellen, mehrfachen Ein- und Ausschalten der LED-Leuchtmittel, das wir aber nicht wahrnehmen können.
Wir würden uns aber wundern, dass das Drücken der Taster nur manchmal (scheinbar zufällig) zum Einschalten oder Ausschalten der LED-Leuchtmittel führt (das schnelle Ein- und Ausschalten beim Tastenprellen konnten wir ja nicht sehen).

Betrachtet man das Zeitverhalten eiens Tasters, so gibt es vier mögliche Zustände:

1. war nicht gedrückt und ist nicht gedrückt
2. war nicht gedrückt und ist gedrückt (steigende Flanke)
3. war gedrückt und ist immer noch gedrückt
4. war gedrückt und ist nicht mehr gedrückt (fallende Flanke)

Zur Entprellung (und auch zur Realisierung der toggle-Funktion) müssen daher die Zustände der 3 Tasten bei jedem Durchlauf der while-Schleife in Variablen gespeichert werden.

uint8_t taster1_alt = FALSE;
uint8_t taster2_alt = FALSE;
uint8_t taster3_alt = FALSE;

Betrachten wir hier nur den Taster1 (ab Zeile 67):

Der aktuelle Zustand des Tasters wird über die Funktion taster1() übergeben. Wenn der Taster 1 nun gerade gedrückt ist, dann wird verglichen, ob der Zustand des Tasters im vorigen Durchlauf der while-Schleife FALSE (also nicht gedrückt) war.
Wir wollen also eine L-H-Schaltflanke (steigende Flanke - Zustand Nr. 2) erkennen und auswerten. Am Ende der while-Schleife steht dann noch eine Verzögerung, die wesentlich größer als die Prellzeit (ca. 150 us) ist. Wir verwenden im Programm 10 ms (Zeile 129).

Anm.: Das mit der L-H-Flanke ist eigentlich nicht ganz korrekt, da wir eigentlich negierende Schalter (siehe Schaltplan) haben. Diese Negierung wird aber durch die Funktionen taster1(), taster2() und taster3() bereits "kompensiert".

Wenn also eine L-H-Flanke erkannt wird, dann wird nun die Variable taster1toggle sozusagen "umgedreht" (Zeilen 69 bis 75). Diese Variable speichert die Werte TRUE oder FALSE.
Hier bedeutet FALSE = LED ausgeschaltet und TRUE = LED eingeschaltet.

Der folgende Artikel erläutert verschiedene Verfahren zur Tasten-Entprellung:

Externer Link Entprellung der mechanischen Schalter / Taster


Nachdem die 3 Schalter also korrekt abgefragt wurden und die jeweiligen Schaltzustände in den Variablen taster1toggle, taster2toggle und taster3toggle abgelegt wurden, müssen nun die LED-Leuchtmittel entsprechend ein- oder ausgeschaltet werden.

Dazu müssen die Bits des Ports B unabhängig voneinander gesetzt oder gelöscht werden. Das nennt man Bitmanipulation.

 

Der folgende Artikel erklärt die entsprechenden Methoden ganz genau - mit Beispielen in Assembler und C:

Externer Link Bitmanipulation (Setzen und Löschen einzelner Bits)

Zip-Ordner Software-Projekt "Tastenentprellung" für WinAVR (einschließlich Makefile usw.)

Quellcode "Tastenentprellung":


.

Letzte Änderung:
April 09. 2018 15:12:12
«    top    »