dass habe ich schon probiert, es kommt aber
warning: format '%f' expects type 'double', but argument 3 has type 'float'
Ich bin mir aber sich, dass shoulder_pos float ist. Wenn ich schreibe
Code:
uint8_t shoulder_to_go = (uint8_t)shoulder_pos;
uint8_t elbow_to_go = (uint8_t)elbow_pos;
bleibt shoulder_pos ja float und wird nocht zum uint8_t oder?
hier mal das, was evtl. wichtig ist:
Code:
volatile uint8_t servo_flag = 0;
volatile uint8_t recalc_flag = 1;
volatile float shoulder_pos = 127.0;
volatile uint8_t shoulder_dest = 255;
volatile float shoulder_step = 0;
volatile float elbow_pos = 127.0;
volatile uint8_t elbow_dest = 1;
volatile float elbow_step = 0;
int main (void) {
/* UART AN UND TIMEREINSTELLEN ... */
sei();
while(1)
{
if(recalc_flag == 1) {
calc_steps();
}
if(servo_flag == 1) {
keep_moving();
}
}
return 0;
}
void keep_moving() {
cli();
//NEUE POSITIONEN AUSRECHNE
shoulder_pos = shoulder_pos + shoulder_step;
elbow_pos = elbow_pos + elbow_step;
uint8_t shoulder_to_go = (uint8_t)shoulder_pos;
uint8_t elbow_to_go = (uint8_t)elbow_pos;
//AUSGABE
char s_pre[] = "Shoulder: ";
char str[10];
sprintf (str, "%f", shoulder_pos);
uart_puts(s_pre);
uart_puts(str);
uart_puts("\n\r");
//WENN DIE POSITIONEN GERUNDET ÜBEREINSTIMMEN
//NEUBERECHNUNG DER STEPS ERLAUBEN UND NEUES ZIEL FÜR ELBOW SETZEN
if(shoulder_pos == shoulder_dest && elbow_pos == elbow_dest) {
recalc_flag = 1;
uart_puts("ERREICHT!!!!!!!!!!!");
} else {
recalc_flag = 0;
}
servo_flag = 0;
sei();
}
void calc_steps(void) {
//BERECHNEN WIE VIEL SICH DIE Servos BEWEGEN MÜSSEN*
uint16_t shoulder_to_go = shoulder_dest - shoulder_pos;
uint16_t elbow_to_go = elbow_dest - elbow_pos;
//HIER ALS ABSOLUTE WERTE
int16_t shoulder_abs = abs(shoulder_to_go);
int16_t elbow_abs = abs(elbow_to_go);
//STEP ERSTMAL AUF +/- 1 SETZEN, JE NACH RICHTUNG
elbow_step = signum(elbow_to_go);
shoulder_step = signum(shoulder_to_go);
if(elbow_abs < shoulder_abs) {
elbow_step = 1 * signum(elbow_to_go);
shoulder_step = (shoulder_abs / elbow_abs) * signum(shoulder_to_go);
}
if(elbow_abs > shoulder_abs) {
shoulder_step = 1 * signum(shoulder_to_go);
elbow_step = elbow_abs / shoulder_abs * signum(shoulder_to_go);
}
}
SIGNAL (SIG_OVERFLOW0){
servo_flag = 1;
}
mfg
jagdfalke
Lesezeichen