Übung 2, Tasten-Entprellung

Ausgehend von der Übung 1 soll jetzt ein Weg gefunden werden, das Prellen der Kontakte auszutricksen und unser Programm so zu gestalten, dass ein Druck auf eine Taste auch tatsächlich nur als ein einzelner Druck erkannt wird.

Der Versuchsaufbau von Übung 1 kann auch für diese Übung verwendet werden.

Ein Lösungsansatz besteht darin, dass der Zustand Taste gedrückt während einer bestimmten Zeitdauer anstehen muss bevor der Tastendruck registriert wird.
Im einfachsten Fall wird dies dadurch realisiert, dass beim ersten Erkennen des Zustands eine Warteschleife mit einer definierten Anzahl Loops durchlaufen wird. Wenn danach der Status der Taste immer noch gedrückt ist können wir diesen Zustand als gegeben hinnehmen.
Diese Lösung hat den Nachteil, dass wir während dem Warten nicht mehr auf andere Ereignisse reagieren können. Wenn wir das etwas besser Lösen wollen dann müssen wir uns etwas einfallen lassen.
Diejenigen, die jetzt selber versuchen wollen eine bessere Lösung zu finden sollten jetzt aufhören zu lesen und sich an die Arbeit machen. Die unter euch, die sich noch zu unsicher fühlen können noch etwas weiter lesen.

Die bessere Lösung

Wir wollen nun folgendes versuchen, ausgehend von unserer Hauptprogrammschleife, welche immer durchlaufen werden soll.

Innerhalb unserer Programmschleife lesen wir den Zustand des entsprechenden Pins ein.
Ist der Pin Logisch 1, merken wir uns diesen Zustand.
Erkennen wir nun die negative Flanke, d.h. den Wechsel von 1 auf 0, dann initialisieren wir einen Zähler.
Solange der 0-Pegel ansteht inkrementieren wir den Zähler bei jedem Durchlauf unserer Hauptprogrammschleife. Hat der Zähler einen bestimmten Wert erreicht, den wir durch Versuche ermitteln müssen, dann wird der Tastendruck gewertet.
Damit jetzt nicht beim nächsten Durchlauf der Programmschleife der Tastenzähler weiter hochgezählt wird müssen wir uns merken, dass momentan die Taste gedrückt ist. Dazu verwenden wir eine entsprechende Statusvariable.
Dies kann eine eigene Variable sein, oder aber wir definieren eine Bitfeldvariable, in welcher wir die beiden Signale für den Portzustand und des Tastenstatus in einer einzigen BYTE-Variablen zusammenfassen.

So, nun solltet ihr aber wirklich versuchen, die Lösung selbständig zu erarbeiten.

Wenn es gar nicht klappen sollte, dann habt ihr hier den C-Quellcode und das Makefile meiner Musterlösung.