Hallo

Ich bin mir nicht sicher ob das wirklich "besser" ist:

Code:
#include "RP6RobotBaseLib.h"							//bindet die RP6RobotBaseLib.h ein

int main (void)
{
	uint8_t schritt=0; // Ausweichen in drei Schritten
	uint16_t pause=0;  // Pausezeit in ms

	initRobotBase();										//initialsiert den Robby
	powerON();												//aktiviert die Encoder usw.

	while(1)
	{
		task_RP6System();
		if(isMovementComplete())
		{
		   if(pause)
			{
			   mSleep(pause);
			   pause=0;
			}
			switch(schritt)
			{
			   case 3:	setLEDs(0b111111);
							mleft_power = 0; 								// Stop
							mright_power = 0;
							OCR1AL = 0;
							OCR1BL = 0;
							pause=1500;										//1,5 Sekunden warten
							schritt--;
							break;

				case 2:	setLEDs(0b011011);
							move(60,BWD,DIST_MM(300),NON_BLOCKING);// Zurück
							pause=800;										// 0,8 Sekunden warten
							schritt--;
							break;

				case 1:  setLEDs(0b001001);
							rotate(60,RIGHT,180,NON_BLOCKING);//um 180° nach Rechts drehen
							schritt--;
							break;

				default:	setLEDs(0b000000);
							changeDirection(FWD);//Motor Drehrichtung auf Vorwärts setzen
							moveAtSpeed(80,80);	//Fahre Vorwärts bis Bumper gedrückt wird
							if(bumper_left)		//wenn linker bumper betätigt...
							{
		   					schritt=3;        // ... ausweichen
							}
							break;
			} // switch
		} // if
	} // while
	return 0; // wird nie ausgeführt
}
Ist ja spannend. Eigentlich dürfte das gar nicht funktionieren. Bei Case default wird der Bumper ausgewertet. Das geschieht aber nur, wenn isMovementComplete() true ist. Offensichtlich wird isMovementComplete() von moveAtSpeed() nicht beeinflußt, deshalb funktioniert auch dies nicht:

Code:
          setLEDs(0b111111);                     //schalte SL4, SL5 und SL6 ein
         //moveAtSpeed(0,0);                        //Stop
         stop();
         while(!isMovementComplete())           // Weiterfahren bis Antriebe auf null
            task_RP6System();
         mSleep(1500);                           //1,5 Sekunden warten
isMovementComplete() ist immer true, die while-Schleife mit dem Taskaufruf wird nie ausgeführt! Deshalb hält der RP6 nicht an.

Die Lösung: Man überprüft selbst die PWM-Werte der Antriebe. Diese stehen in mleft_power und mright_power:
Code:
 #include "RP6RobotBaseLib.h"                            //bindet die RP6RobotBaseLib.h ein

int main (void){
    initRobotBase();                                        //initialsiert den Robby
    powerON();                                             //aktiviert die Encoder usw.
    while(1){
        task_Bumpers();                                    //fragt alle 50ms die Bumper ab und speichert den Wert in "bumper_left" und "bumper_right"
        if(bumper_left != false){                           //wenn linker bumper betätigt...
            setLEDs(0b111000);                           //schalte SL4, SL5 und SL6 ein
            moveAtSpeed(0,0);                            //Stop

            while(mleft_power || mright_power) task_RP6System();

            mSleep(1500);                                 //1,5 Sekunden warten
            move(60,BWD,DIST_MM(300),BLOCKING);  //fahre 30cm Rückwärts
            rotate(60,RIGHT,180,BLOCKING);           //um 180° nach Rechts drehen
        }
        else{
           setLEDs(0b000000);                           //schalte alle LEDs aus
            changeDirection(FWD);                       //Motor Drehrichtung auf Vorwärts setzen
            moveAtSpeed(80,80);                        //Fahre Vorwärts bis Bumper gedrückt wird
        }
        task_RP6System();                               //fragt immer wieder die Encoder usw. ab
    }
    return 0;
}
(getestet:)

Gruß

mic

[Edit]
Noch einfacher ist es wohl so:

Code:
 #include "RP6RobotBaseLib.h"                            //bindet die RP6RobotBaseLib.h ein

int main (void){
    initRobotBase();                                        //initialsiert den Robby
    powerON();                                             //aktiviert die Encoder usw.
    while(1){
        task_Bumpers();                                    //fragt alle 50ms die Bumper ab und speichert den Wert in "bumper_left" und "bumper_right"
        if(bumper_left != false){                           //wenn linker bumper betätigt...
            setLEDs(0b111000);                           //schalte SL4, SL5 und SL6 ein
            move(0,FWD,0,BLOCKING);                       //Stop
            mSleep(1500);                                 //1,5 Sekunden warten
            move(60,BWD,DIST_MM(300),BLOCKING);  //fahre 30cm Rückwärts
            rotate(60,RIGHT,180,BLOCKING);           //um 180° nach Rechts drehen
        }
        else{
           setLEDs(0b000000);                           //schalte alle LEDs aus
            changeDirection(FWD);                       //Motor Drehrichtung auf Vorwärts setzen
            moveAtSpeed(80,80);                        //Fahre Vorwärts bis Bumper gedrückt wird
        }
        task_RP6System();                               //fragt immer wieder die Encoder usw. ab
    }
    return 0;
}