Hallo,
ich möchte die Auflösung des ds18s20 auf 0.5° steigern, noch feiner
aufgelöst wäre schön muss aber nicht sein.
Bisher gebe ich die Temperatur nur ganzzahlig aus, indem ich folgenden
Code verwende
1
inttemperatur=data[0]/2;
2
uart_puts(itoa(temperatur,buffer,10));
alle meine bisherigen Ansätze führten dazu, dass der Speicherverbrauch
von ca.20% auf 105% stieg, so bspw.
1
doublet=data[0];
2
doubletemperatur=t/2;
3
uart_puts(dtostrf(temperatur,2,1,buffer));
Hat jemand eine Idee wie ich es schaffen könnte?
gruss steffen
Steffen K. schrieb:
> Hat jemand eine Idee wie ich es schaffen könnte?
Warum so kompliziert über floating point?
Du kannst nur 2 mögliche Nachkommastellen haben: entweder .0 oder .5
1
inttemperatur=data[0]/2;
2
uart_puts(itoa(temperatur,buffer,10));
3
4
if(data[0]%2==0)
5
uart_puts(".0");
6
else
7
uart_puts(".5");
manchmal ist es besser, vorhandenes Wissen auszunutzen, anstatt lange
rumzurechnen :-)
Lothar Miller schrieb:
> Liest sich irgendwie kopiergeschützt ;-)
:-)
> Macht der Compiler aus %2 ein &1?
Wenn er das nicht hinkriegt, sollte sich der Compilerbauer lieber ein
anderes Hobby suchen. zb. Holzschnitzen :-)
So simpel ist das wahrlich nicht. In diesem Fall lässt sich das nur
deshalb direkt mit &1 abwickeln, weil die Daten wahrscheinlich aus einem
uchar stammen und zumindest GCC deshalb spitz kriegt, dass er negative
Werte nicht berücksichtigen muss.
Denn formell ist das trotzdem eine Division mit Vorzeichen und nicht
jeder Compiler kriegt das spitz. Andere optimieren zwar die Division
raus, aber die Ersatzsequenz ist deutlich komplexer als AND.
Denn -3 % 2 = -1, aber -3 & 1 = 1.
A. K. schrieb:
> So simpel ist das wahrlich nicht. In diesem Fall lässt sich das nur> deshalb direkt mit &1 abwickeln, weil die Daten wahrscheinlich aus einem> uchar stammen und zumindest GCC deshalb spitz kriegt, dass er negative> Werte nicht berücksichtigen muss.>> Denn formell ist das trotzdem eine Division mit Vorzeichen und nicht> jeder Compiler kriegt das spitz. Andere optimieren zwar die Division> raus, aber die Ersatzsequenz ist deutlich komplexer als AND.>> Denn -3 % 2 = -1, aber -3 & 1 = 1.
Und beides ist nicht gleich 0
Und nur darum geht es letztendlich in dieser Abfrage. Und das kriegen
auch die Optimizer raus.
Interessant wird die Berechnung zudem bei negativen Temperaturen (aber
da is ja noch ein halbes Jahr hin ;-)
0,5°C = 0x0001
0°C = 0x0000
-0,5°C = 0xffff
Und das heißt: bei -0,5°C wird erst mal -1 ausgegeben (sofern die
Übertragung aus data[0] nach temperatur erst mal vorzeichenrichtig
korrigiert ist), danach wird (weil das LSB gesetzt ist) noch .5
angehängt...
Daher wird eher die gefühlte als die gemessene Temperatur ausgegeben.
Lothar Miller schrieb:
> Daher wird eher die gefühlte als die gemessene Temperatur ausgegeben.
Lustig kann es allerdings werden, wenn man höher als 0.5° auflösen will,
das geradeaus mit / und % bastelt und nicht an solche Effekte denkt.
Also /10 vor und %10 nach dem Komma. Gibt dann so illustre Temperaturen
wie "0.-3°C".
A. K. schrieb:
> Lothar Miller schrieb:>>> Daher wird eher die gefühlte als die gemessene Temperatur ausgegeben.>> Lustig kann es allerdings werden, wenn man höher als 0.5° auflösen will,> das geradeaus mit / und % bastelt und nicht an solche Effekte denkt.> Also /10 vor und %10 nach dem Komma. Gibt dann so illustre Temperaturen> wie "0.-3°C".
LOL. Ja da ist was drann :-)
Wenns allerdings bei mir in der Wohnung 0.-3 Grad hat, dann ist die
Anzeige mein geringstes Problem :-)
Hallo,
danke für die guten Vorschläge. Ich gebe die Temperatur jetzt mit einer
Auflösung von 0.5° aus, indem ich überprüfe ob das LSB "1" oder "0" ist,
das reicht mir doch aus für die Anwendung als normales Raumthermometer.