Hallo Leute! Ich verwenden, um die Temperatur zu messen mehrere DS18S20. Deshalb habe ich mir eine Funktion geschrieben die aus dem 2-Byte Wert, den der Sensor liefert einen double-wert mit der Temperatur macht. double temp_inttotemp(unsigned int val) { double retval=0; char tmp; // Ist das 0,5-Flag gesetzt? if ((val & 0x0001) != 0) retval = 0.5; tmp = val & 0x00FE; tmp = tmp >> 1; // Wenn Negativ, dann Invertieren und 1 dazu if ((val & 0x8000) != 0) tmp = (tmp^0x7F) + 1; retval += tmp; // Wenn Negativ.... if ((val & 0x8000) != 0) retval = retval * -1; return retval; } Nun hatten wir das erste mal seit Inbetriebnahme wieder Minusgarde. Komischerweise zeigt er mir jetzt auf dem Display 127.0°C an. Das ist eigentlich der Effekt, wenn ich eine Signed-Variable als unsigned ausgebe. Zur Ausgabe verwende ich die sprintf-Funktion: sprintf(str,"%02.1f°C", temp(OUTDOOR)); (das temp-Makro gibt einen double-wert zurück) Ich bin für jede Hilfe Dankbar! MfG Sascha
Das Thermometer liefert Dir doch schon signed-int ??? Du musst doch nur noch den Faktor 0,5 mit reinrechnen. Beachte, dass das unsigned im Header fehlt: double temp_inttotemp(int val) { return (val * 0.5); } Was ich allerdings bevorzuge, ist ganz auch die float zu verzichten. Z.B. indem ich den Wert auf 0,1 Grad normiere und dann vor die letzte Stelle ein Komma in die Ausgabe einfüge: temp_zehntel_grad = val * 5; Spart Dir die riesigen float-libs, falls Du float nicht noch für andere Sachen brauchst, und ist viel fixer. Stefan
Hallo Stefan! Nun das ist nicht direkt ein signed int, wie man auch aus meinem Code entnehmen kann. Denn er verwendet nicht nur das MSB als sign-Flag. Sonder noch ein paar mehr, die ich dann mit den logik-operationen abfrage. Mein Problem ist nur, dass sprintf keine negative Zahl ausgibt. ...und float-Zahlen brauche ich noch an vielen anderen Stellen. MfG Sascha
Glaub mir, das Ergebnis des DS18S20 ist ein signed-int. Wert Hex-Darstellung signed int Temperatur ---------------------------------------------------------- Maximalwert = 00AAh = 170 = 85 Grad Nullpunkt = 0000h = 0 = 0 Grad Minimalwert = FF92h = -110 = -55 Grad Dass im Datenblatt 8 mal S im MSB-Byte steht, sollte Dich nicht verwirren. sprintf keine negativen Zahlen? Wäre mir neu, welchen Compiler benutzt Du denn? Stefan
Hi brauchst du float Zahlen wirklich oder weißt du nur nicht das man das meiste auch mit geschickter Anwendung von Ganzzahl-Arithmetik lösen kann? Der DS18S20 wirft ein signed int aus. Das MSB stellt dabei das Vorzeichen dar. Das was du als "ein paar mehr" bezeichnest kommt durch die Darstellung von negativen Zahlen in Binärdarstellung. Stichwort Zweierkomplement oder two's complement. Siehe http://www.net-lexikon.de/Zweierkomplement.html Matthias
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.