Forum: Mikrocontroller und Digitale Elektronik Tastaturabfrage


von Ingo L. (grobian)


Lesenswert?

Ich habe hier einen Tastenabfrage die reagiert wenn der entsprechende 
PORT PIN gegen Masse gezogen wird.
Die Pullups sind aktiviert. Wenn ich jetzt aber zwei Tasten gleichzeitig 
drücke wird erst die eine Aktion ausgeführt und dann die andere. Genau 
das soll nicht passieren. Die Aktionen sollen wirklich immer dann 
ausgelöst werden wenn nur die Taste gedrückt ist und nicht in 
Kombination mit einer anderen.
Wie komme ich hier weiter ?
1
//Tastatur
2
  DDRA  &= ~(1<<PA3) | (1<<PA2)  | (1<<PA1) | (1<<PA0);  // als Eingang 
3
  PORTA |= (1<<PA3)  | (1<<PA2)  | (1<<PA1) | (1<<PA0);    // internen Pull-Up  aktivieren 
4
5
 
6
  while(1)
7
  {
8
9
    // taste 3
10
  if  ( !(PINA & (1<<PINA3)) ) // ist 0 ? 
11
      {
12
    // mach was 
13
       }
14
    
15
  // taste 2
16
  if  ( !(PINA & (1<<PINA2)) ) // ist 0 ? 
17
      {
18
    //mach was anderes
19
       }    
20
    
21
  // taste 1
22
  if  ( !(PINA & (1<<PINA1)) ) // ist 0 ? 
23
      {
24
    // mach was völlig anderes
25
       }
26
    
27
  // taste 0
28
  if  ( !(PINA & (1<<PINA0)) ) // ist 0 ? 
29
      {
30
     //mach was völlig, völlig anderes
31
       }      
32
    
33
  }

von Timmo H. (masterfx)


Lesenswert?

Naja dann solltest du ein Timeout o.ä. noch mit einbauen aber zuerstmal 
würde ich das mit einem switch machen (oder auch mit else if) da du dann 
zumindest nicht alle anderen Funktionen direkt danach ausführst.

von Peter D. (peda)


Lesenswert?

Ingo Laabs schrieb:
> Wie komme ich hier weiter ?

Du kannst nicht innerhalb eines CPU-Zyklus (= 50ns) 2 Tasten 
gleichzeitig drücken. Dazu bist Du rein körperlich nicht in der Lage.
Die CPU wird daher immer eine Taste zuerst erkennen.

Du brauchst spezielle Entprellroutinen, wo sich ein Zeitintervall für 
Gleichzeitig festlegen läßt, z.B.:

Beitrag "Universelle Tastenabfrage mit 2 Tastenerkennung"


Peter

von Karl H. (kbuchegg)


Lesenswert?

Ingo Laabs schrieb:

> das soll nicht passieren. Die Aktionen sollen wirklich immer dann
> ausgelöst werden wenn nur die Taste gedrückt ist und nicht in
> Kombination mit einer anderen.
> Wie komme ich hier weiter ?

Die eine Sache ist es, Tastendrücke 'gleichzeitig' auszuwerten.
Die andere Sache ist es, dass es natürlich auch von deinen Aktionen 
abhängt, ob du das Gefühl hast, dass sie nacheinander oder doch eher 
nebeneinander ausgeführt werden.

Du darfst deine Aktionen nicht als jeweils eine monolithische Einheit 
ansehen, sondern musst sie in feinere Einheiten unterteilen, die jeweils 
immer nur ein wenig von der Gesamtaufgabe lösen und danach die Kontrolle 
wieder an die Hauptschleife abgeben. Im Speziellen sind Wartschleifen 
hier immer tödlich.

Hier könnte dir der Ansatz einer Zustandsmaschine weiterhelfen, mit dem 
sich solche Unterteilungen gut organisieren lassen. Jede Aktion könnte 
dabei in eine eigene Zustandsmaschine abgebildet werden.

Ganz voneinander unabhängig wird es nie werden, aber wenn die zetiliche 
Granulierung nur fein genug ist, dann reicht das für praktische Zwecke 
schon.

von Ingo L. (grobian)


Lesenswert?

würde es denn nicht folgende Konstellation machen
1
//Tastatur
2
  DDRA  = 0;
3
    
4
  PORTA = 255;
5
  //Tastatur ende 
6
 
7
 
8
  while(1)
9
  {
10
  taste = PINA;
11
    
12
  if (taste == 0b00001000)
13
     {
14
     //was machen
15
     }
16
    
17
18
  if (taste == 0b00000100)
19
     {
20
     //was machen
21
     }    
22
  
23
    if (taste == 0b00000010)
24
     {
25
     //was machen
26
     }
27
    
28
  
29
    if (taste == 0b00000001)
30
     {
31
      // was machen
32
     }      
33
    
34
  }

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.