-
Tasterauswertung
Guten Abend,
hab bis jetzt nichts dazu gefunden.
Ist es möglich jeden Taster einzeln auszuwerten, also jedem einzeln eine Funktion zuzuweisen?
z.B.:
K1 = StatusLed: rot
K2 = StatusLed: grün
K3 = StatusLed: gelb
K4 = StatusLed: Aus
K5 = BackLed: On/Off
K6 = BackLed: Off/On
MfG
Ezalo
-
Kannst du im Binaires Zahl-system rechnen? K1 bis K6 haben allen ihres eigene Wert der ein Machte von 2 ist. K6=1 (ganz rechts von hinten gesehen: 2 zum Macht 0), K5=2 (2 zum Macht 1), K4=4 (2 zum Macht 2), usw. bis K1=32. Also jede Wert der PollSwitch zurück liefert ist einer kombination von dieser Tastern, und auch einer Summe von ein oder mehr diesen Werten. Zbs, wir bekommen den Wert 22 von PollSwitch. Das ist 2+4+16, also sind das die taster K5,K4 und K2.
Code:
2 zum macht: 7 6 5 4 3 2 1 0
128 64 32 16 8 4 2 1
22 = (binair) 0 0 0 1 0 1 1 0
Das kann man auswerten in einem if-abfrage mit hilfe von bitweise-UND operatoren:
http://www.rn-wissen.de/index.php/C-...Bit-Operatoren
Diese operatoren vergleichen die bits in 2 werten (ein variabele und einer bestimmte wert der ein oder mehrere bits anzeigt) und setzen das antwort an hand der logische funktion (UND, ODER, exclusief-ODER).
Code:
char Taster=PollSwitch();
If (Taster & 16) { /* Taster K2 ist geprellt! */ }
If (Taster & 0b00010001) {
/* bitweise UND mit einer Binaires zahl, 17, gemacht. */
/* oder Taster K2=16, oder Taster K6=1 geprellt! */
}
Ich hoffe du kannst hier mit weiter ausprobieren. Ich finde es schwer mich genau auszudrücken auf deutsch.
-
Joa, du meinst das jeder Taster einen Binären wert liefert, also: 2 hoch 0, 2 hoch 1 usw. wobei 2 hoch 0 = 1 ist, 2 hoch 1 = 2, 2 hoch 2 = 4. das hab ich soweit verstanden da ich das ja auch in der Ausbildung dran hatte ^^
Das heißt mit den binären Werten kann ich genau den Taster abfragen den ich haben will :D
Gleich mal probieren.
Danke erstmal
Edit: Das man da manchmal nicht selber drauf kommt ^^
Funktioniert prima.
-
Du kannst 6 mal fuhr einer bestimmte Taster testen und den bestimmte funktion anrufen oder code-block ausfuhren.
-
Einfach testen ob den Wert von PollSwitch gleich an 1,2,4,8,16 oder 32 ist geht auch. Aber das funktioniert nicht wan mehrere tasten gleichzeitig angeprellt sind. Dan muss man dieser bit-testen machen.
-
In dem datei Test.c von den SelbTest quell code steht wie das beim Selbtest gemacht wird:
Code:
/* ---------------------- */
/* ----- Switch Test ---- */
/* K1 -> Status LED Green */
/* K2 -> Status LED RED */
/* K3 -> Line LED */
/* K4 -> Break LED Left */
/* K5 -> Break LED Rigth */
/* K6 -> Motor Left */
/* ---------------------- */
void SwitchTest(void)
{
unsigned char sw,tmp;
MotorDir(FWD,BREAK);
sw = PollSwitch();
StatusLED(OFF);
FrontLED(OFF);
BackLED(OFF,OFF);
MotorSpeed(0,0);
tmp = 0;
if (sw & 0x01)
MotorSpeed(200,0);
if (sw & 0x02) {
BackLED(OFF,ON);
tmp = ON;
}
if (sw & 0x04)
BackLED(ON,tmp);
if (sw & 0x08)
FrontLED(ON);
if (sw & 0x10)
RED_LED_ON;
if (sw & 0x20)
GREEN_LED_ON;
}
/* END Switch Test ------------------------------ */
-
Habs jetzt so:
Code:
...
unsigned char sw1, sw2;
while(1){
sw1 = PollSwitch();
sw2 = PollSwitch();
if ((sw1 & 0b000001) || (sw2 & 0b000001)){
StatusLED(RED);
}
else if ((sw1 & 0b000010) || (sw2 & 0b000010)){
StatusLED(YELLOW);
}
else if ((sw1 & 0b000100) || (sw2 & 0b000100)){
StatusLED(GREEN);
}
else if ((sw1 & 0b001000) || (sw2 & 0b001000)){
StatusLED(OFF);
}
else if ((sw1 & 0b010000) || (sw2 & 0b010000)){
BackLED(ON,ON);
}
else if ((sw1 & 0b100000) || (sw2 & 0b100000)){
BackLED(OFF,OFF);
}
...
Allerdings gehts so nicht ^^
Drücke ich jetzt K2 gehen die BackLed's an und die StautsLed schaltet auf Rot. Die StatusLed lässt sich auch nicht mit K3 ausschalten und Die BackLed's gehen bei betätigen von K1 auch nicht aus.
-
Du liest die Tastern in dem falsche Richtung. K1 sitzt an die IR Sender/Empfänger Seite. Und ist die wert 32. Also stimmt dein Programm im Prinzip, leider sind die Funktion anrufen in dem falsche folge.
-
Ich weiß das meine Reihenfolge (Asuro von Batterie richtung taster sehende) von rechts nach links geht. Und K1, K2, K3 sind demzufolge links?
Dann versteh ich aber Trotzdem nicht wieso das beschriebene bei K1-K3 passiert obwohl das Programm etwas anderes sagt.
-
AHA...
ich dachte es wäre egal ob ich sie von K6 Richtung K1 auswerte oder von K1 Richtung K6 ^^ Aber scheint wohl nicht so.
Hab jetzt den Code auf K1 (links) nach K6 (rechts) umgeändert und nun funktioniert es wie es soll.
Danke
Edit: Wieso schalte ich mit antippen von K5 die BackLed's aus?
Edit2: Wenn ich die BackLed's mit K5 anschalte (wenn sie dnen anbleiben) kann ich mit K2 die StatusLed nicht mehr auf Gelb stellen, wieso das?