Forum: Mikrocontroller und Digitale Elektronik mehrere Eingänge über "while"-Befehl abfragen


von __Son´s B. (bersison)


Lesenswert?

Hallo,
ich möchte mehrer Tasten zeitgleich über while-Schleife abfragen.
Eine Tasteabfrage geht mit;
 while (PINA & (1<<PA7))
 {
  PORTB ^=  (1<<PB3) | (1<<PB4);
 }

Aber, wie müsste der while-Befehl aussehen, wenn ich 2 Tasten (PA7 und 
PA6) gleichzeitig abfragen möchte?

von blub (Gast)


Lesenswert?

while ( (PINA & (1<<PA6)) && (PINA & (1<<PA7)))

von Michael (Gast)


Lesenswert?

while (PINA & ((1<<PA6) | (1<<PA7))) { ... }

von blub (Gast)


Lesenswert?

Michael schrieb:
> while (PINA & ((1<<PA6) | (1<<PA7))) { ... }
Doppelt falsch. Erstmal binäres und logisches Oder vertauscht und wenn 
man auf beide Taster gleichzeitig abfragen will braucht es ein Und.

von blub (Gast)


Lesenswert?

ARGH! SORRY! Stimmt alles. Ich war zu schnell. Klar, so geht es 
natürlich auch wenn beide Taster am selben Port sind.

von Walter S. (avatar)


Lesenswert?

kommt drauf an was du machen willst:
die Schleife abbrechen wenn eine der beiden Tasten gedrückt ist oder 
wenn beide gleichzeitig gedrückt werden

von Hubert G. (hubertg)


Lesenswert?

Der Code ergibt sich doch aus der Fragestellung.
Wird Taste A und B gedrückt
Wird Taste A oder B gedrückt

von Thomas E. (thomase)


Lesenswert?

__Son´s Bersi__ schrieb:
> while (PINA & (1<<PA7))
>  {
>   PORTB ^=  (1<<PB3) | (1<<PB4);
>  }
So fragt man keine Tasten ab.

Erstmal werden Tasten entprellt und die Entprellung liefert den Status 
der Taste(n). Diese können dann z.B. in einer Variablen abgelegt werden.
Dann werden, völlig unabhängig vom Einlesen der Tasten, die Zustaände 
verarbeitet:

switch(buttonstate)
{
  case 0:
  //tu was
  break;
  case 1:
  //tu was anderes
  break;
 etc. blabla
}

mfg.

von Walter S. (avatar)


Lesenswert?

Hubert G. schrieb:
> Der Code ergibt sich doch aus der Fragestellung.
> Wird Taste A und B gedrückt
> Wird Taste A oder B gedrückt

ja und was denn nun? Ich kann das aus der Fragestellung jedenfalls nicht 
erkennen:

__Son´s Bersi__ schrieb:
> Aber, wie müsste der while-Befehl aussehen, wenn ich 2 Tasten (PA7 und
> PA6) gleichzeitig abfragen möchte?

von MaWin (Gast)


Lesenswert?

> Eine Tasteabfrage geht mit;
> while (PINA & (1<<PA7))
> {
>  PORTB ^=  (1<<PB3) | (1<<PB4);
> }

Das wäre eine blöde Abfrage
1
char key1pressed,key1down,key2pressed,key2down;
2
key1pressed=PINA&(1<<PA7);
3
key2pressed=PINA&(1<<PA6);
4
while(1)
5
{
6
  key1down=PINA&(1<<PA7);
7
  if(key1down&&!key1pressed)
8
  {
9
    // tue was passieren soll wenn Taste1 runtergedrückt wird
10
  }
11
  key1pressed=key1down;
12
  key2down=PINA&(1<<PA6);
13
  if(key2down&&!key2pressed)
14
  {
15
    // tue was passieren soll wenn Taste2 runtergedrückt wird
16
  }
17
  key2pressed=key1down;
18
  _delay_ms(10); // Prellzeit abwarten
19
}
Und ja, man kann das verinfachen wenn alle 8 Tasten auf einem
Port hängen.

von __Son´s B. (bersison)


Lesenswert?

Zur Konkretisierung;

() PA6 UND PA7 zeitgleich
aber PA6 ODER PA7 ist auch interessant.

() ZZ. liegen alle Tasten auf dem gleichen PORT.

() Tastenentprellung kommt später.

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.