Also irgendwie kommt immer nur noch Müll dabei raus. Das was jetzt dabei raus kommt macht irgendwie überhaupt keinen Sinn und ein Muster ist auch nicht zu erkennen:
Code:
#define F_CPU	8000000
#define BAUD_RATE 	9600

#include <avr/delay.h>
#include <avr/interrupt.h>
#include <avr/signal.h>
#include <math.h>
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include <avr/io.h>
#include <avr/sfr_defs.h>


#define stopsign '!'
#define startsign '&'
volatile char inStr[500];
volatile int inCnt = 0;

// -- METHODEN DEKLARATIONEN
void 	keep_moving(void);
void 	move(int servo, int pos);
void 	calc_steps(void);
int 	putChar(char c);
int 	signum(int val);
void 	uart_init(int tx, int rx);
uint8_t uart_readChar(void);
void 	parseInput(void);
void 	input(void);


volatile uint8_t char_flag = 0;

// -- SERVO VARIABLES
volatile uint8_t servo_flag = 0;

volatile float shoulder_pos 	= 127.0;
volatile float elbow_pos 	= 127.0;
volatile float wrist_pos 	= 127.0;
volatile float gripper_pos 	= 127.0;

volatile uint8_t shoulder_dest 	= 255;
volatile uint8_t elbow_dest 	= 1;
volatile uint8_t wrist_dest	= 127;
volatile uint8_t gripper_dest	= 250;

volatile float shoulder_step 	= 0;
volatile float elbow_step 	= 0;
volatile float wrist_step 	= 0;
volatile float gripper_step 	= 0;


int main (void) {
	//TIMER-IINTERRUPT AN
	TCCR0 |= (1<<CS01) | (1<<CS00);
	TIMSK |= (1<<TOIE0);
	//UART-INTERRUPT AN
	UCSRB |= (1<<RXCIE);
	//UART INITIALISIEREN (RX UND TX ANSCHALTEN)
	uart_init(1, 1);
	//GLOBAL INTERRUPT AN
	sei();
	//PRINTF FÜR AUSGABE KONFIGURIEREN
  	fdevopen(putChar,NULL,0);
	printf("\n\n\rSTART !!!\n\r");
	//HAUPTSCHLEIFE
	while(1)
	{
		//NUR AUFRUFEN, WENN EIN TIMER INTERUPT DA WAR
		if(servo_flag == 1) {
			calc_steps();
			keep_moving();
		}
		if(char_flag == 1) {
			cli();
			input();
			sei();
		}
	}
	return 0;
}

void parseInput(void) {
	// ANZAHL DER ZEICHEN: inCnt
	// INDEX DES LETZTEN ZEICHENS inCnt-1
	cli();
	printf("\n\rPARSING %s ...\n\r", inStr);
	int cnt = 0;
	if(inStr[0] == 's') {
		printf("SERVO COMMAND FOUND\n\r");
		int hundreds = (int)inStr[2]-48;
		int tens = (int)inStr[3]-48;
		int ones = (int)inStr[4]-48;
		int number = hundreds*100 + tens*10 + ones;
		printf("NUMBER: %i\n\r", number);
		int servo = (int)inStr[1] - 48;
		switch(servo) {
		case(1):
			shoulder_dest = number;
			printf("\n\rSHOULDER_DEST CHANGED\n\r");
			break;
		case(2):
			elbow_dest = number;
			printf("\n\rELBOW_DEST CHANGED\n\r");
			break;
		case(3):
			wrist_dest = number;
			printf("\n\rWRIST_DEST CHANGED\n\r");
			break;
		case(4):
			gripper_dest =  number;
			printf("\n\rGRIPPTER_DEST CHANGED\n\r");
		}
	}
	sei();
}

void input(void) {
	inStr[inCnt] = uart_readChar();

	switch (inStr[inCnt])
	{
	case (stopsign):
		parseInput();
		inCnt=0;
		break;
	case (startsign):
		inCnt=0;
		break;
	default:
		inCnt++;
		break;
	}

	char_flag = 0;
}


// -- METHODEN ZUM BEWEGEN DER Servos
void keep_moving() {

	//CALCULATE NEW POSITIONS
	shoulder_pos 	= shoulder_pos + shoulder_step;
	elbow_pos 	= elbow_pos + elbow_step;
	wrist_pos	= wrist_pos + wrist_step;
	gripper_pos	= gripper_pos + gripper_step;

	//SET STEP=0 IF DEST. POSITION WAS REACHED
	if( (int)(shoulder_pos) == shoulder_dest){ shoulder_step = 0; }
	if( (int)(elbow_pos) == elbow_dest) { elbow_step = 0; }
	if( (int)(wrist_pos) == wrist_dest) { wrist_step = 0; }
	if( (int)(gripper_pos) == gripper_dest) { gripper_step = 0; }

	//POSITIONEN SCHICKEN
	move(1, (int)shoulder_pos);
	move(2, (int)shoulder_pos);
	move(3, (int)elbow_pos);
	move(4, (int)wrist_pos);
	move(5, (int)gripper_pos);
	printf("%c%c", 15, 17);

	printf("POSITION:\tSHOULDER:%i \tELBOW:%i \tWRIST:%i \t GRIPPER:%i\n\r", (int)shoulder_pos,(int)elbow_pos,(int)wrist_pos,(int)gripper_pos);


	servo_flag = 0;
}
void calc_steps(void) {
	float shoulder_to_go 	= shoulder_dest - shoulder_pos;
	float elbow_to_go 	= elbow_dest - elbow_pos;
	float wrist_to_go 	= wrist_dest - wrist_pos;
	float gripper_to_go	= gripper_dest - gripper_pos;

	float shoulder_absolute = abs(shoulder_to_go);
	float elbow_absolute 	= abs(elbow_to_go);
	float wrist_absolute 	= abs(wrist_to_go);
	float gripper_absolute	= abs(gripper_to_go);

	shoulder_step = 1;
	elbow_step = 1;
	wrist_step = 1;
	gripper_step = 1;


	//GET GREATEST VALUE
	uint8_t largest_way_servo = shoulder_absolute;
	if(elbow_absolute > largest_way_servo) { largest_way_servo = elbow_absolute; }
	if(wrist_absolute > largest_way_servo) { largest_way_servo =  wrist_absolute; }
	if(gripper_absolute > largest_way_servo) { largest_way_servo = gripper_absolute; }

	//SET STEP DEPENDING ON GREATEST VALUE (BIGGEST STEP=1)
	shoulder_step = (shoulder_absolute/largest_way_servo) * signum(shoulder_to_go);
	elbow_step = (elbow_absolute/largest_way_servo) * signum(elbow_to_go);
	wrist_step = (wrist_absolute/largest_way_servo) * signum(wrist_to_go);
	gripper_step = (gripper_absolute/largest_way_servo) * signum(gripper_to_go);

}
void move(int servo, int pos){
      loop_until_bit_is_set(UCSRA, UDRE);
      UDR = '#';
      loop_until_bit_is_set(UCSRA, UDRE);
      UDR = 's';
      loop_until_bit_is_set(UCSRA, UDRE);
      UDR = servo;
      loop_until_bit_is_set(UCSRA, UDRE);
      UDR = pos;
}


//SIGNUM WIRD NUR IN calc_steps BENÖTIGT
int signum(int val) {
	if(val != 0) {
		return val/abs(val);
	} else {
		return 0;
	}
}

//INTERRUPTS
SIGNAL (SIG_OVERFLOW0){
	servo_flag = 1;
}
SIGNAL(SIG_USART_RECV) {
	char_flag = 1;
}

// -- UART METHODEN
void uart_init(int tx, int rx) {
   	UBRRL = (F_CPU/(BAUD_RATE*16l)-1);
	if(tx == 1) {
		UCSRB |= (1<<TXEN);
	}
	if(rx == 1) {
		UCSRB |= (1<<RXEN);
	}
}
int putChar(char c){
   while ( !( UCSRA & (1<<UDRE)) );
   UDR=c;
   return 0;
}
uint8_t uart_readChar(void) {
	return UDR;
}