PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : tasten oder gedrückt halten



demmy
26.08.2011, 20:10
Hallo zusammen,

ich versuche schon die ganze Zeit heraus zu finden wie es möglich ist, abzufragen ob ich einen Taster nur kurz taste oder ob er gedrückt gehalten wird?

Gibt es dafür evtl. eine fertige Funktion? Oder hat sowas schonmal jemand selber programmiert?

Danke für euere Hilfe!

Torrentula
26.08.2011, 20:43
Ganz einfach, du fragst einfach den Pin an dem der Taster angeschlossen ist 2 mal ab. Wenn der Taster gedrückt wird, wird z.B. 5 sekunden gewartet, wenn der Taster dann immernoch gedrückt ist, wird ein eine bestimmte Aktion ausgeführt, wenn er nicht mehr gedrückt sein sollte wird eine andere aktion ausgeführt.

MfG

Torrentula

Che Guevara
27.08.2011, 01:52
Hallo,

ich hatte mal einen ähnlichen Fall, habe mir dann so beholfen:


Config Pind.2 = Input
Portd.2 = 0
...
...
While Pind.2 = 1
Waitms 1
Incr Taster_counter
Wend
If Taster_counter > xxx Then
'lange gedrückt
Else
'kurz gedrückt
End If
Taster_counter = 0

Evtl. hilfts dir ja ;)

Gruß
Chris

demmy
29.08.2011, 12:25
Hi
danke
hat funktioniert! :)

Che Guevara
29.08.2011, 14:15
Du musst aber bedenken, dass du damit den Rest deines Programms sehr lange blockierst. Evtl. wäre es besser, das Problem mittels Timer und Int zu lösen.

Gru0
Chris

Ceos
29.08.2011, 14:23
ich wollte schon eine alternative präsentiern, weil ich selber eine lösung gebaut habe die aber nur auf einen taster zur gleichen zeit reagiert, wenn das reicht !?

einfach den Taster an einen der Interrupteingänge hängen, auf die Flanke des drückens reagieren und einen Timer starten, der erst nach 10mS überläuft (TCNT Register voreinstellen) und dann alle 100-500mS (je nach Geschmack) überläuft und dann den Zustand des Taster prüft, ist der Taster aus, wird der Timer schlafen gelegt, ist der Taster an, wird irgendetwas ausgelöst!

das geht auch mit mehreren Tastern und demselben Timer, einfach alle Taster zusammen über Dioden an den Interrupt-Pin hängen und jeden Taster einzeln an einen Pin deiner Wahl, in der Timerroutine werden dann alle Taster gleichzeitg abgefragt, aber er reagiert halt nur auf einen einzelnen Tasterdruck!

Aber in einem anderen Topic bin ich schon dran auch das Problem zu lösen!

demmy
29.08.2011, 14:36
Hi, ja hab das auch mit nem Timer gelöst! :)
hatte nur nen Denkanstoß gebraucht.
Der Timer zählt einen Wert hoch den ich dann auswerte.
Der Timer wird beim drücken des Tasters gestartet und fängt an zu zählen.
Wird er losgelassen stoppt der Timer.
Wird während des gedrückthaltens ein bestimmter Wert überschritten führt er eine Funktion aus.
Ist während des loslassens der Wert noch unterschritten, führt er eine andere Funktion aus.

Funktioniert bestens. ;)

Ceos
31.08.2011, 10:22
ich hab BMS sei gedankt jetzt ne Lösung
https://www.roboternetz.de/community/threads/54653-Pegelwechsel-m%C3%B6glichst-simpel-in-Puls-umwandeln
19834

im Interrupt starte ich dann den Timer der nach 10mS das erste mal abfragt (entprellen) und dann alle 100mS wieder, bis keine Taste mehr gedrückt wird, dann geht der Timer wieder offline.