Hallo, ich weiß ich habe damals schon einmal wegen den blockierenden funktionen eine frage gestellt.

aber jetzt 2 monate später stehe ich wieder vor einem ähnlichen problem.
mittlerweile habe ich an meinen rp6 einen roboarm mit greifer gebaut.

vorn am greifer habe ich einen reflexkoppler gebaut, mit welchem der greifer gesteuert wird.

es funktioniert eigentlich fast alles.

nur ist es so, dass der rp6 nicht anhält, wenn der reflexkoppler ein teil erkennt.

ich bin mit ziemlich sicher, dass es an meiner move_At_Speed() funktion liegt.
nur habe ich keine idee, wie ich dieses problem umgehen kann.

das fast fertige programm:


Code:
#include "RP6RobotBaseLib.h"

uint8_t i;
uint8_t a;
uint8_t n;
uint8_t p;
uint8_t z;


void task_TeilErkannt(void)
{
if(PINA & (1<<4))
	{z=1;
writeString_P("Teil erkannt\n");}
else {z=0;
writeString_P("Kein Teil erkannt\n");}

}



void task_servo(void)
{

if(PINA & (1<<4)) // Greifer schließen 
{
while(i<52)
{
writeString_P("Greifer schließen\n");
PORTC |=(1<<0);
mSleep(1);
PORTC &=~ (1<<0);
mSleep(19);
p=0;
i++;}
}


if(i>50)	// Schwenkarm nach oben
{
while(a<52)
{
writeString_P("Schwenkarm nach oben\n");
PORTC |=(1<<1); 
mSleep(2);
PORTC &=~ (1<<1);
mSleep(18);
i=0;
a++;}
}


if(a>50) // Greifer öffnen                                      
{
while(n<40)
{
writeString_P("Greifer öffnen\n");
PORTC |=(1<<0);
mSleep(2);
PORTC &=~ (1<<0);
mSleep(18);
setStopwatch1(0);
a=0;
n++;}

}

if(n>38) //Schwenkarm wieder nach unten
{
while(p<20)
{
writeString_P("Schwenkarm wieder nach unten\n");
PORTC |=(1<<1);
mSleep(1);
PORTC &=~ (1<<1);
mSleep(19);
n=0;
p++;}
}

}

void task_fahren(void)
{if(z==0)
	{
	moveAtSpeed(50,50);}
	
	
else if(z==1)
	{moveAtSpeed(0,0);}

}


int main(void)
{
initRobotBase();

DDRC |=(1<<1);		//PORT 1 von Register C als Ausgang für Servo
DDRC |= (1<<0);	//PORT 0 von Register C als Ausgang für Servo
DDRA &=~ (1<<4);	//PORT 4 von Register A als Eingang für Reflexkoppler

powerON(); 
changeDirection(BWD);





while(true)
{task_servo();
task_TeilErkannt();
task_fahren();
task_RP6System();
}
return 0;
}
hat jemand von euch eine idee?

danke schon mal im voraus