mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Tastaturabfrage


Autor: Ingo Laabs (grobian)
Datum:

Bewertung
0 lesenswert
nicht 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 ?
//Tastatur
  DDRA  &= ~(1<<PA3) | (1<<PA2)  | (1<<PA1) | (1<<PA0);  // als Eingang 
  PORTA |= (1<<PA3)  | (1<<PA2)  | (1<<PA1) | (1<<PA0);    // internen Pull-Up  aktivieren 

 
  while(1)
  {

    // taste 3
  if  ( !(PINA & (1<<PINA3)) ) // ist 0 ? 
      {
    // mach was 
       }
    
  // taste 2
  if  ( !(PINA & (1<<PINA2)) ) // ist 0 ? 
      {
    //mach was anderes
       }    
    
  // taste 1
  if  ( !(PINA & (1<<PINA1)) ) // ist 0 ? 
      {
    // mach was völlig anderes
       }
    
  // taste 0
  if  ( !(PINA & (1<<PINA0)) ) // ist 0 ? 
      {
     //mach was völlig, völlig anderes
       }      
    
  }



Autor: Timmo H. (masterfx)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Ingo Laabs (grobian)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
würde es denn nicht folgende Konstellation machen
//Tastatur
  DDRA  = 0;
    
  PORTA = 255;
  //Tastatur ende 
 
 
  while(1)
  {
  taste = PINA;
    
  if (taste == 0b00001000)
     {
     //was machen
     }
    

  if (taste == 0b00000100)
     {
     //was machen
     }    
  
    if (taste == 0b00000010)
     {
     //was machen
     }
    
  
    if (taste == 0b00000001)
     {
      // was machen
     }      
    
  }

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.