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


von Ich B. (ichbin)


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?

von Karl H. (kbuchegg)


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?

von peter dannegger (Gast)


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:
1
//
2
  if( get_key_press( 1<<KEY0 )){
3
    if( key_state & 1<<KEY1 ){
4
      // 2. Funktion, Shift (KEY1) gedrückt
5
    }else{
6
      // 1. Funktion, Shift losgelassen 
7
    }
8
  }

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/310276/C_TAST.C


Peter

von Ich B. (ichbin)


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!

von Ich B. (ichbin)


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!

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.