DS1621_Temperatursensor

Gast #2350760
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.
Gast #2350773
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?
Gast #2350783
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?
Gast #2351102
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);
Gast #2351168
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.
Gast #2351902
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.
#2351910
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" );
Gast #2361763
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren