www.mikrocontroller.net

Forum: Compiler & IDEs tasten gleichzeitig gedrückt - entprellt feststellen?


Autor: Ich Bin (ichbin)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Dank der bekloppten Betrefflängenüberprüfung alles nochmal. Dabei
limitiert das Formular die Datenlänge auf 60 Zeichen!? Egal.

Also, ich habe Peters Entprellroutine in erweiterter Form:

....
key_i &= ct0 & ct1;
key_release |= key_state & key_i;
key_state ^= key_i;
key_press |= key_state & key_i;

um den entprellten Zustand und die Flankenwechsel abfragen zu können.
Funktioniert auch gut.
Den Zustand frage ich mit der noninvasiven Fkt.

uint8_t switch_state( uint8_t key_mask ){
  cli();
  key_mask &= key_state;
  sei();
  return key_mask;
}

ab.

Alle Versuche, zwei gleichzeitig gedrückte Tasten zu erkennen schlagen
bislang fehl..

So ..
if((switch_state(1<<KEYr) && switch_state(1<<KEYr)))

aber auch so ..
if((switch_state(1<<KEYr | 1<<KEYr)))

Was mache ich falsch?

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

Bewertung
0 lesenswert
nicht lesenswert
Ich geh mal davon aus, dass KEYr fuer irgendetwas
steht. Es ist klar, dass die beiden KEYr in den
if Abfragen verschieden sein muessen, da es sich ja
sonst immer um denselben Key handelt.
Moral: Poste immer realen Code! Sonst analysieren wir
hier Dinge raus, die Du in Wirklichkeit nicht geschrieben
hast.

> if((switch_state(1<<KEYr | 1<<KEYr)))

Das kann so nicht funktionieren. Dazu muesste die
switch_state Funktion genau dann TRUE zurueckliefern,
wenn alle Bits in der Maske auch in kay_mask gesetzt
sind. Das tut sie aber nicht. switch_state liefert
TRUE wenn irgendein Bit der Maske in key_mask gesetzt
ist.

Das laesst sich aber aendern:
uint8_t switch_state( uint8_t key_mask ){
  uint8_t tmp;
  cli();
  tmp = key_mask & key_state;
  sei();
  return key_mask == tmp;
}

Jetzt muessen alle Bits in key_mask auch in key_state
gesetzt sein, nur dann liefert switch_state TRUE zurueck.

> if((switch_state(1<<KEYr) && switch_state(1<<KEYr)))

Wenn die beiden KEYr in Wirklichkeit verschiedene
Variablen sind, dann sollte das schon funktionieren.
Hast Du mal ueberprueft, ob die entsprechenden Bits
an dieser Stelle in key_state auch tatsaechlich gesetzt
sind? Hast Du das ganze mal im Debugger durchgesteppt?

Autor: peter dannegger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Was willst Du machen ?

Soll das eine Shift-Taste werden, mit der man eine Zweitbelegung
realisiert ?

In dem Fall fragt man einfach noch den entprellten Zustand ab:
//
  if( get_key_press( 1<<KEY0 )){
    if( key_state & 1<<KEY1 ){
      // 2. Funktion, Shift (KEY1) gedrückt
    }else{
      // 1. Funktion, Shift losgelassen 
    }
  }

Die Shift-Taste muß vor der eigentlichen Taste gedrückt oder
losgelassen worden sein (exakt gleichzeitig ginge auch).

Das Ganze bezieht sich auf folgenden Code:

http://www.mikrocontroller.net/attachment.php/3102...


Peter

Autor: Ich Bin (ichbin)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hoppla, das mit dem doppelten Bit ist mir durch's Kopieren auch in mein
Programm reingerutscht.
Vielen Dank für die Antworten und die einhergehende Zuversicht - ich
werde es gleich mal nachvollziehen!

Autor: Ich Bin (ichbin)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
So, bei mir gibt es irgendeinen Faktor, der die Zuverlässigkeit extrem
heruntersetzt. Gerade eben ging es mit
if(switch_state(1<<KEYg) && switch_state(1<<KEYr))

Besten Dank für die Anregungen!

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.