Hallo

Aha, dann schau mal wie schnell er ist:

Code:
void servo(void)
{
	delay=(x+y+z)/10;
   pos_x=x*7+470;
   pos_y=y*7+480;
   pos_z=z*7+490;
	cli();
	PORTA |= E_INT1;		// E_INT1 (Pin8)
	while (pos_x--) dummy ^= pos_x;
	PORTA &= ~E_INT1;
	PORTC |= 1;				// SCL (Pin10)
	while (pos_y--) dummy ^= pos_y;
	PORTC &= ~1;
	PORTC |= 2;				// SDA (Pin12)
	while (pos_z--) dummy ^= pos_z;
	PORTC &= ~2;
	sei();
	sleep(100-delay);
}
Mit diesem Code steuere ich mit dem RP6 die Servos bei meinem Einbein. Es werden Impulse von 0,5-1,5ms erzeugt, das entspricht -90 bis +90 Grad (die Servos streuen etwas). Dafür verwende ich Zählschleifen bei gesperrten Interrupts. Die jeweiligen Zählerwerte setzen sich aus dem Wert für -90 Grad (bei dieser Verzögerung durch die dummy-Zuweisung ca. 470-490 ~ 0,5ms) und dem Wert für die gewünschte Servostellung zusammen. Der Faktor 7 bewirkt dabei, das bei einem Wertebereich von 0-255 das Servo 180 Grad dreht. Daraus kann man dann ableiten, dass die Schleife für 255*7=1785 Durchgänge ca. 1ms braucht (und für 255*7+480=2265 ca. 1,5ms benötigt).

Gruß

mic