Forum: Mikrocontroller und Digitale Elektronik Schwierigkeiten mit Scratchpad des DS18b20


von NikS (Gast)


Angehängte Dateien:

Lesenswert?

Hallo Gemeinde,

ich versuche jetzt seit einer Weile die Temperatur mit einem DS18b20 
auszulesen.
Hierfür verwende ich einen Arduino UNO. Programmiert wird mit dem 
AtmelStudio und im Anschluss mit dem Xloader auf den Mikrocontroller 
geladen. Die Temperatur wird an einem Display ausgegeben. Das Auslesen 
eines Sensors am Bus funktioniert soweit auch. Allerdings habe ich ein 
Problem mit dem Scratchpad was ich einfach nicht gelöst bekomme. Ich 
würde gerne die Auflösung auf 9 oder 10 bit verringern dies klappt 
jedoch einfach nicht. Stelle ich die Auflösung auf 11 oder 12 scheint es 
allerdings zu funktionieren. Bei der Auflösung von 11 und 12 bit kann 
ich das Scratchpad auslesen und bekomme auch die Werte die ich 
eingetragen habe (Th Tl und die Konfiguration). Bei den kleineren 
Auflösungen erhalte ich beim Auslesen nur noch eine Temperatur von 0,0°C 
und für das Scratchpad → Byte0 = 80; Byte1 = 5; Byte2(Th) = 255; Byte3 
(Tl) = 255; Byte4 (Auflösung) =127;…. unabhängig davon was ich auch bei 
Th oder Tl reinschreibe.
Ich hoffe ihr könnt mir helfen meinen Fehler zu finden, bin langsam am 
Verzweifeln.

Vielen Dank :)

von the_yrr (Gast)


Lesenswert?

Moin,
Fehler hab ich nicht gefunden bis jetzt (außer dass zuerst Th und dann 
TL geschrieben werden sollten)

80 und 05 Deziaml also 0h0550 ist der Wert nach dem Initialisieren für 
die Temperatur, es scheint fast als würde der neu initialisiert werden 
nachdem du das Scratchpad schreibst.

Du müsstest den Sensor mit extra Stormversorgung verwenden laut Code
  - häng mal 100nF an +/- an den Sensor und vllt noch einige 10µF
-welchen Wert hat dein pullup Widerstand an der Datenleitung?

- in Init sollten es 2x >480µs sein
  - du hast 480µs und
  - 240+60 = 300µs für die Antwort, das könnte zu knapp sein
  - bei mir funktioniert es mit 600µS, dann 70, dann nochmal 530 warten

wenn die Leitungen etwas länger sind und mehr kapazität haben/pullup zu 
klein passen die delay Werte bei read/write auch nicht ganz (die in 
klammern schon eher)
  - write sind bei dir 3/58 und 60/1, das ist hart an der Grenze
  - (läuft bei mir mit 5/80 und 75/10)
  - read hat 2/10/49, probier mal ( 5/10/73)

- wenn du ein oszi hast kannst du mal an überprüfen ob das Signal gut 
aussieht
- anderen Sensor verwenden, vllt. hat dieser einen Defekt?
- CRC Wert überprüfen wenn du liest (hab mal meinen Code für nen DS18S20 
angehängt, sollte aber identisch sein
- passt der Rom Code, das least significant byte müsste 0h28 bei DS18b20 
sein

1
static uint8_t ds18s20crc8( uint8_t *data, uint8_t length )
2
{
3
  //Generate 8bit CRC for given data (Maxim/Dallas)
4
5
  uint8_t i = 0;
6
  uint8_t j = 0;
7
  uint8_t mix = 0;
8
  uint8_t crc = 0;
9
  uint8_t byte = 0;
10
11
  for ( i = 0; i < length; i++ )
12
  {
13
    byte = data[i];
14
15
    for( j = 0; j < 8; j++ )
16
    {
17
      mix = ( crc ^ byte ) & 0x01;
18
      crc >>= 1;
19
      if ( mix ) crc ^= 0x8C;
20
      byte >>= 1;
21
    }
22
  }
23
  return crc;
24
}

von NikS (Gast)


Lesenswert?

Hey,
danke für deine Mühe :). Ja stimmt die Timings passen nicht die werde 
ich mal korrigieren.
Der Sensor ist mit an den 5V des USB Ports angeschlossen. Als pullup 
sind zwei parallele 10 Kohm Widerstände angeschlossen.
Derzeit ist der Sensor an etwa 10cm langen Leitungen.
Werde dann mal als nächstes einen Kondensator an den Sensor hängen und 
die CRC Werte prüfen.

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.