PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Unterschied DS1820 / DS18B20



Pöler
07.12.2009, 20:36
Guten Abend zusammen,

gibt es programmtechnisch Unterschiede zwischen dem Dalls DS1820 und dem DS18B20? Hintergrund meiner Frage:

Seit Jahren habe ich einen Mega8 mit 4 DS1820 im Auto im Einsatz. Da ich jetzt mal das Progamm ein wenig ändern wollte, habe ich den Rechner ausgebaut und zum Testen einen DS18B20 angeschlossen. Der und ein zweiter, den ich zur Sicherheit mal angeschlossen habe, zeigen nur Müll an, meist negative Werte, die sich auch bei jeder Messung ändern.
Die 4 funktionierenden Sensoren sind leider mehr oder weniger fest im Auto eingebaut. Weitere DS1820 habe ich leider nicht zur Verfügung. Sowohl die originalen Sensoren als auch die zum Testen angeschlossenen laufen nicht im parasitäten Modus und haben je einem 4,7K Widerstand von DQ nach +. Verringerung des Widerstands (Parallelschaltung) hat auch keine Verbesserung gebracht. Die benutzten Pins sind Pinc.1 bis Pinc.4.




Temperaturmessung:
If Tempmess >= 96 And Verriegelung = 0 Then '1920 ms (96*20) seit dem Reset vergangen
Gosub Messen 'Also Temperaturmessung
Tempmess = 0
Verriegelung = 1 'Und Zähler zurücksetzen
End If
If Tempmess >= 4 And Verriegelung = 1 Then '80ms (4*20) nach Reset auslesen der Temp. Sensoren
Gosub Auslesen
Tempmess = 0
Verriegelung = 0
End If
Return

Messen:
For I = 1 To 4
1wreset Pinc , I 'Reset DS1820
1wwrite &HCC , 1 , Pinc , I 'überspringe ROM
1wwrite &H44 , 1 , Pinc , I 'starte Temperaturkonvertierung
Next I
Return

Auslesen:
For I = 1 To 4
1wreset Pinc , I 'Reset DS1821
1wwrite &HCC , 1 , Pinc , I 'Überspringe ROM
1wwrite &HBE , 1 , Pinc , I 'sende T-Register 60h und 61h an Atmel
Ds1820 = 1wread(2 , Pinc , I) 'lese die empfangenen Daten 2 Byte
Ds1820a(i) = Ds1820 'Zum Anzeigen des ausgelesenen Wertes (Sensortest)
1wreset Pinc , I 'Reset DS1821
Halb = Ds1820 And 1 'prüfen auf letztes Bit (x.5 Grad)
Shift Ds1820 , Right 'entferne letztes Bit (Rechtsschieben)
Ds1820 = Ds1820 And 255 'Nur die unteren 8 Bit werden benötigt
If I = 1 Then
Tesp = Ds1820 'Ganzzahlige Temperatur der ESP (1 Byte) '
End If
If Ds1820 > 127 Then 'wenn Temperatur negativ ist
Vorzeichen = "-"
Ds1820 = 256 - Ds1820 'und negative Temperatur berechnen
If Halb = 1 Then Ds1820 = Ds1820 - 1 'wenn Wert x.5 dann um 1 korrigieren
Else 'wenn Temperatur Positiv
Vorzeichen = " "
End If
If Halb = 1 Then
Nachkomma = "5" 'wenn x.5
Else 'wenn x.0
Nachkomma = "0"
End If
Temperatur = " " + Vorzeichen + Str(ds1820) '"-_-xxx"
Temperatur = Right(temperatur , 4) '"-xxx"
Temperatur = Temperatur + "." + Nachkomma + Chr(223) + "C" '"-xxx.y°C"
Sensor(i) = Temperatur
Next I
Return

Ausschließen kann ich das die DS18B20 mal verkehrt angeschlossen wurden. Die Schaltung wurde bereits mehrfach überprüft / nachgemessen.
Hat jemand eine Idee, wie die beiden Sensoren unter einen Hut zu bekommen sind?

Danke und Gruß

Horst

screwdriver
08.12.2009, 04:29
gibt es programmtechnisch Unterschiede zwischen dem Dalls DS1820 und dem DS18B20?

Obwohl beide Sensoren eine 12bit-Auflösung haben, führt der DS1820 nur 9 Bit in seinen internen Temperatur-Registern, der DS18B20 alle 12 Bit.

Diese Temperatur-Register liest Du in der Zeile

Ds1820 = 1wread(2 , Pinc , I)

ein, wobei die Variable DS1820 vermutlich als Integer oder Word dimensioniert ist. Bei einem angeschlossenen DS18B20 erhälst du nun wegen der 12bit einen 8-fach höheren Wert, was durch die Zeile

If Ds1820 > 127 Then
Vorzeichen = "-"
...

zu einer negativen Anzeige führt. Der absolute Temperaturwert ist natürlich auch völlig falsch.

Als Abhilfe ändere die Zeile
Ds1820 = 1wread(2 , Pinc , I)
in
Ds1820 = 1wread(2 , Pinc , I) / 8
was einem arithmetischem Schieben um 3 Bit nach rechs entspricht, oder kaufe dir beim nächsten Mal DS18S20 Sensoren, welche die gemessene Temperatur wie die DS1820 auch im 9bit-Format in ihren Registern ablegen.


Offtopic:
Diese Codevariante mit der Variablen "Halb" und dem Auswerten des Vorzeichens, etc., sieht man häufig in diversen Foren. Vermutlich ist der vor langer Zeit mal in Assembler erstellt und dann immer wieder übernommen worden. Man sollte sich da was zeitgemäßeres gönnen oder selbst programmieren.

MFG
screwdriver

Pöler
08.12.2009, 21:05
Hallo Screwdriver,

vielen Dank, hat mir sehr geholfen. Ich werde den Code wenn ich Zeit habe mal so anpassen, das man beide Sensoren einsetzen kann.

Was Deine Kritik an dem übernommenen und angepassten Programmcode angeht, stehe ich aber eher auf dem Standpunkt, das man das Rad nicht ständig neu erfinden muss. Für den Anwendungsfall mit Temperaturen zwischen -10 und + 100 Grad klappt der Code ja (mit richtigem Sensor ;-).


Gruß

Horst

Traceman
07.01.2010, 11:24
Hallo,

wenn wir hier schon beim der Unterscheidung der DS18x20 sind, was hat der DS18B20+ noch anders?

Hardy