PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Temperaturfuehler DS18S20 bei Frost



hardware.bas
15.02.2011, 06:49
Wie der gewählte Titel schon erahnen lässt, habe ich ein Problem, mit
den 9 Bytes des DS18S20 eine negative Temperatur zu berechnen.
Während das Auslesen der Bytes, auch das spezielle Übertragen, der
Prüfsummencheck und die Berechnung der positiven Temperatur
mittels der im Datasheet vorhandenen Formel funktioniert, kommt bei
Temperaturen unterhalb von 0 Grad C nur Unsinn heraus. Vorsichtshalber
habe ich schon versucht, die benutzten Zwischenvariablen als Integer
bzw. Long zu dimensionieren, um Überläufe zu vermeiden. Hat jemand
vielleicht eine Lösung oder Quelle, wo diese Berechnungsroutine als
BASCOM genutzt werden kann. Beim Googeln fiel ich bisher immer nur
um die komplette Routine, mir gehts jedoch nur um die Berechnung
nicht nur der positiven Werte mittels der ohne Checksumme 8 Bit.
Vielen Dank und Viele Grüsse. Micha

Hubert.G
15.02.2011, 09:01
Ich habe bis jetzt nur mit dem DS1621 gearbeitet.
Die Minusgrad Erkennung ist das höchste Bit vom MSB. Wenn das 1 ist, musst du beide Byte invertieren. Die 0,5 Erkennung ist dann allerdings 0 und nicht mehr 1 am niederwertigsten Bit von LSB.
Routine für BASCOM habe ich allerdings nicht.

hardware.bas
15.02.2011, 10:23
Auf den ersten Blick scheint das Bitmuster und die Rechenroutine
ja die Gleiche zu sein. Ich verstehe nur nicht, warum die Rechenroutine
offensichtlich bei den negativen Werden nicht funktioniert.
Die Routine in BASCOM zu schreiben ist für mich kein Problem.
Hoffe, dass ich keinen Tippfehler o. drgl. drin habe, deshalb meine
Frage zu einem ev. fertigen Decodiercode in BASCOM. VG Micha

peterfido
15.02.2011, 15:52
Hier die zuletzt von mir verwendete Routine:



Templesen:
Dim Sc(9) As Byte
Dim Dg As Integer
Dim Tmp As Byte , T As Integer , T1 As Integer

1wreset
1wwrite &HCC
1wwrite &HBE
Sc(1) = 1wread(9)
Rom1 = 1wread(2) 'Dim Rom1 As Integer
1wreset
If Sc(9) = Crc8(sc(1) , 8) Then
Tmp = Sc(1) And 1
If Tmp = 1 Then Decr Sc(1)
T = Makeint(sc(1) , Sc(2))
T = T * 50
T = T - 25
T1 = Sc(8) - Sc(7)
T1 = T1 * 100
T1 = T1 / Sc(8)
T = T + T1
Dg = T / 10
End If
Temperatur = Dg 'Dim Temperatur As Integer
Menu = Str(temperatur)' dim menu as string * 30 (kann auch weniger sein)
If Temperatur >= 0 Then
Stemperatur = Format(menu , " 000") 'Dim Stemperatur As String * 4
Else
Stemperatur = Format(menu , "-000")
End If

Return

Variablendeklarationen stehen teilweise in den Zeilen als Bemerkung

hardware.bas
15.02.2011, 17:39
Vielen Dank, das werd ich mal ausprobieren. Ging ja um die Berechnung.
Vg Micha

PICture
15.02.2011, 18:04
Hallo!

Sehe dazu Table2 auf 3.Seite des DBs: http://www.datasheetcatalog.org/datasheet/maxim/DS18S20.pdf .

MfG

hardware.bas
15.02.2011, 19:32
Vielen Dank, jedoch genau nach dieser Formel und den Bitmustern
verfahre ich. Die Messung klappt ja auch im Positiven Bereich.
Aber morgen weiss ich mehr. Ich vermute einen Schreibfehler meinerseits.
VG Micha