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

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.