Forum: Compiler & IDEs double


von Sascha Biedermann (Gast)


Lesenswert?

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

von Stefan Kleinwort (Gast)


Lesenswert?

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

von Sascha Biedermann (Gast)


Lesenswert?

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

von Stefan Kleinwort (Gast)


Lesenswert?

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

von Matthias (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.