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:

Code:
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:
Code:
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