Ilm_Stoffel
13.12.2011, 10:09
Hallo, ich habe ein Problem mit meinem Asuro.
Die Funktion poll-switch sollte ja eigentlich die Werte 0, 1, 2, 4, 8, 16, 32 zurückgeben. Im Teste waren bei mir alle Werte um Eins zu klein, d.h. scheinbar ging der eine Taster, der sonst 1 liefern sollte, nicht. Ich habe daraufhin den Wert von 63 im Funktionsrückgabewert der pollSwitch Funktion geändert kam jedoch nicht auf die angestrebten Werte (Ich hab alle Werte von 55 bis 65 durchprobiert).
Der normale Rückgabewert lautet
return ((10240000 / (long)i - 10000) * 63L + 5000) / 10000;
Testweise hab ich mal ein +1 dahintergeschrieben also:
return ((10240000 / (long)i - 10000) * 63L + 5000) / 10000 +1;
-> Werte von 32, 16, 8, 4, 2, 1. Natürlich war jetzt aber auch wenn kein Schalter gerdückt wurde der Rückgabewert eins.
Also habe ich mir Spaßhalber mal den Wert i zurückgeben lassen und festgestellt das alle Taster wirklich funktionieren und unterschiedliche Werte liefern. Wenn kein Schalter gedrückt war lieferte die Funktion den Rückgabewert 255.
Also hab ich folgenden Code eingefügt:
int x=1;
if((unsigned char)i==255){0}
return ((10240000 / (long)i - 10000) * 63L + 5000) / 10000 + x;
Das sollte Bewirken das immer Eins addiert wird falls ein Taster gedrück ist und sonst eben 0 addiert wird.
Ich habe auch den x-Wert ausgeben lassen und alles hat gepasst. Er war 1 für gedrückte Taster und 0 für keinen Taster.
Die Funktionsausgabe macht jetzt aber überhaupt keinen Sinn mehr, es kommt irgendwas um die 190 zurück.
return ((10240000 / (long)i - 10000) * 63L + 5000) / 10000 + ((unsigned char)i == 255)?0:1;
Auch auf diese Weise kommt der Wert mit 190 raus. Ich hab auch versucht den x Wert nicht als Integer sondern als Unsigned Char zu deklarieren auch das hat nichts geändert.
Wie kann es sein das eine simple Addition funktioniert wenn ich '+1' oder '+0' dranschreibe aber komische Werte liefert wenn ich den selben Wert als Variable addiere?
Aus Verzweiflung habe ich sogar noch versucht die Addition im Integer-Bereich durchzuführen falls die Probleme wegen dem Datentyp char auftauchen.
unsigned char val = ((10240000 / (long)i - 10000) * 63L + 5000) / 10000;
int val_int = val;
int x=1;
if((unsigned char)i == 255){x=0;}
return val_int;
... so Funktioniert die Ausgabe auch mit 31, 15, 7, 3, 1. Aber sobald ich
val_int = val_int+x; oder
return val_int+x; einfüge kommen wieder die Werte um die 190 raus.
Meine letzte Idee wäre es in der Poll_Switch Funktion den Rückgabewert "return i; " zu lassen und eine weitere Funktion schreibe die den i-Wert durch eine große Switch-Case Anweisung schickt um die Tasterwerte dann richtig zu setzten. Da ich maximal 2 Taster gleichzeitig bräuchte wären das aber immernoch 21 Case-Fälle. Das wäre eine unschöne Lösung auf dich ich ungern zurückgreifen würde.
Hat irgendjemand eine Idee für mich wie ich das Problem in den Griff bekomme?
PS: Es scheint bei weitem kein einzelfall zu sein, viele meiner Kommilitonen haben auch das Problem sind bisher allerdings immer davon ausgegangen das der eine Taster einfach kaputt ist.
Achja falls sich jemand wundert: ich habe auch die Werte von zwei gedrückten Tasten alle angeschaut und das +1 würde auch für zwei Taster noch zum richtigen Bitmuster führen.
Die Funktion poll-switch sollte ja eigentlich die Werte 0, 1, 2, 4, 8, 16, 32 zurückgeben. Im Teste waren bei mir alle Werte um Eins zu klein, d.h. scheinbar ging der eine Taster, der sonst 1 liefern sollte, nicht. Ich habe daraufhin den Wert von 63 im Funktionsrückgabewert der pollSwitch Funktion geändert kam jedoch nicht auf die angestrebten Werte (Ich hab alle Werte von 55 bis 65 durchprobiert).
Der normale Rückgabewert lautet
return ((10240000 / (long)i - 10000) * 63L + 5000) / 10000;
Testweise hab ich mal ein +1 dahintergeschrieben also:
return ((10240000 / (long)i - 10000) * 63L + 5000) / 10000 +1;
-> Werte von 32, 16, 8, 4, 2, 1. Natürlich war jetzt aber auch wenn kein Schalter gerdückt wurde der Rückgabewert eins.
Also habe ich mir Spaßhalber mal den Wert i zurückgeben lassen und festgestellt das alle Taster wirklich funktionieren und unterschiedliche Werte liefern. Wenn kein Schalter gedrückt war lieferte die Funktion den Rückgabewert 255.
Also hab ich folgenden Code eingefügt:
int x=1;
if((unsigned char)i==255){0}
return ((10240000 / (long)i - 10000) * 63L + 5000) / 10000 + x;
Das sollte Bewirken das immer Eins addiert wird falls ein Taster gedrück ist und sonst eben 0 addiert wird.
Ich habe auch den x-Wert ausgeben lassen und alles hat gepasst. Er war 1 für gedrückte Taster und 0 für keinen Taster.
Die Funktionsausgabe macht jetzt aber überhaupt keinen Sinn mehr, es kommt irgendwas um die 190 zurück.
return ((10240000 / (long)i - 10000) * 63L + 5000) / 10000 + ((unsigned char)i == 255)?0:1;
Auch auf diese Weise kommt der Wert mit 190 raus. Ich hab auch versucht den x Wert nicht als Integer sondern als Unsigned Char zu deklarieren auch das hat nichts geändert.
Wie kann es sein das eine simple Addition funktioniert wenn ich '+1' oder '+0' dranschreibe aber komische Werte liefert wenn ich den selben Wert als Variable addiere?
Aus Verzweiflung habe ich sogar noch versucht die Addition im Integer-Bereich durchzuführen falls die Probleme wegen dem Datentyp char auftauchen.
unsigned char val = ((10240000 / (long)i - 10000) * 63L + 5000) / 10000;
int val_int = val;
int x=1;
if((unsigned char)i == 255){x=0;}
return val_int;
... so Funktioniert die Ausgabe auch mit 31, 15, 7, 3, 1. Aber sobald ich
val_int = val_int+x; oder
return val_int+x; einfüge kommen wieder die Werte um die 190 raus.
Meine letzte Idee wäre es in der Poll_Switch Funktion den Rückgabewert "return i; " zu lassen und eine weitere Funktion schreibe die den i-Wert durch eine große Switch-Case Anweisung schickt um die Tasterwerte dann richtig zu setzten. Da ich maximal 2 Taster gleichzeitig bräuchte wären das aber immernoch 21 Case-Fälle. Das wäre eine unschöne Lösung auf dich ich ungern zurückgreifen würde.
Hat irgendjemand eine Idee für mich wie ich das Problem in den Griff bekomme?
PS: Es scheint bei weitem kein einzelfall zu sein, viele meiner Kommilitonen haben auch das Problem sind bisher allerdings immer davon ausgegangen das der eine Taster einfach kaputt ist.
Achja falls sich jemand wundert: ich habe auch die Werte von zwei gedrückten Tasten alle angeschaut und das +1 würde auch für zwei Taster noch zum richtigen Bitmuster führen.