Hallo zusammen,
ich komme da gerade mit einem einfachen Problem nicht weiter:
Mittels einer Tasterabfrage will ich das, was in der else Anweisung
steht, nur einmal durchlaufen haben, d.h. nicht solange die Taste an PD2
gedrückt ist, sondern nur einmal. Erst nachdem die Taste erneut gedrückt
wird, soll die else Anweisung wieder erneut durchgeführt werden.
while (1)
{
if ( PIND & (1<<PD2) ) // Taster nicht gedrückt
{ ...
}
else { ...
}
}
Ich komme da gerade nicht drauf, vielleicht könnte ihr mir einen Hinweis
geben.
Dann musst du im else-Zweig solange verbleiben, bis die Taste wieder losgelassen wird - oder ein Flag setzen, wenn gedrückt und es wieder zurücksetzen, wenn losgelassen wurde. Tastenentprellung nicht vergessen.
Guten Morgen mit
1 | if (PIND & (1<<PD2)) .. |
fragst Du nur einen Pin ab, was man aber braucht, ist Tasterentprellung. Und nur so erhält man eine Flankenerkennung - Taste gedrückt oder Taste losgelassen. # https://www.mikrocontroller.net/articles/AVR-Tutorial:_IO-Grundlagen # https://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#Taster_und_Schalter # Beitrag "Universelle Tastenabfrage"
Michael schrieb: > Ich komme da gerade nicht drauf, vielleicht könnte ihr mir einen Hinweis > geben. Du musst dir merken, ob die else-Anweisung schon mal durchlaufen wurde und den Merker löschen, wenn die Taste nicht gedrückt ist.
Werner M. schrieb: > Du musst dir merken, ob die else-Anweisung schon mal durchlaufen wurde > und den Merker löschen, wenn die Taste nicht gedrückt ist. Vielen Dank, funktioniert jetzt.
HildeK schrieb: > Dann musst du im else-Zweig solange verbleiben, bis die Taste wieder > losgelassen wird Womit sich das Programm sicher aufhängen würde, weil es dann nie wieder zur Tastenabfrage kommt ;-(
W.A. schrieb: > Womit sich das Programm sicher aufhängen würde, weil es dann nie wieder > zur Tastenabfrage kommt ;-( Doch, z.B. so. Aber wie schon gesagt: "Tastenentprellung nicht vergessen". Dass das Programm dann nur die Tasten bedient, ist klar.
1 | while (1) |
2 | {
|
3 | |
4 | if ( PIND & (1<<PD2) ) // Taster nicht gedrückt |
5 | |
6 | { ... |
7 | }
|
8 | |
9 | else { ... |
10 | while (!( PIND & (1<<PD2) )); |
11 | }
|
12 | |
13 | }
|
HildeK schrieb: > Dann musst du im else-Zweig solange verbleiben, bis die Taste wieder > losgelassen wird - oder ein Flag setzen, wenn gedrückt und es wieder > zurücksetzen, wenn losgelassen wurde. dann wäre im else Zweig noch ein Zähler sinnvoll wenn die Taste hängt, Dauerklingeln ohne Fehlermeldung will doch meist keiner!
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.