CRC Probleme DS18S20 an Raspberry

OP #5015446
Hallo zusammen,

ich habe mehrere DS18S20 und DS18B20 Sensoren an einen Raspberry Zero 
angeschlossen (Pin4). Pullup habe ich schon von 4k7 auf 1k8 geändert, 
bekomme aber weiterhin sporadisch CRC Fehler (wechselnde Sensoren).
Die Einleseroutine liest den Sensor mehrmals bei Auftreten eines CRC 
Fehlers aus. Das Einlesen erfolgt über das 1-wire Dateisystem und 
funktioniert soweit.

Die 10 Sensoren sind an einen Verteiler angeschlossen, Leitungslänge 
jeweils ca. 1,5-3m. Sollte eigentlich kein Problem darstellen.

VCC ist auf dem Raspi noch einmal gegen GND mit 100nF geblockt.

Wie kann ich das Auftreten der CRC-Fehler verringern? Habt ihr ähnliche 
Probleme?

Ausleseroutine (read function):
1
  sensor_device = '/sys/bus/w1/devices/' + str(sensor_slave) + '/w1_slave'
2
  try:
3
        file = open(sensor_device)
4
        filecontent = file.read()                              # Read content from 1-wire slave file
5
        file.close()                                           # Close 1-wire slave file
6
        stringvalue = filecontent.split("\n")[1].split(" ")[9] # Extract temperature string
7
#       print filecontent
8
        if filecontent.find("NO") > 0:
9
                temperature = error_temp
10
                print "CRC failure" + sensor_slave
11
        else:
12
                temperature = float(stringvalue[2:]) / 1000            # Convert temperature value


Und die Auswerteroutine:
1
  file = open(sensor_slaves)
2

3
  w1_slaves = file.readlines()            # Read 1-wire slaves list
4
  file.close()                            # Close 1-wire slaves list
5

6
  # Print header for results table
7
  if verbose_level>0: print('Sensor ID       | Temperature')
8
  if verbose_level>0: print('-----------------------------')
9
 
10
  # Repeat following steps with each 1-wire slave
11
  for line in w1_slaves:
12
     w1_slave = line.split("\n")[0]        # Extract 1-wire slave
13
  
14
     for i in range(20):  # try 20 reads on CRC failure
15
        temperature = read_sensor( w1_slave)  # call read function 
16

17
        if (temperature != error_temp): break  # success
18
        temperature=10
19
       
20
        time.sleep(0.3)
21

22

23
     sensor_count = sensor_count + 1
24

25
     if temperature!=error_temp:
26
       if read_level:sensordata.append((w1_slave, temperature)) # store temperature in database
27

28

29
  return(sensor_count)
Gast #5016160
RC Glied am Signal, Kabel verdrillen, langsamer takten, Signal 
softwareseitig filtern (erfordert natürlich höhere Abtatstrate), 
Störquellen lokalisieren und entstören, ...
Was sich auch empfiehlt: Mit Osziloskop verifizieren, dass es sich um 
elektrische Probleme handelt oder ob der Code einfach nur instabil ist.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 9 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.