PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Mal wieder ds1820 Checksummen Problem



Pöler
12.04.2010, 20: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

for_ro
12.04.2010, 21:04
1wwrite &H33 , 1 , Pinc , I
Dies liest den ROM Code des Sensors aus, nicht die Temperatur. Sollte heißen
1wwrite &HBE , 1 , Pinc , I


If Ar(8) = Crc8(ar(1) , 7) Then
Dies überprüft die CRC des ROM Codes. Für die Überprüfung der Temperatur-Übertragung musst du dies angeben
If Ar(9) = Crc8(ar(1) , 8) Then


Ds1820 = Makeint(ar(1) , 2)
Steht dies da wirklich so?
Sollte da nicht
Ds1820 = Makeint(ar(1) , ar(2))
stehen? Aufgrund deiner Schiebe Operation usw . macht dies für positive Temps aber eh keinen Unterschied. Nur die negativen werden so nicht gehen.

Pöler
18.04.2010, 15:39
Hallo for_ro,

so, mit Deiner Hilfe hat es geklappt. Ich habe da wohl wirklich mehrfach auf dem Schlauch gestanden. Ich stelle den funktionierenden Code mal für den nächsten rein:


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
1wwrite &HBE , 1 , Pinc , I 'sende T-Register 60h und 61h an Atmel Ar(1) = 1wread(9 , Pinc , I)
Ar(1) = 1wread(9 , Pinc , I)
If Ar(9) = Crc8(ar(1) , 8) Then 'Prüfsumme OK?
Ds1820 = Makeint(ar(1) , Ar(2)) 'Ja, dann Temperatur berechnen
Else
Goto Fehler 'CRC Fehler -> naechster Sensor
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
Fehler: 'CRC Fehler, alten Temperaturwert des Sensors behalten
Next I
Return


Danke und Gruß

Horst