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 :)
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 | }
|
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.