PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Seltsames Verhalten: bumper_right



stereolog
18.08.2011, 17:01
Hallo!

Ich hab mich als Neueinsteiger mal sehr grundlegend mit den ersten Beispielprogrammen beschäftigt und ein paar Sachen ausprobiert.
Dabei habe ich folgendes einfaches Testprogramm geschrieben:


void bumpersStateChanged(void)
{
statusLEDs.LED5 = bumper_left;
statusLEDs.LED4 = (!bumper_left);
statusLEDs.LED2 = bumper_right;
statusLEDs.LED1 = (!bumper_right);

updateStatusLEDs();
}

int16_t main(void)
{
initRobotBase();
BUMPERS_setStateChangedHandler(bumpersStateChanged );

while(true)
{
task_RP6System();
}
return 0;
}

Das sollte passieren:
Wenn der rechte Bumper gedrückt wird sollte LED1 ausgehen, dafür LED2 an. Analog beim linken Bumper und LEDs 4 und 5.

Das passiert wirklich:
Beim linken Bumper klappt alles super, rechts geht zwar LED1 beim Betätigen des Bumpers aus, LED2 geht aber NICHT an!
Noch seltsamer ist aber: Wenn ich

statusLEDs.LED2 = bumper_right;
ersetze durch

statusLEDs.LED2 = (!(!bumper_right));
funktioniert es wie erwartet...was ist da denn los?!?

Gruß, Benny

SlyD
18.08.2011, 18:30
Hallo,

die Bumper Variablen sind soweit ich mich erinnere NICHT unbedingt einfach nur 0 oder 1 (für den linken schon, für den rechten nicht s.u. ). Da wird nur das jeweilige Portbit gesetzt damits eine möglichst kurze routine bleibt.
Für logische Abfragen und Operatoren wie ! kein problem da alles was >0 ist in C als logisch wahr betrachtet wird. Für Zuweisungen allerdings kanns komische Resultate geben da muss man dann entsprechend konvertieren.
Entweder so wie Du das schon gemacht hast oder als inline if abfrage

statusLEDs.LED2 = bumper_right ? 1 : 0;

Schau Dir den Bumper Code in der RP6 Library an da sieht man das.
( uint8_t tmp = PINC & SL3;
für Bumper right --> SL3 ist (1 << PINC6) )

MfG,
SlyD

radbruch
18.08.2011, 18:48
Hallo,

genau über das bin ich bei meinen allerersten Spielereien mit meinem RP6 auch gestolpert:


#include "RP6RobotBaseLib.h"

#define blinkLED6 statusLEDs.LED6=(getStopwatch1() & (1<<6)) && 1

uint8_t blink3;

int main(void)
{
initRobotBase();
setLEDs(0);

//Zeitgeber für das Blinken starten
startStopwatch1();

while(true)
{
//LED1 blinkt langsam
statusLEDs.LED1 ^=(getStopwatch1() & (1<<9));

//LED2 blinkt schnell
statusLEDs.LED2=(getStopwatch1() & (1<<7)) && 1;

//LED3 blinkt variabel (0 bedeutet aus)
blink3=8;
statusLEDs.LED3=(getStopwatch1() & (1<<blink3)) && 1;

//LED4 flasht
statusLEDs.LED4=!(getStopwatch1() & (0b101<<6)) && 1;

//LED5 flackert
statusLEDs.LED5=(getStopwatch1() & (0b1001<<5)) && 1;

//LED6 blinkt mit #define
blinkLED6;

//LED-Status aktuallisieren
updateStatusLEDs();

//das funktioniert natürlich auch mit der pwrLED
if (!(getStopwatch1() & (9<<8)) && 1) powerON(); else powerOFF();
}
return 0;
}(Aus: https://www.roboternetz.de/community/threads/33273-Ich-brauche-Programme-f%C3%BCr-den-RP6.?p=315277&viewfull=1#post315277)

... und habe dann festgestellt, dass ein schlichtes " && 1" ausreicht um das Problem zu beheben.

Gruß

mic

stereolog
19.08.2011, 15:14
Danke für die Aufklärung, SlyD!
Aber wie ist es denn mit den Variablen obstacle_left und obstacle_right?
Im Beispiel "Example_04_ACS" wir das Gleiche damit gemacht:



statusLEDs.LED5 = obstacle_left;
statusLEDs.LED4 = (!obstacle_left);
statusLEDs.LED2 = obstacle_right;
statusLEDs.LED1 = (!obstacle_right);


Und das funktioniert ja einwandfrei. Haben diese Variablen denn definierte boolsche Werte?

SlyD
19.08.2011, 15:26
Die ACS routinen sind ja anders als die der Bumper.
Schau einfach in die task_ACS() Funktion rein - da sieht man das obstacle_left und right nur true und false zugewiesen werden.

MfG,
SlyD