Ich habe nun herausgefunden, woran es liegt: Nach jeder Greiferbewegung braucht der ASURO eine kurze Pause, keine Ahnung warum. Das Programm sieht nun so aus:
Code:
#include "asuro.h" 

unsigned char i, servo_stellzeit; 

void servo(unsigned char winkel) 
{ 
   unsigned int count=0; 
   do
   { 
      count++; 

      if(winkel)
	  { 
      PORTB |= (1 << PB0); 
      Sleep(winkel); 
      }
	  PORTB &= ~(1 << PB0); 

      Sleep(255-winkel); 
   }
   while (count<servo_stellzeit); 
} 

int main(void) 
{ 

   Init(); 
   DDRB |= (1 << PB0); 

   { 
	  servo_stellzeit=12;				//Servozeit einstellen
	  MotorSpeed(10,10);				//kurze Pause
	  Msleep(1);  
      MotorDir(FWD,FWD);				//Kleines Stück vor
	  MotorSpeed(120,120);
	  Msleep(500);
	  MotorSpeed(BREAK,BREAK);
      for (i=15; i<85; i+=2) servo(i);	//Greifer zumachen
	  MotorSpeed(10,10);				//Kurze Pause
	  Msleep(1); 
	  MotorDir(RWD,RWD);				//Kleines Stück zurück
	  MotorSpeed(120,120);
	  Msleep(500); 
	  MotorSpeed(BREAK,BREAK);
	  MotorSpeed(135,0);				//Vierteldrehung nach links
	  Msleep(1000);
	  MotorSpeed(BREAK,BREAK);
      for (i=75; i>17; i-=2) servo(i);	//Greifer aufmachen
	  MotorSpeed(10,10);				//Kurze Pause
	  Msleep(1);
	  MotorDir(RWD,RWD);				//Kleines Stück zurück
	  MotorSpeed(120,120);
	  Msleep(500); 
	  MotorSpeed(BREAK,BREAK);
	  MotorSpeed(0,135);				//Vierteldrehung nach rechts
	  Msleep(1000);
	  MotorSpeed(BREAK,BREAK);
	  MotorSpeed(10,10);				//Kurze Pause
	  Msleep(1);
	  MotorDir(FWD,FWD);				//2s Weiterfahren
	  MotorSpeed(120,120);
	  Msleep(2000);
	  MotorSpeed(BREAK,BREAK);
   }
}
Den Ablauf habe ich hier dokumentiert:
http://www.youtube.com/watch?v=wQY2dqMZH3Y
Noch 2 Fotos: