Forum: Mikrocontroller und Digitale Elektronik Tastenabfrage else Anweisung nur ein Durchlauf


von Michael (Gast)


Lesenswert?

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.

von HildeK (Gast)


Lesenswert?

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.

von Uwe (de0508)


Lesenswert?

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"

von Werner M. (Gast)


Lesenswert?

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.

von Michael (Gast)


Lesenswert?

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.

von W.A. (Gast)


Lesenswert?

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 ;-(

von HildeK (Gast)


Lesenswert?

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
}

von Joachim B. (jar)


Lesenswert?

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
Noch kein Account? Hier anmelden.