mikrocontroller.net

Forum: Compiler & IDEs double


Autor: Sascha Biedermann (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Stefan Kleinwort (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Sascha Biedermann (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Stefan Kleinwort (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.