PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : fehlfunktion bei code



Roboman93
15.01.2008, 17:11
ich habe in den beispielcode move_05 ein paar variablen eingebaut, die zählen sollen, wie viele kollisionen es geb und eine funktion, die die deren wert an den bootlader sendet! jetzt bekomme ich die fehlermeldung:
invalid lvalue in increment! in der zeile betreffenden zeile steht aber nur: "e++;". und in der zweiten meldung steht: "error: expected declaration specifiers before 'while'". in der betreffenden zeile steht:

uint16_t zahler(void)
while (true)

kann mir da bitte jemand helfen? danke schon mal voraus

roboman

rp6flash
15.01.2008, 17:45
ich denke es wär sinnvoll den ganzen text zu posten. vll ist es irgentwie im zusammenhang.

auf jedenfall gint es in diesen 2 (3) zeilen keine fehler!

Tipp: vll ist es die Variable (uint16_t) versuch mal einfach ne andere.
vll bringts ja was

gruß

radbruch
15.01.2008, 17:47
Hallo,

sind etwas "dürftig" deine Codeschnippsel.

uint16_t zahler(void) definiert so eine Funktion und müsste wenigstens noch ein {[Körper]} besitzen, uint16_t zahler; würde ein Variable deklarieren.

Datentyp von e?

Gruß

mic

Roboman93
15.01.2008, 17:53
was meinste mit körper? e ist eine dec-zahl

radbruch
15.01.2008, 18:16
Hallo

Da aus deinen Schnippseln nicht erkennbar ist was "zahler" sein soll, gehe ich mal von zwei Möglichkeiten aus:

Eine Funktion mit 16-Bit Rückgabewert:

uint16_t zahler(void)
{
// Körper der Funktion
return(0);
}

oder ein vorzeichenloser 16-Bit-Wert:

uint16_t zahler;

Autoincrement/-decrement geht nicht mit speziellen Datentypen. Da es wohl ein Geheimniss ist, wie der Datentyp "dec" aussieht, kann ich da nicht helfen. Ansonsten wäre die Deklaration von e hilfreich.

Gruß

mic

Roboman93
15.01.2008, 19:04
ich sende einfach mal den ganzen text und die fehlermeldung:




Uncommented Version of RP6Base_Move_05.c!
// written by Dominik S. Herwald
// ------------------------------------------------------------------------------------------


#include "RP6RobotBaseLib.h"


#define IDLE 0

typedef struct {
uint8_t speed_left;
uint8_t speed_right;
unsigned dir:2;
unsigned move:1;
unsigned rotate:1;
uint16_t move_value;
uint8_t state;
} behaviour_command_t;

behaviour_command_t STOP = {0, 0, FWD, false, false, 0, IDLE};


#define CRUISE_SPEED_FWD 100

#define MOVE_FORWARDS 1
behaviour_command_t cruise = {CRUISE_SPEED_FWD, CRUISE_SPEED_FWD, FWD,
false, false, 0, MOVE_FORWARDS};


uint32_t behaviour_cruise(void)
{
return 0;
}



#define ESCAPE_SPEED_BWD 100
#define ESCAPE_SPEED_ROTATE 60

#define ESCAPE_FRONT 1
#define ESCAPE_FRONT_WAIT 2
#define ESCAPE_LEFT 3
#define ESCAPE_LEFT_WAIT 4
#define ESCAPE_RIGHT 5
#define ESCAPE_RIGHT_WAIT 6
#define ESCAPE_WAIT_END 7
behaviour_command_t escape = {0, 0, FWD, false, false, 0, IDLE};

#define a 0
#define b 0
#define c 0


uint32_t behaviour_escape(void)
{
static uint8_t bump_count = 0;

switch(escape.state)
{
case IDLE:
break;
case ESCAPE_FRONT:
c++; escape.speed_left = ESCAPE_SPEED_BWD;
escape.dir = BWD;
escape.move = true;
if(bump_count > 3)
escape.move_value = 220;
else
escape.move_value = 160;
escape.state = ESCAPE_FRONT_WAIT;
bump_count+=2;
break;
case ESCAPE_FRONT_WAIT:
if(!escape.move)
{
escape.speed_left = ESCAPE_SPEED_ROTATE;
if(bump_count > 3)
{
escape.move_value = 100;
escape.dir = RIGHT;
bump_count = 0;
}
else
{
escape.dir = LEFT;
escape.move_value = 70;
}
escape.rotate = true;
escape.state = ESCAPE_WAIT_END;
}
break;
case ESCAPE_LEFT:
b++;
escape.speed_left = ESCAPE_SPEED_BWD;
escape.dir = BWD;
escape.move = true;
if(bump_count > 3)
escape.move_value = 190;
else
escape.move_value = 150;
escape.state = ESCAPE_LEFT_WAIT;
bump_count++;
break;
case ESCAPE_LEFT_WAIT:
if(!escape.move)
{
escape.speed_left = ESCAPE_SPEED_ROTATE;
escape.dir = LEFT;
escape.rotate = true;
if(bump_count > 3)
{
escape.move_value = 110;
bump_count = 0;
}
else
escape.move_value = 80;
escape.state = ESCAPE_WAIT_END;
}
break;
case ESCAPE_RIGHT:
a++;
escape.speed_left = ESCAPE_SPEED_BWD ;
escape.dir = BWD;
escape.move = true;
if(bump_count > 3)
escape.move_value = 190;
else
escape.move_value = 150;
escape.state = ESCAPE_RIGHT_WAIT;
bump_count++;
break;
case ESCAPE_RIGHT_WAIT:
if(!escape.move)
{
escape.speed_left = ESCAPE_SPEED_ROTATE;
escape.dir = RIGHT;
escape.rotate = true;
if(bump_count > 3)
{
escape.move_value = 110;
bump_count = 0;
}
else
escape.move_value = 80;
escape.state = ESCAPE_WAIT_END;
}
break;
case ESCAPE_WAIT_END:
if(!(escape.move || escape.rotate))
escape.state = IDLE;
break;
}
return 0;
}


void bumpersStateChanged(void)
{
if(bumper_left && bumper_right)
{
escape.state = ESCAPE_FRONT;

}
else if(bumper_left)

{

if(escape.state != ESCAPE_FRONT_WAIT)
escape.state = ESCAPE_LEFT;

}
else if(bumper_right)

{

if(escape.state != ESCAPE_FRONT_WAIT)
escape.state = ESCAPE_RIGHT;
}
}


#define AVOID_SPEED_L_ARC_LEFT 30
#define AVOID_SPEED_L_ARC_RIGHT 90
#define AVOID_SPEED_R_ARC_LEFT 90
#define AVOID_SPEED_R_ARC_RIGHT 30

#define AVOID_SPEED_ROTATE 60

#define AVOID_OBSTACLE_RIGHT 1
#define AVOID_OBSTACLE_LEFT 2
#define AVOID_OBSTACLE_MIDDLE 3
#define AVOID_OBSTACLE_MIDDLE_WAIT 4
#define AVOID_END 5

behaviour_command_t avoid = {0, 0, FWD, false, false, 0, IDLE};

#define d 0
#define e 0
#define f 0

uint32_t behaviour_avoid(void)
{
static uint8_t last_obstacle = LEFT;
static uint8_t obstacle_counter = 0;
switch(avoid.state)
{
case IDLE:
if(obstacle_right && obstacle_left)
avoid.state = AVOID_OBSTACLE_MIDDLE;

else if(obstacle_left)
avoid.state = AVOID_OBSTACLE_LEFT;

else if(obstacle_right)
avoid.state = AVOID_OBSTACLE_RIGHT;

break;
case AVOID_OBSTACLE_MIDDLE:
f++;
avoid.dir = last_obstacle;
avoid.speed_left = AVOID_SPEED_ROTATE;
avoid.speed_right = AVOID_SPEED_ROTATE;
if(!(obstacle_left || obstacle_right))
{
if(obstacle_counter > 3)
{
obstacle_counter = 0;
setStopwatch4(0);
}
else
setStopwatch4(400);
startStopwatch4();
avoid.state = AVOID_END;
}
break;
case AVOID_OBSTACLE_RIGHT:
d++;
avoid.dir = FWD;
avoid.speed_left = AVOID_SPEED_L_ARC_LEFT;
avoid.speed_right = AVOID_SPEED_L_ARC_RIGHT;
if(obstacle_right && obstacle_left)
avoid.state = AVOID_OBSTACLE_MIDDLE;
if(!obstacle_right)
{
setStopwatch4(500);
startStopwatch4();
avoid.state = AVOID_END;
}
last_obstacle = RIGHT;
obstacle_counter++;
break;
case AVOID_OBSTACLE_LEFT:
e++;
avoid.dir = FWD;
avoid.speed_left = AVOID_SPEED_R_ARC_LEFT;
avoid.speed_right = AVOID_SPEED_R_ARC_RIGHT;
if(obstacle_right && obstacle_left)
avoid.state = AVOID_OBSTACLE_MIDDLE;
if(!obstacle_left)
{
setStopwatch4(500);
startStopwatch4();
avoid.state = AVOID_END;
}
last_obstacle = LEFT;
obstacle_counter++;
break;
case AVOID_END:
if(getStopwatch4() > 1000)
{
stopStopwatch4();
setStopwatch4(0);
avoid.state = IDLE;
}
break;
}
}

void acsStateChanged(void)
{
if(obstacle_left && obstacle_right)
statusLEDs.byte = 0b100100;
else
statusLEDs.byte = 0b000000;
statusLEDs.LED5 = obstacle_left;
statusLEDs.LED4 = (!obstacle_left);
statusLEDs.LED2 = obstacle_right;
statusLEDs.LED1 = (!obstacle_right);
updateStatusLEDs();
}

void moveCommand(behaviour_command_t * cmd)
{
if(cmd->move_value > 0)
{
if(cmd->rotate)
rotate(cmd->speed_left, cmd->dir, cmd->move_value, false);
else if(cmd->move)
move(cmd->speed_left, cmd->dir, DIST_MM(cmd->move_value), false);
cmd->move_value = 0;
}
else if(!(cmd->move || cmd->rotate))
{
changeDirection(cmd->dir);
moveAtSpeed(cmd->speed_left,cmd->speed_right);
}
else if(isMovementComplete())
{
cmd->rotate = false;
cmd->move = false;
}
}

void behaviourController(void)
{

behaviour_cruise();
behaviour_avoid();
behaviour_escape();

if(escape.state != IDLE)
moveCommand(&escape);
else if(avoid.state != IDLE)
moveCommand(&avoid);
else if(cruise.state != IDLE)
moveCommand(&cruise);
else
moveCommand(&STOP);
}

uint16_t zahler(void)
while (true){
writeString("Hindernis Rechts:");
writeInteger(d, DEC);
writeString("\n");
writeString("Hindernis Links:");
writeInteger(e, DEC);
writeString("\n");
writeString("Hindernis Mitte:");
writeInteger(f, DEC);
writeString("\n");
writeString("Kollision Rechts:");
writeInteger(a, DEC);
writeString("\n");
writeString("Kollision Links:");
writeInteger(b, DEC);
writeString("\n");
writeString("Kollision Mitte:");
writeInteger(c, DEC);
writeString("\n");
mSleep(10000);





int main(void)
{
initRobotBase();
setLEDs(0b111111);
mSleep(2500);
setLEDs(0b100100);

BUMPERS_setStateChangedHandler(bumpersStateChanged );

ACS_setStateChangedHandler(acsStateChanged);

powerON();
setACSPwrLow();

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


alles rote wurde mit der fehlermeldung kommentiert:error: invalid lvalue in increment



ich hoffe, ihr findet einen fehler!

vielen dank im voraus!

roboman

rp6flash
15.01.2008, 19:05
was er damit sagen will ist das du das "()" weglassen musst wenn du eine einfache variable haben willst

es reicht mit uint16_t zaehler;

ohne die klammern

rp6flash
15.01.2008, 19:08
also erstmal: dreckig geloffen! jetz muss ich nochmal nen post machen
naja dummer zufall eben

zu grün: du hast die "Variablen" mit define erstellt da kann man meiner meinung nach nicht inkrementieren.

zu rot: siehe oben bzw. lass dass "(void)" weg

Roboman93
15.01.2008, 19:10
und was muss ich machen, um sie inkrementieren zu können?

rp6flash
15.01.2008, 19:17
mach die "Variablen" einfach als echte variablen: int16_t zum beispiel

wenn dir des zuviel platz braucht kannst du in der documentation vom rp6 noch weitere typen rausgreifen. inkrementieren kannst du einfach mit a++,b++ ..... wie gehabt:



Uncommented Version of RP6Base_Move_05.c!
// written by Dominik S. Herwald
// ------------------------------------------------------------------------------------------


#include "RP6RobotBaseLib.h"


#define IDLE 0

typedef struct {
uint8_t speed_left;
uint8_t speed_right;
unsigned dir:2;
unsigned move:1;
unsigned rotate:1;
uint16_t move_value;
uint8_t state;
} behaviour_command_t;

behaviour_command_t STOP = {0, 0, FWD, false, false, 0, IDLE};


#define CRUISE_SPEED_FWD 100

#define MOVE_FORWARDS 1
behaviour_command_t cruise = {CRUISE_SPEED_FWD, CRUISE_SPEED_FWD, FWD,
false, false, 0, MOVE_FORWARDS};


uint32_t behaviour_cruise(void)
{
return 0;
}



#define ESCAPE_SPEED_BWD 100
#define ESCAPE_SPEED_ROTATE 60

#define ESCAPE_FRONT 1
#define ESCAPE_FRONT_WAIT 2
#define ESCAPE_LEFT 3
#define ESCAPE_LEFT_WAIT 4
#define ESCAPE_RIGHT 5
#define ESCAPE_RIGHT_WAIT 6
#define ESCAPE_WAIT_END 7
behaviour_command_t escape = {0, 0, FWD, false, false, 0, IDLE};

int16_t a = 0;
int16_t b = 0;
int16_t c = 0;


uint32_t behaviour_escape(void)
{
static uint8_t bump_count = 0;

switch(escape.state)
{
case IDLE:
break;
case ESCAPE_FRONT:
c++; escape.speed_left = ESCAPE_SPEED_BWD;
escape.dir = BWD;
escape.move = true;
if(bump_count > 3)
escape.move_value = 220;
else
escape.move_value = 160;
escape.state = ESCAPE_FRONT_WAIT;
bump_count+=2;
break;
case ESCAPE_FRONT_WAIT:
if(!escape.move)
{
escape.speed_left = ESCAPE_SPEED_ROTATE;
if(bump_count > 3)
{
escape.move_value = 100;
escape.dir = RIGHT;
bump_count = 0;
}
else
{
escape.dir = LEFT;
escape.move_value = 70;
}
escape.rotate = true;
escape.state = ESCAPE_WAIT_END;
}
break;
case ESCAPE_LEFT:
b++;
escape.speed_left = ESCAPE_SPEED_BWD;
escape.dir = BWD;
escape.move = true;
if(bump_count > 3)
escape.move_value = 190;
else
escape.move_value = 150;
escape.state = ESCAPE_LEFT_WAIT;
bump_count++;
break;
case ESCAPE_LEFT_WAIT:
if(!escape.move)
{
escape.speed_left = ESCAPE_SPEED_ROTATE;
escape.dir = LEFT;
escape.rotate = true;
if(bump_count > 3)
{
escape.move_value = 110;
bump_count = 0;
}
else
escape.move_value = 80;
escape.state = ESCAPE_WAIT_END;
}
break;
case ESCAPE_RIGHT:
a++;
escape.speed_left = ESCAPE_SPEED_BWD ;
escape.dir = BWD;
escape.move = true;
if(bump_count > 3)
escape.move_value = 190;
else
escape.move_value = 150;
escape.state = ESCAPE_RIGHT_WAIT;
bump_count++;
break;
case ESCAPE_RIGHT_WAIT:
if(!escape.move)
{
escape.speed_left = ESCAPE_SPEED_ROTATE;
escape.dir = RIGHT;
escape.rotate = true;
if(bump_count > 3)
{
escape.move_value = 110;
bump_count = 0;
}
else
escape.move_value = 80;
escape.state = ESCAPE_WAIT_END;
}
break;
case ESCAPE_WAIT_END:
if(!(escape.move || escape.rotate))
escape.state = IDLE;
break;
}
return 0;
}


void bumpersStateChanged(void)
{
if(bumper_left && bumper_right)
{
escape.state = ESCAPE_FRONT;

}
else if(bumper_left)

{

if(escape.state != ESCAPE_FRONT_WAIT)
escape.state = ESCAPE_LEFT;

}
else if(bumper_right)

{

if(escape.state != ESCAPE_FRONT_WAIT)
escape.state = ESCAPE_RIGHT;
}
}


#define AVOID_SPEED_L_ARC_LEFT 30
#define AVOID_SPEED_L_ARC_RIGHT 90
#define AVOID_SPEED_R_ARC_LEFT 90
#define AVOID_SPEED_R_ARC_RIGHT 30

#define AVOID_SPEED_ROTATE 60

#define AVOID_OBSTACLE_RIGHT 1
#define AVOID_OBSTACLE_LEFT 2
#define AVOID_OBSTACLE_MIDDLE 3
#define AVOID_OBSTACLE_MIDDLE_WAIT 4
#define AVOID_END 5

behaviour_command_t avoid = {0, 0, FWD, false, false, 0, IDLE};

#define d 0
#define e 0
#define f 0

uint32_t behaviour_avoid(void)
{
static uint8_t last_obstacle = LEFT;
static uint8_t obstacle_counter = 0;
switch(avoid.state)
{
case IDLE:
if(obstacle_right && obstacle_left)
avoid.state = AVOID_OBSTACLE_MIDDLE;

else if(obstacle_left)
avoid.state = AVOID_OBSTACLE_LEFT;

else if(obstacle_right)
avoid.state = AVOID_OBSTACLE_RIGHT;

break;
case AVOID_OBSTACLE_MIDDLE:
f++;
avoid.dir = last_obstacle;
avoid.speed_left = AVOID_SPEED_ROTATE;
avoid.speed_right = AVOID_SPEED_ROTATE;
if(!(obstacle_left || obstacle_right))
{
if(obstacle_counter > 3)
{
obstacle_counter = 0;
setStopwatch4(0);
}
else
setStopwatch4(400);
startStopwatch4();
avoid.state = AVOID_END;
}
break;
case AVOID_OBSTACLE_RIGHT:
d++;
avoid.dir = FWD;
avoid.speed_left = AVOID_SPEED_L_ARC_LEFT;
avoid.speed_right = AVOID_SPEED_L_ARC_RIGHT;
if(obstacle_right && obstacle_left)
avoid.state = AVOID_OBSTACLE_MIDDLE;
if(!obstacle_right)
{
setStopwatch4(500);
startStopwatch4();
avoid.state = AVOID_END;
}
last_obstacle = RIGHT;
obstacle_counter++;
break;
case AVOID_OBSTACLE_LEFT:
e++;
avoid.dir = FWD;
avoid.speed_left = AVOID_SPEED_R_ARC_LEFT;
avoid.speed_right = AVOID_SPEED_R_ARC_RIGHT;
if(obstacle_right && obstacle_left)
avoid.state = AVOID_OBSTACLE_MIDDLE;
if(!obstacle_left)
{
setStopwatch4(500);
startStopwatch4();
avoid.state = AVOID_END;
}
last_obstacle = LEFT;
obstacle_counter++;
break;
case AVOID_END:
if(getStopwatch4() > 1000)
{
stopStopwatch4();
setStopwatch4(0);
avoid.state = IDLE;
}
break;
}
}

void acsStateChanged(void)
{
if(obstacle_left && obstacle_right)
statusLEDs.byte = 0b100100;
else
statusLEDs.byte = 0b000000;
statusLEDs.LED5 = obstacle_left;
statusLEDs.LED4 = (!obstacle_left);
statusLEDs.LED2 = obstacle_right;
statusLEDs.LED1 = (!obstacle_right);
updateStatusLEDs();
}

void moveCommand(behaviour_command_t * cmd)
{
if(cmd->move_value > 0)
{
if(cmd->rotate)
rotate(cmd->speed_left, cmd->dir, cmd->move_value, false);
else if(cmd->move)
move(cmd->speed_left, cmd->dir, DIST_MM(cmd->move_value), false);
cmd->move_value = 0;
}
else if(!(cmd->move || cmd->rotate))
{
changeDirection(cmd->dir);
moveAtSpeed(cmd->speed_left,cmd->speed_right);
}
else if(isMovementComplete())
{
cmd->rotate = false;
cmd->move = false;
}
}

void behaviourController(void)
{

behaviour_cruise();
behaviour_avoid();
behaviour_escape();

if(escape.state != IDLE)
moveCommand(&escape);
else if(avoid.state != IDLE)
moveCommand(&avoid);
else if(cruise.state != IDLE)
moveCommand(&cruise);
else
moveCommand(&STOP);
}

uint16_t zahler
while (true){
writeString("Hindernis Rechts:");
writeInteger(d, DEC);
writeString("\n");
writeString("Hindernis Links:");
writeInteger(e, DEC);
writeString("\n");
writeString("Hindernis Mitte:");
writeInteger(f, DEC);
writeString("\n");
writeString("Kollision Rechts:");
writeInteger(a, DEC);
writeString("\n");
writeString("Kollision Links:");
writeInteger(b, DEC);
writeString("\n");
writeString("Kollision Mitte:");
writeInteger(c, DEC);
writeString("\n");
mSleep(10000);





int main(void)
{
initRobotBase();
setLEDs(0b111111);
mSleep(2500);
setLEDs(0b100100);

BUMPERS_setStateChangedHandler(bumpersStateChanged );

ACS_setStateChangedHandler(acsStateChanged);

powerON();
setACSPwrLow();

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

bitte beachte das die zeile

uint16_t zaehler;
nur die variable zaehler initialisiert, d.h. rp6 weis das die variable existiert!!

Roboman93
16.01.2008, 15:27
danke, hat sich erledigt! das mit dem uint16_t zahler (void) ist ja ne funktion! ich habe die variablen jetzt nicht definiert, sondert als 16bitvariable angegeben!(uint16_t a). jetzt klappt alles super!

danke an alle,

roboman

Roboman93
16.01.2008, 16:16
sry, doch noch ein fehler:

jetzt kommt die fehlermeldung:error: expected expression before 'else'

in den zeilen steht:
uint16_t behaviour_avoid(void)
{
static uint8_t last_obstacle = LEFT;
static uint8_t obstacle_counter = 0;
switch(avoid.state)
{
case IDLE:
if(obstacle_right && obstacle_left)
f++;
avoid.state = AVOID_OBSTACLE_MIDDLE;
else if(obstacle_left)
e++;
avoid.state = AVOID_OBSTACLE_LEFT;
else if(obstacle_right)
avoid.state = AVOID_OBSTACLE_RIGHT;
d++;

break;

bitte um hilfe, was falsch sein könnte!

roboman

Roboman93
16.01.2008, 16:53
hat sich schon erledigt

Roboman93
22.01.2008, 20:23
noch ne frage zu nem anderen code! ich will, dass ein servo sich hin und her bewegt! dazu klemme ich den signaleingang vom servo an eine LED!

wenn ich den code ausführe, bewegt sich der servo nach rechts(soweit richtig) aber danach immer weiter nach rechts, obwohl er schon längst die maximale position (20) erreicht hat!

hier der code:

#include "RP6RobotBaseLib.h"
uint16_t servopos = 20;


int main (void)
{
initRobotBase();
while (true)
{
task_RP6System();
servoposi();
}
return 0;
}


void servotrim(void)
{
setLEDs(0b000000);
sleep(200-servopos);
setLEDs(0b010000);
sleep(servopos);
}

void servoposi(void)
{
if(servopos==10)
{
while(servopos != 20)
{
servopos++;
servotrim();
mSleep(50);
}
}
else if(servopos==20)
{
while(servopos != 10)
{
servopos--;
servotrim();
mSleep(50);
}
}
}

radbruch
22.01.2008, 21:13
Hallo

Zufällig hängt mein neuer Greifer auch auf den LEDs, deshalb kann ich es einfach testen. Der Fehler war die vertauschte Logik des Steuersignals:


#include "RP6RobotBaseLib.h"
uint16_t servopos = 20;

void servotrim(void)
{
setLEDs(1);
sleep(servopos);
setLEDs(0);
sleep(200-servopos);
}

void servoposi(void)
{
if(servopos==10)
{
while(servopos != 20)
{
servopos++;
servotrim();
mSleep(50);
}
}
else if(servopos==20)
{
while(servopos != 10)
{
servopos--;
servotrim();
mSleep(50);
}
}
}

int main (void)
{
initRobotBase();
while (true)
{
task_RP6System();
servoposi();
}
return 0;
}


Damit macht mein RP6 das:

http://img.youtube.com/vi/44955UWDgyA/1.jpg (http://www.youtube.com/watch?v=44955UWDgyA)
http://www.youtube.com/watch?v=44955UWDgyA

Gruß

mic

Roboman93
23.01.2008, 16:15
an sich funktioniert es ja, ich will nur, dass der servo sich langsamer bewegt, aber ohne zu ruckeln

Roboman93
23.01.2008, 16:18
hab jetzt mSleep vor der inkrementierung eingefügt, funktioniert super!

Christian3
15.07.2009, 09:27
frage habt ihr die servos einfach mit an die led gelötet oder habt ihr die leds abgebaut?
lg

radbruch
15.07.2009, 12:22
Hallo

Viele Anschlüsse am RP6 sind zusätzlich auf freien Lötaugen verfügbar, so sind die LEDs/Bumpers auch mit IO1-4 bzw. BPL/BPR verbunden. Hier sieht man meine Platine mit eingelöteten Stiftleisten:
http://radbruch.roboterbastler.de/rp6/greifer2/servoanschluss4_klein.jpg (http://radbruch.roboterbastler.de/rp6/greifer2/servoanschluss4.jpg)
(Anklicken für größeres Bild. Mehr Pics und Erklärungen:
https://www.roboternetz.de/phpBB2/zeigebeitrag.php?p=356247#356247)

Das funktionierte eigentlich recht gut, allerdings habe ich inzwischen meinen USRBUS mit den LEDs belegt. Das ist langfristig wohl die bessere Lösung:

SL1 1 - 2 GND
SL2 3 - 4 Vcc
SL3 5 - 6 ADC0
SL4 7 - 8 ADC7
SL5 9 - 10 ADC1
SL6 10- 12 Vcc
frei 13- 14 GND(Aus: https://www.roboternetz.de/phpBB2/zeigebeitrag.php?p=439019#439019)

Gruß

mic

Christian3
18.07.2009, 20:21
Hallo,
sry ich wollte nicht extra ein neues forum aufmachen.
mein prob is ich will 2 servos gleihzeitig ansteuern und habs so gemacht:
#include "RP6RobotBaseLib.h"


uint16_t servopos = 20;
uint16_t servopos2 = 20;

void servotrim(void)
{
setLEDs(0b001000);

sleep(servopos);
setLEDs(0);
sleep(200-servopos);
mSleep(50);
}

void servoposi(void)
{
if(servopos==8)
{
while(servopos != 20)
{
servopos++;
servotrim();
mSleep(50);
}
}
else if(servopos==20)
{
while(servopos != 8)
{
servopos--;
servotrim();
mSleep(50);
}
}
}


//***********************SERVO2********************* **********************************+
void servotrim2(void)
{
setLEDs(1);

sleep(servopos2);
setLEDs(0);
sleep(200-servopos2);
mSleep(50);
}

void servoposi2(void)
{
if(servopos==8)
{
while(servopos2 != 20)
{
servopos2++;
servotrim();
mSleep(50);
}
}
else if(servopos2==20)
{
while(servopos2 != 8)
{
servopos2--;
servotrim2();
mSleep(50);
}
}
}

int main (void)
{
initRobotBase();
powerON();

while (true)
{
task_RP6System();
servoposi();
servoposi2();
}
return 0;
}
aber ich kann sie nicht gleichzeitig ansteuern wie kann ich es ansters machen? oder geht das mit disen code nicht?

radbruch
18.07.2009, 22:39
Hallo

Da die Servos blockierend angesteuert werden solltest du nur eine servotrim-Funktion verwenden. Dort erzeugst du dann nacheinander die jeweiligen Impulse und den gemeinsamen 20ms-Zyklus (mehrfach weil die Servos etwas Zeit benötigen um die neue Position anzufahren). Nur die Servoansteuerung getestet:


#include "RP6RobotBaseLib.h"

// #define servopins adc // Ausgabe der Impulse an ADC0/1

uint16_t servopos = 20;
uint16_t servopos2 = 20;

void servotrim(void)
{
uint8_t i;

for(i=0;i<5;i++) // Impuls mehrfach senden -> Servostellzeit
{

#ifdef servopins // ADC0/1-Version

DDRA |= (1<<ADC0) | (1<<ADC1);
PORTA |= 1; // Servo1 an ADC0
sleep(servopos);
PORTA |= 2; // Servo2 an ADC1
sleep(servopos2);
PORTA &= ~3; // Impulse fertig, start der Pause für 20ms-Zyklus
sleep(200-servopos-servopos2);

#else

setLEDs(0b001000); // Servo1 an LED4
sleep(servopos);
setLEDs(0b010000); // Servo2 an LED5?
sleep(servopos2);
setLEDs(0); // Impulse fertig, start der Pause für 20ms-Zyklus
sleep(200-servopos-servopos2);

#endif

}
//mSleep(50); // hier würde ich nicht noch zusätzlich warten
}
void servoposi(void)
{
if(servopos==8)
{
while(servopos != 20)
{
servopos++;
servotrim();
mSleep(50);
}
}
else if(servopos==20)
{
while(servopos != 8)
{
servopos--;
servotrim();
mSleep(50);
}
}
}


//***********************SERVO2********************* **********************************+
/*
void servotrim2(void)
{
setLEDs(1);

sleep(servopos2);
setLEDs(0);
sleep(200-servopos2);
mSleep(50);
}
*/
void servoposi2(void)
{
if(servopos==8)
{
while(servopos2 != 20)
{
servopos2++;
servotrim();
mSleep(50);
}
}
else if(servopos2==20)
{
while(servopos2 != 8)
{
servopos2--;
servotrim();
mSleep(50);
}
}
}

int main (void)
{
initRobotBase();
powerON();

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

Gruß

mic