Forum: Mikrocontroller und Digitale Elektronik DS1621_Temperatursensor


von youth (Gast)


Lesenswert?

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.

von hdd (Gast)


Lesenswert?

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.

von youth (Gast)


Lesenswert?

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?

von youth (Gast)


Lesenswert?

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?

von youth (Gast)


Lesenswert?

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);

von hdd (Gast)


Lesenswert?

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.

von hdd (Gast)


Lesenswert?

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.

von youth (Gast)


Lesenswert?

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.

von Karl H. (kbuchegg)


Lesenswert?

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" );

von Karl H. (kbuchegg)


Lesenswert?

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 :-)

von youth (Gast)


Lesenswert?

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?

von hdd (Gast)


Lesenswert?

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