Hallo
Über diesen "Denkfehler" bin ich auch schon gestolpert. Ursache für dieses unerwartete Verhalten ist die struct-Definition der LEDs. Mit einem Struct kann man sich eigene Datentypen erzeugen die beliebige Bitlängen haben. In "RP6RobotBaseLib.h" steht folgendes:
Unten sieht man, dass jede LED nur ein Bit belegt (LED1:1;...). Wenn man nun eine LED setzen möchte, wird vom übergebenen Wert nur ein Bit (das letzte, genannt Bit0) ausgewertet und gegebenenfalls gesetzt, z.b. statusLEDs.LED1=1 bedeutet statusLEDs.LED1=0b00000001 (dezimal 0 wäre binär 0b00000000 also LED aus.) Soweit alles klar?Code:union { uint8_t byte; struct { unsigned LEDsR:3; unsigned LEDsL:3; unsigned reserved:2; }; struct { unsigned LED1:1; unsigned LED2:1; unsigned LED3:1; unsigned LED4:1; unsigned LED5:1; unsigned LED6:1; unsigned reserved1:1; unsigned reserved2:1; }; } statusLEDs;
Nun zu den Bumpers. Die Werte in bumper_left/bumper_right werden im Bumpers-Task durch die Funktionen getBumperLeft()/getBumperRight() eingelesen. Im Rückgabewert der Funktionen (und damit auch in den Variablen bumper_left/bumper_right) steht jeweils das Ergebniss der Portabfrage als 8-bit-Wert.
Der betreffende Eingang für den linken Bumper ist Port B0, bei gedrückten Taster wird deshalb der Wert 1 (binär 0b00000001) eingelesen und in bumper_left gespeichert. statusLEDs.LED4=bumper_left bedeutet dann statusLEDs.LED4=0b00000001 und die LED ist eingeschaltet.
Der Eingang für den rechten Bumper ist Port C6. Bei gedrücktem Bumper wird hier deshalb 2^6 oder 64 eingelesen und in bumper_right gespeichert. statusLEDs.LED1=bumper_right bedeutet dann statusLEDs.LED1=0b01000000. Bit0 ist also 0, die LED bleibt dunkel. Aha!
Lösung: Man vergleicht bumper_right mit 64 und setzt mit dem Ergebniss dieses Vergleichs die LED:
statusLEDs.LED1=bumper_right==64
Bei gedrücktem Bumper ist der Vergleich true und somit geht die LED an. (ACHTUNG! Das funktioniert nicht generell in C weil nicht definiert ist, wie der Compiler intern ein true speichert. true könnte auch z.B. 0b10000000 sein. Nur so am Rande erwähnt):
Der Vollständigkeit halber: Das funktioniert so nur, weil in der Rangfolge der Operatoren == vor = kommt (wie Punkt vor Strich) Im Zweifel (und zur besseren Lesbarkeit des Programms) verwendet man besser Klammern:Code:#include "RP6RobotBaseLib.h" int main(void) { initRobotBase(); while(true) { statusLEDs.LED1=bumper_right==64; statusLEDs.LED2=bumper_right==64; statusLEDs.LED5=bumper_left; statusLEDs.LED4=bumper_left; task_Bumpers(); updateStatusLEDs(); } return 0; }
statusLEDs.LED1=(bumper_right==64);
Der erzeugte Code ist aber in beiden Fällen gleich.
Gruß
mic






Zitieren

Lesezeichen