Tastaturabfrage

OP #1919263
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
  }
#1919275
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
#1919404
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.
OP #1919461
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
  }

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren