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?
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?
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
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!
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.