Und als weitere Warnung:
Der Sensor DS18B20 liefert 2 Bytes, welche als 16 Bit Integer den
Temperaturwert als vorzeichenbehafteten 12 Bit Wert in Sechzehntel Grad
Celsius enthalten. Enthalten ist in dem 16 Bit Integer also eine
vorzeichenbehaftete Festkommazahl im Zweierkomplement, deren
Nachkommateil in den unteren 4 Bits enthalten ist.
Lösungen wie
sprintf(temp_po_str,"%d.%dC",temperature/10, abs(temperature%10));
liefern deshalb auch keine sauber gerundeten Werte, wobei hier der
Teiler 10 auch noch zusätzlich falsch ist.
Will man die Temperatur hingegen nur in ganzen Grad darstellen, liefert
/16 zwar den ganzzahligen Teil, aber eben auch nur abgetrennt und nicht
für alle Fälle richtig gerundet.
Und Modula 10 oder gar 16 führt in diesem Fall allein auch nie zu einer
korrekten Lösung des Nachkommateils, weder auf eine Stelle nach dem
Komma noch auf eine Lösung mit vollständiger Auflösung und schon gar
nicht auch noch richtig gerundet.
Natürlich kann man die gelieferten Temperaturwerte auch nur allein mit
Hilfe der Festwertarithmetik sauber umwandeln und darstellen, nur ganz
so einfach ist es dann doch nicht, und die vielen Ein- oder Zweizeiler,
die ich bisher so gesehen habe, waren alle schlicht falsch. Und wenn man
schon einen (größeren) Aufwand betreiben muss, dann kann man auch gleich
den einfacheren Weg über float und (s)printf gehen und bei den
heutzutage gängigen Controllern mit 32K oder mehr für 2 EUR tut der
dadurch etwas vergrößerte Code auch nicht mehr mehr wirklich weh,
zumindest nicht im Hobbybereich. Will man es hingegen wirklich wissen,
dann ist Assembler für die vorliegende Aufgabe möglicherweise sogar eher
zielführender als die zusätzliche Abstraktion der Hochsprache.
Und ich behaupte jetzt mal, manche der (billigen) kommerziell
angebotenen Digitalthermometer zeigen oft auch deshalb Abweichungen an,
weil die Entwickler da auch ein bisschen geschlampt haben.
Egal und allen (dogmatischen) Behauptungen, wie man das doch angeblich
'richtig' macht, zum Trotz, eine saubere und dazu auch noch halbwegs
elegante Lösung nur mit Festwertarithmetik und Schiebung habe ich für
das obige Problem noch nicht gesehen.
Mit besten Grüßen
Murmelchen