WTF.... Du hast Recht.
Er tut jetzt so wie es sein soll. 
Ich verstehe es trotzdem nicht, warum die Variable diff, ohne cast, richtig ausgegeben wird.
Hier der vollständige code:
	Code:
	int16_t calculate_pump_current (uint16_t Ua, uint16_t Ua_cal)
{
    float diff;
    diff = (int16_t)Ua - (int16_t)Ua_cal;
    
    liveData[26] = low(diff);
    liveData[27] = high(diff);
    
    return ((diff) / (SENSOR_SHUNT * 8.0) * 1000);
}
 Die Variable liveData[...] ist als uint8_t liveData[30] definiert, die dann per usart rausgeschoben wird. Der Empfänger sieht den diff-Wert aber korrekt...
Hab jetzt den ganzen Mist rausgeworfen und nun sieht es so aus:
	Code:
	int16_t calculate_pump_current (uint16_t Ua, uint16_t Ua_cal)
{    
    return (((int16_t)Ua - (int16_t)Ua_cal) / (SENSOR_SHUNT * 8.0) * 1000);
}
 und rechnet auch richtig.
Danke schön!
						
					
Lesezeichen