www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Probleme mit DS18S20


Autor: Aaron (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

der DS18S20 liefert mir eine falsche Temperaturwert züruck. Bei temp_MSB 
kriege ich 0xFF und temp_LSB kriege ich 0xBF. Wenn das umgerechnet wird, 
komme ich dann zu -32°C.

Könnte jemand mir helfen?

float Read_Temperature(void)
{
  unsigned char  Scratchpad[9];
  //unsigned char buffer[2];
  unsigned char temp_LSB,temp_MSB;
  char i;
  float final_temp;
  signed int temp;

  if(DS18_SendReset(3))
  {
    DS18_WriteByte(0xCC); //Skip ROM 
    DS18_WriteByte(0x44); //Start conversion
    Delay_us(670);
    DS18_SendReset(3);
    DS18_WriteByte(0xCC); //Skip ROM
    DS18_WriteByte(0xBE); //Read Scratchpad

      for(i=0;i<9;i++)
      {
        Scratchpad[i]=DS18_ReadByte_1();
      }
  }

/*****************************************************************************
Read temperature from Scratchpad and convert the reading into °C
*****************************************************************************/

temp_MSB = Scratchpad[1];
temp_LSB = Scratchpad[0];
test = temp_LSB;
if(temp_MSB <= 0x80)
{
  temp_LSB = (temp_LSB/2);
}

temp_MSB = temp_MSB & 0x80;

if(temp_MSB >= 0x80)
{
  temp_LSB = (~temp_LSB)+1;
}

if(temp_MSB >= 0x80)
{
  temp_LSB = (temp_LSB/2);
}

if(temp_MSB >= 0x80)
{
  temp = ((-1)*temp_LSB);
}

final_temp= ((float)temp);//*10 ;//Final Temperature in °C x10
                //e.g. 21.5°C = 21

return final_temp;

Autor: MagIO (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du musst erst mal eine Messung triggern und warten bis er fertig ist.

Messung anstossen geht mit:
CONVERT T [44h]

Und dann:
If the DS18S20 is powered by an
external supply, the master can issue read-time slots after the Convert 
T command and the DS18S20 will
respond by transmitting 0 while the temperature conversion is in 
progress and 1 when the conversion is
done.

Autor: MagIO (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
PS:
Ah ... Messung triggern hast Du ja schon, aber der reset vor dem 
auslesen ist dann vermutlich ne schlechte Idee.

Autor: Aaron (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn ich reset weglasse, liefert der Sensor temp_LSB=0xFF zurück. Ich 
habe die Funktion anhand AN162 von Dallas geschrieben. Drin steht eine 
Reset nach dem Covert_T.

Mfg

Autor: Timo S. (kaffeetas)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ich würde vorschlagen du machst die Pause mindestens um den Faktor 1000 
länger damit der gute DS18S20 auch genügenden Zeit hat die Temperatur zu 
wandeln. Im Datenblatt steht was von 750ms.

Grüße
 Timo

Autor: MagIO (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ok ... das mit dem Reset war eine falsche Vermutung meinerseits.

Hab nochmal in dem Code nachgesehen, den ich habe.

1. Reset
2. Skip Rom
3. Start Conversion
4. Solange warten, bis dir Konvertierung fertig ist
5. Reset
6. Skip Rom
7. Read scratchpad - wobei man hier nach 2 byte auch aufhören kann
8. Reset

Ausschalten und Ruhe gönnen nicht vergessen. Die Temperatur driftet 
sonst.

Autor: Aaron (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo leute,

ich bin zurzeit nicht mehr am Arbeitsplatz,hab schon Feierabend gemacht. 
Mit euren Vorschlägen werde ich morgen versuchen,den Sensor zum laufen 
bringen.

Ich werde euch morgen sagen,ob es funktioniert.

Wünsche euch einen schönen Feierabend.

Bis morgen leut!

Mfg

Autor: Aaron (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo leut,

ich hab den Vorschlag von MagIO genommen und hab versucht,den Sensor zum 
laufen zu bringen.

Jetzt liefert der DS18S20 mir temp_MSB = 0x00 und temp_LSB = 0x2F . Nun 
kommt die Frage : Wie errechnet man aus diesen Werten die Temperatur in 
°C (Celsius) .

Muss mann ertsmal temp_LSB invertieren, eins addieren und dann durch 
zwei teilen?

Oder mann nimmt einfach temp_LSB und teilt es durch 2?


temp_LSB = 0x2F d.h 67 in Decimal /2 = 23.5
temp_MSB = 0x00 d.h positive Temperatur

Die gelieferte Temperatur ergibt sich dann : + 23.5°C , richtig?


Hier ist noch mal die modifizierte Code :

float Read_Temperature(void)
{
  unsigned char  Scratchpad[9];
  //unsigned char buffer[2];
  unsigned char temp_LSB,temp_MSB;
  unsigned char i,j;
  float final_temp;
  signed int temp;

  /*for(j=0;j<9;j++)
  {
    Scratchpad[j]=0;
  }
  */
  if(DS18_SendReset(3))
  {
    DS18_SetPortOutput();
    DS18_WriteByte(0xCC); //Skip ROM 
    DS18_WriteByte(0x44); //Start conversion
    for(j=0;j<128;j++)
    {Delay_us(40000);}
    //while(!DS18_Read()){}
    DS18_SendReset(3);
    DS18_WriteByte(0xCC); //Skip ROM
    DS18_WriteByte(0xBE); //Read Scratchpad

      for(i=0;i<9;i++)
      {
        Scratchpad[i]=DS18_ReadByte_1();
      }
    
  }

/*****************************************************************************
Read temperature from Scratchpad and convert the reading into °C
*****************************************************************************/
if(DS18_SendReset(3))
{
temp_MSB = Scratchpad[1];
temp_LSB = Scratchpad[0];
test = temp_LSB;
  
  
  if(temp_MSB <= 0x80)
  {
  temp_LSB = (temp_LSB/2);
  }

  temp_MSB = temp_MSB & 0x80;

  if(temp_MSB >= 0x80)
  {
  temp_LSB = (~temp_LSB)+1;
  }

  if(temp_MSB >= 0x80)
  {
  temp_LSB = (temp_LSB/2);
  }

  if(temp_MSB >= 0x80)
  {
  temp = ((-1)*temp_LSB);
  }

final_temp= ((float)temp);//*10 ;//Final Temperature in °C x10
                //e.g. 21.5°C = 215
}

return final_temp;

}


Autor: Wolfgang-G (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Falls das Problem noch nicht gelöst wurde:
für positive Temperaturen kann man rechnen
T = MSB*16+LSB*0,0625

MfG

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.