Probleme mit DS18B20

OP #2252107
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?
Gast #2252126
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.
OP #2252131
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
Persönliche Seite #2253557
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.
OP #2255526
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.
Persönliche Seite #2256380
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.

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