tasten gleichzeitig gedrückt - entprellt feststellen?

OP #363758
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?
#363759
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?
Gast #363760
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

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