hi allerseits,
ich habe mit folgendem programm (stammt glaube ich sogar aus diesem thread)
Code:
// Servoansteuerung2: Wir erzeugen zwei Impulse im Wechsel 10.1.2010 mic
// sleep(1) verzögert ca. 0,1ms, 50 Impulse dauern ca. 1 Sekunde
// Servo an SDA (PC1) (XBUS Pin 12)
#include "RP6RobotBaseLib.h"
uint8_t c; // allgemeine 8-Bit-Variable (ein Char)
int main(void)
{
initRobotBase();
DDRC |= SDA;
PORTC &= ~SDA;
while(1)
{
for(c=0; c<50; c++) //50 = 50 Impulse senden, das dauert ca. 1 Sekunde
{
PORTC |= SDA; // Impulsstart servo I
sleep(25); // 1 = 0.1ms warten = Servoposition 1
PORTC &= ~SDA; // Impulsende
sleep(150); //50ms warten
PORTC |= SL1; // Impulsstart servo II
sleep(10); // 1 = 0.1ms warten = Servoposition 1
PORTC &= ~SL1; // Impulsende
sleep(150); //50ms warten
}
for(c=0; c<50; c++)
{
PORTC |= SDA; // Impulsstart servo I
sleep(5); //30 = 3ms warten = Servoposition 2
PORTC &= ~SDA;
sleep(150);
PORTC |= SL1; // Impulsstart servo II
sleep(25); // 1 = 0.1ms warten = Servoposition 2
PORTC &= ~SL1; // Impulsende
sleep(150); //50ms warten
}
for(c=0; c<50; c++)
{
PORTC |= SDA; // Impulsstart servo I
sleep(20); //10 = 1ms warten = Servoposition 3
PORTC &= ~SDA;
sleep(150);
PORTC |= SL1; // Impulsstart servo II
sleep(15); // 1 = 0.1ms warten = Servoposition 3
PORTC &= ~SL1; // Impulsende
sleep(100); //50ms warten
}
for(c=0; c<50; c++)
{
PORTC |= SDA; // Impulsstart servo I
sleep(10); //20 = 2ms warten = Servoposition 4
PORTC &= ~SDA;
sleep(150);
/* PORTC |= SL1; // Impulsstart servo II
sleep(30); // 1 = 0.1ms warten = Servoposition 4
PORTC &= ~SL1; // Impulsende
sleep(100); //50ms warten */
}
for(c=0; c<50; c++)
{
PORTC |= SDA; // Impulsstart servo I
sleep(20); //5 = 0.5ms warten = Servoposition 5
PORTC &= ~SDA;
sleep(150);
/* PORTC |= SL1; // Impulsstart servo II
sleep(10); // 1 = 0.1ms warten = Servoposition 5
PORTC &= ~SL1; // Impulsende
sleep(100); //50ms warten */
}
}
return(0); // wird nie erreicht
}
/*
zweites servo an sl1
PORTC |= SL1)
PORTC &= ~SL1
*/
beide Servos am rp6 zum laufen bekommen....
jetzt habe ich einen greifarm für den asuro gebaut, der auf der kleinen platine befestigt ist und die drei Servos über die pins INT0, PD3 und PD6 gesteuert werden sollen. Wenn ich das programm auf den asuro umstricke, sieht es im ersten ansatz so aus (viel ist noch auskomentiert)
Code:
#include "asuro.h"
uint8_t c; // allgemeine 8-Bit-Variable (ein Char)
int main(void)
{
DDRC |= (1<<PD3);
PORTC &= ~(1<<PD3);
while(1)
{
for(c=0; c<50; c++) //50 = 50 Impulse senden, das dauert ca. 1 Sekunde
{
PORTC |= (1<<PD3); // Impulsstart servo I
Msleep (25); // 1 = 0.1ms warten = Servoposition 1
PORTC &= ~(1<<PD3); // Impulsende
Msleep (150); //50ms warten
}
/* for(c=0; c<50; c++) //50 = 50 Impulse senden, das dauert ca. 1 Sekunde
{
PORTC |= (1<<PD3); // Impulsstart servo I
Msleep (20); // 1 = 0.1ms warten = Servoposition 1
PORTC &= ~(1<<PD3); // Impulsende
Msleep (150); //50ms warten
}*/
/* for(c=0; c<50; c++) //50 = 50 Impulse senden, das dauert ca. 1 Sekunde
{
PORTC |= (1<<PD6); // Impulsstart servo II
Msleep(10); // 1 = 0.1ms warten = Servoposition 1
PORTC &= ~(1<<PD6); // Impulsende
Msleep(150); //50ms warten*/
/* PORTC |= (1<<INT0); // Impulsstart servo III
Msleep(17); // 1 = 0.1ms warten = Servoposition 1
PORTC &= ~(1<<INT0); // Impulsende
Msleep(150); //50ms warten */
/* PORTC |= (1<<PD3); // Impulsstart servo I
Msleep (5); // 1 = 0.1ms warten = Servoposition 2
PORTC &= ~(1<<PD3); // Impulsende
Msleep (170); //50ms warten
}*/
}
return(0); // wird nie erreicht
}
zuckt der erste servo (hängt am PD3) nur unkontrolliert in der gegend herum und auch der dritte macht so komische zuckungen, auch wenn er an keinem signal hängt, bzw. die software noch gar nicht in funktion ist.
habe ich was falsch gemacht, oder bestimmte asuro-eigenheiten vergessen zu berücksichtigen?
die Servos liefen bereits einzeln (über kabel mit dem rp6 verbunden) und mit der rp6 software...die hardware scheint also ok zu sein ( die platine mit den servos)...
danke für euere hinfe
Lesezeichen