CRC Probleme DS18S20 an Raspberry

OP #5015446
Lesenswert?
• ▲
▼
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
Lesenswert?
• ▲
▼
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

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

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.