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
1 | //TEMP
|
2 | unsigned char TempH, TempL, data; |
3 | int TempHi = 0, TempLi = 0, Tempi = 0; |
4 | float TempHf =0.0, TempLf =0.0, Tempf =0.0; |
5 | char TempHa[] = " "; |
6 | char TempLa[] = " "; |
7 | |
8 | //TEMP Messung
|
9 | i2c_start(DS1621_Read); |
10 | data = i2c_readAck(); |
11 | TempH = data; |
12 | data = i2c_readNak(); |
13 | TempL = data; |
14 | i2c_stop(); |
15 | |
16 | //TEMP AUSWERTUNG
|
17 | //MSB
|
18 | TempHf = (float)TempH; |
19 | TempHi = TempH; |
20 | //LSB
|
21 | TempLf = (float)TempL; |
22 | TempLi = TempL; |
23 | |
24 | // Nachkommastelle anpassen
|
25 | if (TempLi == 128) |
26 | {
|
27 | TempLf = 0.5; |
28 | }
|
29 | if (TempLi == 0) |
30 | {
|
31 | TempLf = 0.0; |
32 | }
|
33 | |
34 | //Vorzeichen auswerten
|
35 | // VZ Neg
|
36 | if(TempHi >= 201) |
37 | {
|
38 | Tempf = -(256 - TempHi)+TempLf; |
39 | Tempf = abs(Tempf); |
40 | Tempi = Tempf; |
41 | TempLi = (Tempf - Tempi)*10; |
42 | TempHi = -Tempi; |
43 | }
|
44 | // VZ Pos
|
45 | if(TempHi < 126) |
46 | {
|
47 | Tempf=TempHf+TempLf; |
48 | TempLi = (Tempf - TempHi)*10; |
49 | }
|
50 | |
51 | // Vorkomma INT --> ARRAY
|
52 | itoa(TempHi, TempHa, 10); |
53 | |
54 | // Nachkomma INT --> ARRAY
|
55 | itoa(TempLi, TempLa, 10); |
56 | |
57 | // Ausgabe
|
58 | lcd_setcursor( 0, 2 ); |
59 | lcd_string("Temp: "); |
60 | lcd_setcursor( 7, 2 ); |
61 | lcd_string(TempHa); |
62 | lcd_setcursor( 9, 2 ); |
63 | lcd_string(","); |
64 | lcd_setcursor( 10, 2 ); |
65 | lcd_string(TempLa); |
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.
1 | signed char TempH; |
2 | unsigned char TempL; |
3 | char TempHa[7]; |
4 | |
5 | i2c_start(DS1621_Read); |
6 | TempH = i2c_readAck(); |
7 | TempL = i2c_readNak(); |
8 | i2c_stop(); |
9 | |
10 | if( TempH < 0 && TempL != 0 ) |
11 | TempH++; |
12 | |
13 | itoa( TempH, TempHa, 10 ); |
14 | lcd_string( TempHa ); |
15 | if( TempL != 0 ) |
16 | lcd_String( ",5" ); |
17 | else
|
18 | lcd_String( ",0" ); |
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.
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.