- Labornetzteil AliExpress         
Ergebnis 1 bis 3 von 3

Thema: Mal wieder ds1820 Checksummen Problem

  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    27.06.2005
    Beiträge
    23

    Mal wieder ds1820 Checksummen Problem

    Anzeige

    LiFePo4 Akku selber bauen - Video
    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

  2. #2
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    16.02.2006
    Beiträge
    1.113

    Re: Mal wieder ds1820 Checksummen Problem

    Zitat Zitat von Pöler
    1wwrite &H33 , 1 , Pinc , I
    Dies liest den ROM Code des Sensors aus, nicht die Temperatur. Sollte heißen
    1wwrite &HBE , 1 , Pinc , I

    Zitat Zitat von Pöler
    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

    Zitat Zitat von Pöler
    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.

  3. #3
    Neuer Benutzer Öfters hier
    Registriert seit
    27.06.2005
    Beiträge
    23
    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:
    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
    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

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

12V Akku bauen