http://www.produktinfo.conrad.com/datenblaetter/17...
Hallo,
ich bekomme Werte für meinen Sensor ausgelesen. Und zwar einmal das MSB
und das LSB. Auf Seite 4 der Pdf in der Tabelle 2 steht dazu die
Erklärung. Leider bekomm ich die Werte nicht richtig ausgewertet. Ich
erhalte als MSB Werte wie 246, 256, 266, 276 (also immer um dezimal 10
steigend, wenn ich den Finger auf den Sensor lege). Als LSB erhalte ich
entweder 0 oder 128. Damit kann ich etwas anfangen. Im LSB steht die
Nachkommastelle mit einer Genauigkeit von 0,5 °C die hex 0x80
entspricht.
Wie werte ich aber nun das MSB aus? Die Werte lese ich als int aus.
Wenn du tatsächlich 256, 266 oder 276 ausliest macht deine Umrechung in
int irgendwelche Fehler. Im MSB stehen die Werte als Zweierkomplement
mit 8Bit, also wäre der höchste auslesbare Wert 127.
Stimmt, macht Sinn. Hab ich nicht nachgedacht. Ich nehme den int und
wandle den als char array um für die Ausgabe auf den LCD. Dazu verwende
ich itoa(Temp, Tempa, 10);
Die 10er Basis ist doch in dem Fall ok oder?
Wenn ich die Basis auf 16 in itoa umstelle, gibt er mir die Werte auch
richtig aus. Also zum Biespiel 19 1A 1B und so weiter. Wie bekomm ich
die denn jetzt allerdings zusammengesetzt und als Dez gewandelt?
Der Code für die Auswertung sieht jetzt so aus. Den I2C Teil hab ich mal
rausgelassen. Für positive Temperaturen funktioniert es soweit. Nur für
den Fall negativer Temperaturen bin ich mir nicht sicher und bislang
konnt ich es mangels Kühlschrank nicht testen.
Datenblattlink nochmal hier (Seite 4, Tab.2)
http://pdfserv.maxim-ic.com/en/ds/DS1621.pdf
Sieht mir alles sehr umständlich aus was du da machst mit den ganzen
Floats. Werden die Werte noch weiter verwendet abgesehen von der
LCD-Ausgabe? Ansonsten könntest du dir das ganze gerechne sparen, du
hast ja am Anfang schon die Vor- und Nachkommastellen einzeln.
Und die Umrechung aus dem Zweierkomplement hat auch noch ein paar
Schönheitsfehler. Die positiven Werte sind alle von 0 bis 127, die
negativen von 128 bis 255 (jeweils eingeschlossen).
Die positiven kannst du direkt übernehmen. Bei den negativen musst du
den Wert von 256 abziehen um an den Betrag zu kommen, zumindest das
machst du ja. Allerdings musst du dann die Nachkommastelle auch noch
subtrahieren und nicht addieren.
Ups, vor lauter Rechnerei das eigentliche Problem vergessen, mach mal
dein Char-Array für die Vorkommastellen größer, so passen da keine drei
Zeichen rein.
hdd schrieb:> Allerdings musst du dann die Nachkommastelle auch noch> subtrahieren und nicht addieren.
Bist du dir da sicher?
-½°C 11111111 10000000 FF80h
Das heißt doch, wenn ich 0xFF im MSB habe (also Dec 255) ergibt sich:
MSB = 255;
LSB = 0.5;
temp = -(256 - MSB)+LSB = -(256-255)+ 0.5 = -1 + 0.5 = -0.5 -> passt
doch
Und laut Tabelle 2 Seite 4 vom Datenblatt sind pos. Temp nur bis 125°C
(MSB = 0-125) definiert und negative Zahlen nur bis -55°C (MSB = 201 -
255).
Du kannst mir gern sagen was du wie verbessern würdest. Ich denke mal es
geht wirklich einfacher. Die ganzen Floats sind wirklich verwirrend,
waren aber irgendwie nötig um die Ausgabe auf den LCD zu machen. Da dies
ein char array von mir erwartet.
Wow machst du das kompliziert.
Der IC schickt dir doch das alles schon im 2-er Komplement. Die
richtigen Datentypen genommen und der Rest ist ein Kinderspiel, weil es
der Compiler für dich erledigt.
signed char TempH;
...
TempH = i2c_readAck();
itoa( TempH, TempHa, 10 );
Wenn TempH negativ ist UND die TempL anzeigt, dass die Nachkommastelle
0.5 lauten muss, dann wird TempH mit einem ++ um 1 erhöht, wenn man die
Nachkommastelle anzeigen will.
Ach, einen klitzekleinen Fehler hab ich noch.
Bei -0.5° kommt der Code ins straucheln. Die werden als +0.5° angezeigt.
Aber auch das lässt sich lösen :-)
So richtig warm werd ich mit dem Quellcode noch nicht. Er zeigt mir als
Nachkommastelle immer zwei Zeichen an. Wie muss ich den Code abändern,
damit ich nur noch eine Nachkommastelle habe?
Verwendest du den Code von kbuchegg oder noch deinen eigenen?
Was zeigt er denn an auf dem Display?
Meinst du mit zwei Zeichen zwei Ziffern oder zählst du das Komma auch
dazu?
Bei dem Code oben wird ganz sicher nur ",0" oder ",5" am Ende ausgegeben
wenn du nicht irgendwas geändert hast.