Ich denke mal dein Hauptproblem besteht darin, dass du von falschen
Vorstellungen ausgehst, wie in C Datentypen für eine Berechnung
ausgewählt werden. Die Aussage ...
> Da double und float von vornherein alle Nachkommastellen
> abgeschnitten haben (Wieso denn?),
... geht für mich ebenfalls in diese Richtung.
Dein Problem ist, dass du falsche Vorstellungen davon hast, wie der
Compiler eine Operation auswählt. In
double m = 7 / 5;
erhält m den Wert 1, obwohl es als double definiert ist! Warum ist das
so? Weil der Compiler bei der Auswahl der Operation sich ausschliesslich
an den beteiligten Operanden orientiert! 7 ist ein Integer, 5 ist ein
Integer. Folgerichtig wird die Division als Ganzzahldivision ausgeführt.
Und 7 durch 5 als Ganzzahldivision ergibt nun mal 1. Erst danach, wenn
das Ergebnis feststeht, kommt der Zieldatentyp von m ins Spiel. Das
Ergebnis ist ein Integer, das Ziel ist ein double. Also wird die Integer
1 auf eine double 1 umgewandelt und zugewiesen.
Auch in deinem Code sind solche Misverständnisse zu sehen.
zb
d_in_mm = (LB_d5*10000)+(LB_d4*1000)+(LB_d3*100)+(LB_d2*10)+LB_d1;
LB_d5 ist ein uint8_t, 10000 ist ein int. Der größte gemeinsame Nenner
zwischen den beiden Datentypen ist ein uint16_t. Und genau diese
Operation nimmt der Compiler dann auch her. LB_d5 wird mit 10000 per
16-Bit-unsigned Multiplikation verknüpft. (Zur Erinnerung: ein uint16_t
kann nicht größer als 65535 werden). Wenn LB_d5 also den Wert 7 erreicht
hat, dann geht diese Operation schon mal schief. Um das zu vermeiden,
musst du den Compiler zwingen, die Operation als 32-Bit Operation
durchzuführen. Es reicht, wenn einer der beteiligten Operanden ein
uint32_t ist. Also entweder du castest den LB_d5 auf einen 32 Bit
Datentyp hoch, oder du machst aus den 10000 eine long Zahl: 10000L oder
besser gleich eine 32 Bit unsigned long Zahl 10000UL
Druchforste mal deinen Code auf derartige Misverständnisse und du wirst
sehen, dass deine Ergebnisse besser werden.