PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Prüfen ob Taster eine bestimmte Zeit unterbrechungsfrei gedrückt ist



jcrypter
30.08.2012, 16:08
Hallo liebes Forum,

ich habe an einem AtMega8 einen selbstgebauten Touchschalter angebracht, als Ersatz für einen normalen Taster.
Dieser Schalter ist ziemlich sensibel, manchmal reagiert er auch wenn man in etwas weiterm Abstand an dem Schalter vorbei greift.

Ich habe mir als Lösung des Problems überlegt, dass es, um als eindeutig gewolltes Schalten gewertet werden zu können, nötig ist dass der Schalter drei Sekunden ausgelöst wird.

Ich könnte jetzt natürlich nach dem ersten Schaltsignal ein wait() einbauen und danach nochmal testen ob der Eingang immer noch geschaltet ist aber dadurch könnte ich nicht feststellen ob es nicht zufällig so ist, dass wieder ein Signal anliegt.

Ich muss also ein unterbrechungsfreies Berühren detektieren.

Meine Idee war jetzt ab dem ersten Detektieren einer vermeintlichen Berührung eine Variable bei jedem Durchlaufen der Hauptschleife um 1 hochzuzählen.
Sobald kein Signal mehr anliegt wird die Variable wieder auf 0 gesetzt.
Wenn jedoch bis zu einem gewissen Schwellwert gezählt wird dann gilt es als beabsichtigtes Schalten.

pseudocode:



zaehler = 0
while

if schalter == 1 then
zaehler ++
else zaehler = 0

if zaehler > schwelle
.......



endwhile





was haltet ihr davon?
Gibt es eine bessere Möglichkeit?

danke für eure Ideen!

Crypi

Thomas E.
30.08.2012, 17:07
Dann wird aber irgendwann der Schwellwert sowieso erreicht werden, wenn die hochzählende Variable nie zurückgesetzt wird. Ich würde es eher so machen:
Bei jeder hochlaufenden Flanke des Tasters eine Variable inkrementieren und nach 50ms zurücksetzen lassen. Wenn dann ein Schwellwert erreicht wird, gilt der Taster als gedrückt.

jcrypter
30.08.2012, 17:49
Im Else-Fall wird der Zähler doch auf 0 gesetzt?!

Deine Variante verstehe ich ehrlich gesagt nicht.

Sauerbruch
30.08.2012, 17:51
Wenn Du noch einen Timer und eine Interrupt-Eingang frei hast, ginge es auch ganz ohne das Hauptprogramm aufzuhalten:

Du konfiguriertst den Interrupt als "Change", d.h. er wird bei jeder Flanke ausgelöst.
In der ISR checkst Du, ob der Taster gedrückt oder losgelassen wurde (über eine If-Then-Abfrage des INT-Eingangs)
Wurde er gedrückt, startest Du den Timer, der so konfiguriert (bzw. vorgeladen) ist, dass er nach 3 Sek. überläuft.
Wurde er losgelassen, stoppst Du den Timer und setzt ihn zurück.

In der Timer-ISR wird dann eine Bit-Variable auf 1 gesetzt, die in der Hauptschleife abgefragt wird und den dreisekündigen Tastendruck signalisiert (und nach Ausführen der entsprechenden Aktion wieder auf 0 gesetzt wird).

jcrypter
31.08.2012, 07:42
Guten Morgen!

das klingt nach einer guten Idee!
Das werde ich ausprobieren danke!

Ich habe meine Lösung mal umgesetzt, dass funktioniert auch zufriedenstellend.

Aber deine wäre natürlich eleganter.

Danke für eure Hilfe!
Crypi