Forum: Mikrocontroller und Digitale Elektronik Probleme mit DS18B20


von Uwe H. (uwe1981)


Lesenswert?

Hallo Jungs (und Mädels...?) :-)
Ich hab auf meinem Experimentierboard einen DS18B20 werksseitig, der 
bestens funktioniert. Jetzt habe ich mir noch vier dazugekauft und siehe 
da: schon fängt der Sch...ß an :-) Egal, welchen ich von den Neuen an 
die Strippe hänge, bekomme ich entweder -0,25 Grad angezeigt oder 
FFFFFFFFFFF. Wo liegt der Fehler? Mit dem Boardsensor klappt alles 
wunderbar, die Neuen klappen garnicht. Angeschlossen hab ich die 
Sensoren mit einem Widerstand von 4,7k zwischen + und DQ. Vielleicht 
liegt hier der Hund begraben? Aber so stehts im Datenblatt. Auch ein 
Reset, Programm-Neuinstallation, etc. hat nix gebracht. Wer weiß Rat?

von (prx) A. K. (prx)


Lesenswert?

Anhand welcher deiner üppig spriessenden Informationen sollen wir das 
erraten? Welches Board, welche Software, Quellcode (vor wem, von dir?), 
wie wo angeschlossen, ob mehrere gleichzeitig, ...

Garantiert kein DS1820 oder DS18S20 auf dem Board? Die sind ähnlich aber 
nicht identisch.

von Nichts ist zu Alt (Gast)


Lesenswert?

Den Wiederstand brauchst du nur einmal in deiner One-Wire-Interface.
Du musst Jeden DS1820 einzeln adressieren. Da gibt es Zwei verschidene 
Modus es gibt einmal einen Dresse auf die alle DS1820 ansprechen sinvoll 
bei nur einem einzelnen DS1820 in der Stripe sonst gibt es einen 
Datencrash oder mann liest den einzelnen sensoren die SERIENUMMER aus 
und adressiert sie damit.

von Christian H. (netzwanze) Benutzerseite


Lesenswert?

Wie hängst Du die anderen DS18B20 dran?
Beherrscht Dein Expermentierboard mehrere Sensoren am "Bus" 
(Algorithmus; Search-ROM; ...)?
Kennt das Board genau Deinen Sensor?
...

von Uwe H. (uwe1981)


Lesenswert?

Ok ok, ich hab mich nicht klar genug ausgedrückt: Ich will den 
vorhandenen DS18B20 nur gegen einen anderen austauschen, nichts anderes. 
Es geht NICHT um eine Reihenschaltung von mehreren Sensoren. Dann müßten 
alle adressiert werden, das weiß ich. Hier gehts wie gesagt nur darum, 
den Boardsensor gegen einen anderen gleichen Typs auszutauschen, und das 
klappt nicht. Hier der Code:


Config 1wire = Portc.5                                      ' DS18S20




Const Ds1920 = &H10
Const Skiprom = &HCC
Const Read_rom = &H33
Const Convertt = &H44
Const Read_ram = &HBE
Const Write_ram = &H4E
Const Copy_ram = &H48
Const Recall_ee = &HB8
Const Read_power = &HB4

Dim Family_code As Byte
Dim Serial_number(6) As Byte
Dim Crc As Byte
Dim Scratch(9) As Byte

Dim I As Byte
Dim Temp As Word
Dim Temp1 As Integer
Dim Stemp As Single


Do
  1wreset
  1wwrite Read_rom
  Family_code = 1wread()
  For I = 1 To 6
    Serial_number(i) = 1wread()
  Next
  Crc = 1wread()
  1wwrite Convertt
  Do
    Temp = 1wread()
  Loop Until Temp = &HFF

  1wreset
  1wwrite Skiprom
  1wwrite Read_ram

  For I = 1 To 9
    Scratch(i) = 1wread()
  Next

  Temp = Scratch(2)
  Shift Temp , Left , 8

  Temp = Temp + Scratch(1)
  Temp1 = Temp
  Temp1 = Temp1 / 20
  Stemp = Scratch(8) - Scratch(7)
  Stemp = Stemp / Scratch(8)
  Stemp = Stemp + Temp1
  Stemp = Stemp - 0.25


  Locate 1 , 1
  Lcd "Air Exhaust"

  Locate 2 , 1
  Lcd "Temp: " ; Fusing(stemp , "#.##") ; " Grad C"
  Cursor Off
  Waitms 500

Loop

End

von Donald Duck (Gast)


Lesenswert?

Elektor hatte da mal was. "Heute ist es mal wieder kalt" oder so. Den 
sorcecode kann man da glaub ich kostenlos herunterladen.

Die Adresse liest man nur einmal aus.

von Christian H. (netzwanze) Benutzerseite


Lesenswert?

Der DS18B20 hat in den ersten zwei Byte des Scratchpad bereits eine 
Auflösung von 0,0625°C. Eine Auflösungserweiterung über Byte 7 und 8 ist 
hier nicht möglich.

Das bedeutet, Dein Code ist für den DS18S20. Dieser hat in den ersten 
Bytes "nur" eine Auflösung von 0,5°C.

Dann ist da noch was anderes fault:

25,0°C bedeutet, dass Temp einen Wert von 50 hat.
Diesen Wert teilst Du dann durch 20.
Temp1 ist also 2 (Integer).

Dann kommt die Berechnung der feineren Auflösung:

Scratch(8) ist immer 16 (hard-wired).
Scratch(7) ist ein Wert zwischen 0 und 16 (soweit ich weiß).

Scratch(8)-Scratch(7) hat also ebenfalls einen Wert zwischen 0 und 16.

Teilt man das ganze durch 16, wird das einen Wert zwischen 0 und 1 
ergeben.
Dazu kommt nun Dein Temp1 (in diesem Fall 2) - das ergibt maximal 3.
Davon ziehtst Du noch 0,25 ab. Also maximal 2,75.

Da kann also etwas nicht stimmen.


Korrekt wäre es, wenn Du Temp1 nur durch 2 teilst. Also den Wert ein Bit 
nach rechts verschiebst.

Das aber nur für den DS18S20.

Beim DS18B20 sollte folgendes korrekt sein:

 Temp = Scratch(2)
  Shift Temp , Left , 8
  Temp = Temp + Scratch(1)
  Stemp = Temp
  Stemp = Stemp / 16

Power-up default ist bereits eine Auflösung von 12-bit. Da muss also 
nichts speziell eingestellt werden. Die Messung dauert dann aber auch 
750ms, also fast eine Sekunde.

von Uwe H. (uwe1981)


Lesenswert?

Hallo Christian, danke für die detaillierten Infos. Ich hab den Code 
abgeändert:




Const Ds1920 = &H10
Const Skiprom = &HCC
Const Read_rom = &H33
Const Convertt = &H44
Const Read_ram = &HBE
Const Write_ram = &H4E
Const Copy_ram = &H48
Const Recall_ee = &HB8
Const Read_power = &HB4

Dim Family_code As Byte
Dim Serial_number(6) As Byte
Dim Crc As Byte
Dim Scratch(9) As Byte

Dim I As Byte
Dim Temp As Word
Dim Temp1 As Integer
Dim Stemp As Single


Do
  1wreset
  1wwrite Read_rom
  Family_code = 1wread()
  For I = 1 To 6
    Serial_number(i) = 1wread()
  Next
  Crc = 1wread()
  1wwrite Convertt
  Do
    Temp = 1wread()
  Loop Until Temp = &HFF

  1wreset
  1wwrite Skiprom
  1wwrite Read_ram

  For I = 1 To 9
    Scratch(i) = 1wread()
  Next


 Temp = Scratch(2)
  Shift Temp , Left , 8
  Temp = Temp + Scratch(1)
  Stemp = Temp
  Stemp = Stemp / 16



  Locate 1 , 1
  Lcd "Raumtemperatur"
  Locate 2 , 1
  Lcd "Temp: " ; Fusing(stemp , "#.##") ; " Grad C"
  Cursor Off
  Wait 1

Loop

End


Temperaturmessung stimmt jetzt fast 100%ig mit meinem 
Quecksilber-Thermometer überein. Sorry, ich arbiete mich grad erst in 
das 1Wire ein und kapier noch lange nicht alles. Zum Beispiel hier:

  Crc = 1wread()
  1wwrite Convertt
  Do
    Temp = 1wread()
  Loop Until Temp = &HFF

Was bedeutet &HFF? Kann das nirgends finden.

von lukas85 (Gast)


Lesenswert?

Uwe Heydemann schrieb:
> Was bedeutet &HFF? Kann das nirgends finden.

Das bedeutet Hexadezimal FF (=255 Dezimal).
Die Schleife läuft also so lange bis Temp = 255 ist.

von Uwe H. (uwe1981)


Lesenswert?

...also bis die Temperatur aus dem Scratchpad mit CRC übereinstimmt?

von Christian H. (netzwanze) Benutzerseite


Lesenswert?

Nein, es geht nur darum, dass der Sensor, solange die Messung 
durchgeführt wird, ein dauerhaftes LOW sendet. Es wird erst high, wenn 
die Messung beendet ist.

Im Datenblatt steht das dann so drin:
If the DS18B20 is powered by an external supply, the master can issue 
read time slots after the Convert T command and the DS18B20 will respond 
by transmitting a 0 while the temperature conversion is in progress and 
a 1 when the conversion is done.

Das ganze nennt sich "polling", funktioniert aber nur mit eigener 
Spannungsversorgung; nicht parasitär.

Die Schleife wartet also solange, bis die Messung beendet ist.

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.