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