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
Lesezeichen