Pöler
12.04.2010, 21:27
Hallo zusammen,
ich habe heute versucht, in mein eigentlich gut funktionierendes Messprogramm mit 4 ds1820 Sesoren eine Auswertung der Checksumme zu integrieren, um die gelegentlichen Fehlmessungen zu eliminieren. Leider stehe ich ein wenig auf dem Schlauch. Die Sensoren sind an die Pins C1 bis C4 angeschlossen. Es wird eine dreipolige Versorgung (keine parasitäre Speisung) verwendet. Mein ursprüngliches Programm:
Messen:
For I = 1 To Sensoren
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 Sensoren
1wreset Pinc , I 'Reset DS1820
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
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
Vorzeichen = " " 'Vorzeichen zurücksetzen
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
End If
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" 8 Zeichen
Sensor(i) = Temperatur
Next I
Return
Für die Checksummenauswertung habe ich auf den RN Wissensbeitrag http://www.rn-wissen.de/index.php/Bascom_und_1-Wire zurückgegriffen.
Mein Testcode sieht so aus:
Messen:
For I = 1 To Sensoren
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 Sensoren
1wreset Pinc , I 'Reset DS1820
1wwrite &H33 , 1 , Pinc , I
Ar(1) = 1wread(9 , Pinc , I)
Ds1820 = Makeint(ar(1) , 2)
If Ar(8) = Crc8(ar(1) , 7) Then
Sensor(i) = Str(ar(1)) + "," + Str(ar(2))
Goto Ende
Else 'Fehler
Gosub Beep
Waitms 100
Sensor(i) = "Fehler"
Goto Ende
End If
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
Vorzeichen = " " 'Vorzeichen zurücksetzen
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
end If
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" 8 Zeichen
Sensor(i) = Temperatur
Ende:
Next I
Return
Nach der Änderung werden die gelegentlichen Fehlmessungen erkannt, leider klappt die Temperaturmessung nicht mehr. Durch diverse Tests habe ich festgestellt, das das Array Ar(1) bis Ar(9) unabhängig von der Sensortemperatur konstante Werte aufweist. Soweit ich das Datenblatt verstanden habe, sollte doch die Temperatur in den ersten beiden Bytes enthalten sein?
Für den Test habe ich, weil ich nur einen verfügbaren ds1820 habe, die Variable "Sesoren" auf 1 gesetzt. Die anderen Sensoren sind wie die Schaltung normalerweise auch fest im Auto eingebaut. Die "Gotos" sind nur zum Testen im Code. Zur Aufbereitung des Messwertes wird die Variable ds1820 verwendet. Hat jemand eine Idee, wo genau ich da gerade auf dem Schlauch stehe?
Danke und Gruß
Horst
ich habe heute versucht, in mein eigentlich gut funktionierendes Messprogramm mit 4 ds1820 Sesoren eine Auswertung der Checksumme zu integrieren, um die gelegentlichen Fehlmessungen zu eliminieren. Leider stehe ich ein wenig auf dem Schlauch. Die Sensoren sind an die Pins C1 bis C4 angeschlossen. Es wird eine dreipolige Versorgung (keine parasitäre Speisung) verwendet. Mein ursprüngliches Programm:
Messen:
For I = 1 To Sensoren
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 Sensoren
1wreset Pinc , I 'Reset DS1820
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
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
Vorzeichen = " " 'Vorzeichen zurücksetzen
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
End If
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" 8 Zeichen
Sensor(i) = Temperatur
Next I
Return
Für die Checksummenauswertung habe ich auf den RN Wissensbeitrag http://www.rn-wissen.de/index.php/Bascom_und_1-Wire zurückgegriffen.
Mein Testcode sieht so aus:
Messen:
For I = 1 To Sensoren
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 Sensoren
1wreset Pinc , I 'Reset DS1820
1wwrite &H33 , 1 , Pinc , I
Ar(1) = 1wread(9 , Pinc , I)
Ds1820 = Makeint(ar(1) , 2)
If Ar(8) = Crc8(ar(1) , 7) Then
Sensor(i) = Str(ar(1)) + "," + Str(ar(2))
Goto Ende
Else 'Fehler
Gosub Beep
Waitms 100
Sensor(i) = "Fehler"
Goto Ende
End If
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
Vorzeichen = " " 'Vorzeichen zurücksetzen
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
end If
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" 8 Zeichen
Sensor(i) = Temperatur
Ende:
Next I
Return
Nach der Änderung werden die gelegentlichen Fehlmessungen erkannt, leider klappt die Temperaturmessung nicht mehr. Durch diverse Tests habe ich festgestellt, das das Array Ar(1) bis Ar(9) unabhängig von der Sensortemperatur konstante Werte aufweist. Soweit ich das Datenblatt verstanden habe, sollte doch die Temperatur in den ersten beiden Bytes enthalten sein?
Für den Test habe ich, weil ich nur einen verfügbaren ds1820 habe, die Variable "Sesoren" auf 1 gesetzt. Die anderen Sensoren sind wie die Schaltung normalerweise auch fest im Auto eingebaut. Die "Gotos" sind nur zum Testen im Code. Zur Aufbereitung des Messwertes wird die Variable ds1820 verwendet. Hat jemand eine Idee, wo genau ich da gerade auf dem Schlauch stehe?
Danke und Gruß
Horst