Forum: Mikrocontroller und Digitale Elektronik CRC Probleme DS18S20 an Raspberry


von Pete K. (pete77)


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)

: Bearbeitet durch User
von Sven (Gast)


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.

von Pete K. (pete77)


Lesenswert?

Sven schrieb:
> langsamer takten, Signal
> softwareseitig filtern (erfordert natürlich höhere Abtatstrate),

Da das ganze mit dem Raspberry 1-wire filesystem läuft kann ich da 
nichts ändern.

Werde mal den Widerstand auf 820R oder 1k anpassen.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.