@Slyd: wenn ich deinen post richtig verstanden habe, war mein ursprüngliches problem, dass in meinem programm move_state immer = 0 war und dadurch case 1 erst gar nicht ausgeführt wird.

Aus diesem grund habe ich jetzt noch einmal alles abgeändert und auch ein paar kommentare hinzugefügt.

zum besseren verständnis hier noch meine dazugehörige liberweiterung:
Code:
void infrarotkollission(void)
{DDRC &=~ (1<<PC3);    //PC3 als Eingang infrarotempfänger

if(ir_erweiterung ==0)
{
if (!(PINC & (1<<PC3)))
 {writeString_P("Infrarotempfang ein\n");
 writeStringLCD("ir_counter=:");
 writeString("ir_counter=:");
writeInteger(ir_counter,DEC);

 writeIntegerLCD(ir_counter, DEC);
 writeChar('\n');
 
ir_ende = false;
 ir_counter++;  //infrarot empfangen
 }
}

if (ir_counter ==50)
	{ir_hindernis = true;
	ir_erweiterung = 1;
	}

if (ir_ende)
{ir_counter =0;
ir_erweiterung =0;
ir_hindernis = false;
}

}
und hier jetzt mein komplettes abgeändertes demoprogramm:
Code:
 // Uncommented Version of RP6ControlServo.c

// ------------------------------------------------------------------------------------------

#include "RP6ControlLib.h"
#include "RP6ControlServoLib.h"
#include "RP6I2CmasterTWI.h"
#include "RP6Control_I2CMasterLib.h"

//Servo 1 => PC2
//Servo 2 => PC3
//Servo 3=> PC4 
//Servo 4=> PC5 
//Servo 5=> PC6

uint8_t move_state = 0; // Wenn nichts anderes zugewiesen ist, ist move_state =0



void RP6_Bewegung(void)
{if (ir_hindernis)
	{
if (!(ir_ende))
	{stopStopwatch3();		//stopwatch3 anhalten wenn ir erkannt wird und damit servobewegung anhalten
	writeString_P("ir ende gleich false\n");}	


	
	

	{switch(move_state)
	
{case 0:
	if (getStopwatch3() <1000 || getStopwatch3() >6000)
	{rotate(50,RIGHT,90,NON_BLOCKING);      //um 90 grad rotieren    
	move_state= 1;}	// move_state den wert 1 zuweisen
	
	break;
	
	
case 1:
	if(isMovementComplete())
	{ir_ende= true; 		//ir_ende=true, wenn bewegung abgeschlossen
	startStopwatch3();		//stopwatch3 wieder starten und servo wieder starten
	writeString_P("ir ende gleich true\n");
	}
	break;
}
	

}}

}
	
	
	
	





void servoansteuerung(void)
{if (getStopwatch3() <1000)
	{servo3_position = 0;
	writeString_P("LEFT Touch\n");}


if (getStopwatch3() >1000 && getStopwatch3() <2000)
	{servo3_position = 20;
	writeString_P("servo position 40\n");}
	
if (getStopwatch3() >2000 && getStopwatch3() <3000)
	{servo3_position = 90;}

if (getStopwatch3() >3000 && getStopwatch3() <4000)
		{servo3_position = RIGHT_TOUCH;
		writeString_P("Servo Right touch\n");}
		
if (getStopwatch3() >4000 && getStopwatch3() <5000)
	{servo3_position = 90;}
	
if (getStopwatch3() >5000 && getStopwatch3() <6000)
	{servo3_position = 20;}
		
if (getStopwatch3() >6000 && getStopwatch3() <7000)
	{servo3_position = 0;
	writeString_P("LEFT Touch\n");}
	
if (getStopwatch3() >7000)
	{
	setStopwatch3(0);
	writeString_P("stopwatch3 auf 0 zurück\n");}
	
	}






	

	
int main(void)
{ 
   initRP6Control();
   
   I2CTWI_initMaster(100);  
	
	
 

 initSERVO(SERVO3); 
startStopwatch3(); 
   
   while(true) 
   {
servoansteuerung();
    task_SERVO();
 
	  infrarotkollission();
	  RP6_Bewegung();

   }
   return 0;
}
das alte problem, dass das programm in der case 0 ständig "hängen" bleibt müsste ich jetzt eigentlich behoben habe. der RP6 dreht sich jetzt auf jeden fall schon mal 90 grad und bleibt dann stehen.

was allerdings immer noch nicht geht, ist dass das programm nach der rotationsbewegung in die case 1 geht und dann mit startStopwatch3() die servobewegung wieder startet.

hat jemand vielleicht auf dieses phänomen eine erklärung?

Zitat Zitat von SlyD
Formatier den Code in Zukunft mal übersichtlicher dann sieht man sowas auch leichter

MfG,
SlyD
ich gelobe in zukunkt besserung