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!