Forum: Mikrocontroller und Digitale Elektronik DS18B20 Fehler beim Messen der Temperatur


von Matthias W. (Firma: Student) (mazze2000)


Angehängte Dateien:

Lesenswert?

Hallo Bastler,

ich habe ein Problem bei meinem aktuellen Projekt:
Ich möchte an meinem "myAVR Board" einen Temperatursensor DS18B20 
betreiben.
Als Anzeige habe ich ein LCD (ebenfalls von myAVR).

Habe mir sämtliche Anleitung durchgelesen... das versteht sich ja von 
selbst...

Mein aktueller Stand ist der, dass ich 2 Modi habe (diese Schalte ich im 
Programm um, indem ich die nicht benötigte Funktion auskommentiere)
1. ROM ID auslesen und aufs Display geben
2. Temperatur auslesen und aufs Display geben

Der erste Teil funktioniert sehr gut und zuverlässig.
Beim Messen der Temperatur bin ich jedoch überfordert.

Ich bekomme immer einen Wert von 127,9375 vom DS18B20 geliefert.
Im Internet wird dieses Problem oft als Timing-Problem abgestempelt.
Dies kann ich mir jedoch nicht vorstellen da dass Auslesen der ROM-ID 
problemlos klappt.

Mein Programmcode habe ich beigefügt.
Würde mich über ein paar Tips freuen.

Liebe Grüße aus Hannover,
Matthias

von Wolfgang A. (Gast)


Lesenswert?

Matthias W. schrieb:
> Im Internet wird dieses Problem oft als Timing-Problem abgestempelt.

Mit welcher Taktfrequenz läuft dein ATmega328 bzw. welches Board hast du 
genau?

von Matthias W. (Firma: Student) (mazze2000)


Lesenswert?

Hallo Wolfgang,

Es handelt sich um ein atmega8.
Er läuft auf 8MHz (interner "Quarz")

Bei meinem Board handelt es sich um das myavr Board mk2 USB.

Danke schonmal für deine Hilfe.

Lg Matthias

von Bernd E. (berecke)


Lesenswert?

Wenn es sich um ein Original-Board von myAVR handelt, dann laufen diese 
im Allgemeinen mit 3,6864 MHz (externer Quarz) oder mit 1 MHz (intern 
ohne Quarz).

Ist: #define F_CPU 8000000L // run CPU at 16 MHz
Soll: #define F_CPU 3686400 UL // run CPU at 3,6864 MHz
Oder: Soll: #define F_CPU 1000000 UL // run CPU at 1 MHz

Oder um welches Board handelt es sich?

von S. Landolt (Gast)


Lesenswert?

Stimmt das _delay_us(15) in therm_ReadBit()? Zitat Datenblatt:
Therefore, the master must release the bus and
then sample the bus state within 15μs from
the start of the slot.

von Ursus P. (unwichtig)


Lesenswert?

Matthias W. schrieb:
> Hallo Bastler,

> Mein aktueller Stand ist der, dass ich 2 Modi habe (diese Schalte ich im
> Programm um, indem ich die nicht benötigte Funktion auskommentiere)
> 1. ROM ID auslesen und aufs Display geben
> 2. Temperatur auslesen und aufs Display geben
>
> Der erste Teil funktioniert sehr gut und zuverlässig.
> Beim Messen der Temperatur bin ich jedoch überfordert.
>
ID kannst du ohne Probleme auslesen? Ist auch die ID die im Datenblatt 
steht?

von Matthias W. (Firma: Student) (mazze2000)


Lesenswert?

Hallo Jungs,

Ich habe den Clock auf Intern 8 MHz mit dem programm "avg progtool" 
gestellt.
Wenn ich diese Einstellung Auslese zeigt er mir die richtige (8MHz) auch 
an.

Die ID sollte die richtige sein.
Diese steht aber in keinem Datenblatt da sie ja "einmalig" ist...
Nach einem reset erscheint auch immer wieder die gleiche (es sei denn 
ich nehme einen anderen ds18b20)
Also sollte das schon funktionieren...

Danke für eure Hilfe.

von Ursus P. (unwichtig)


Lesenswert?

Matthias W. schrieb:
> Hallo Jungs,
>
> Die ID sollte die richtige sein.
> Diese steht aber in keinem Datenblatt da sie ja "einmalig" ist...
> Nach einem reset erscheint auch immer wieder die gleiche (es sei denn
> ich nehme einen anderen ds18b20)
> Also sollte das schon funktionieren...
>
> Danke für eure Hilfe.

Wenn ID stimmt, dann funktioniert deine Kommunikation auf der 
Hardwareebene einwandfrei, beim Temperaturauslesen muss auch gehen. Wie 
liest du den die Temperatur? Reseten, Konvertierungsanfrage, und dann 
Scratchpad auslesen? Du kannst dem Dreibeiner sagen das du Ihn ohne ID 
auslesen willst ;-)))

von Bernd E. (berecke)


Lesenswert?

Auch CKDIV8 deaktiviert?

von Matthias W. (Firma: Student) (mazze2000)


Lesenswert?

Hey,
Also wie genau die Temperatur ausgelesen wird weiß ich ehrlich gesagt 
nicht.

Da werden so viele Unterroutinen aufgerufen und so.

Man kann da ja auch schlecht was Simulieren...


Was genau soll CKDIV8 sein?

Lg Matthias

von Werner M. (Gast)


Lesenswert?

Matthias W. schrieb:
> Was genau soll CKDIV8 sein?

Eine Fuse in deinem Controller (s.Datenblatt).

von Matthias W. (Firma: Student) (mazze2000)


Lesenswert?

Der atmega8 hat das ckdiv gar nicht.
Habe ich gerade in einem anderen Thread gelesen ?

Ich drehe noch durch...

Das sind doch jetzt aber alles Ansätze die auf Timing Problemen 
hinweisen...
Aber die ROM ID kann ich ja auslesen. Somit klappt ja die Kommunikation 
inkl Timing oder sehe ich das falsch?

Lg Matthias

von Ursus P. (unwichtig)


Lesenswert?

Matthias W. schrieb:

> Da werden so viele Unterroutinen aufgerufen und so.
> Man kann da ja auch schlecht was Simulieren...

Kein JTAGICE3? Dann besorg dir eins um Programmlauf anzuhalten ;-) 
kostet nicht die Welt

von chris (Gast)


Lesenswert?

Matthias W. schrieb:
> Aber die ROM ID kann ich ja auslesen. Somit klappt ja die Kommunikation
> inkl Timing oder sehe ich das falsch?

Stimmt denn überhaupt die ausgelesene ID?
D.h. ist die CRC korrekt und passt der Family Code mit der Angabe aus 
dem Datenblatt zusammen?

von Carl D. (jcw2)


Lesenswert?

Daß der Sensor nach dem CONVERT Kommando je nach gewählter Auflösung bis 
zu 750mSec, also aus AVR Sicht eine halbe Ewigkeit, braucht, ist 
bekannt, oder?
Im Code ist davon nämlich nichts zu sehen!

von iwoasesned (Gast)


Lesenswert?

Matthias W. schrieb:
> Im Internet wird dieses Problem oft als Timing-Problem abgestempelt.

Zum 1000-7.ten male -> ist es aber

von Matthias W. (Firma: Student) (mazze2000)


Lesenswert?

Hallo chris,

ich gehe mal davon aus das die ID stimmt.
Der Familiencode stimmt auch. Die ID beginnt mit 28.
Und so soll es sein.
Ein CRC Check wird glaube ich nicht durchgeführt.

Ich habe folge zwei DS18B20 ausgelesen:
1. 28 A9 CF 46 05 00 00 45
2. 28 60 71 47 05 00 00 2E

Ich denke die werden schon richtig sein...

LG

von Matthias W. (Firma: Student) (mazze2000)


Lesenswert?

iwoasesned schrieb:
> Matthias W. schrieb:
>> Im Internet wird dieses Problem oft als Timing-Problem abgestempelt.
>
> Zum 1000-7.ten male -> ist es aber

Aber warum funktioniert dann das Auslesen der ROM-ID?

von Carl D. (jcw2)


Lesenswert?

Weil die Kommunikation prinzipiell geht.
Nur gibt es in dem Moment, in dem gelesen wird, noch keinen Meßwert.

von Matthias W. (Firma: Student) (mazze2000)


Lesenswert?

Hallo Carl,

Dann geht es nach deiner Aussage ja um das direkte Messen.
Also uC nimmt einen Wert entgegen der aber eigentlich noch gar nicht da 
ist.

Dann müsste es ja um folgende Schleife gehen:

void therm_ReadTempRaw(byte id[], byte *t0, byte *t1)
// Returns the two temperature bytes from the scratchpad
{
 therm_Reset();
 if (id) therm_MatchRom(id); // skip ROM & start temp conversion
 else therm_WriteByte(THERM_SKIPROM);
 therm_WriteByte(THERM_CONVERTTEMP);
 while (!therm_ReadBit()); // wait until conversion completed

 therm_Reset(); // read first two bytes from scratchpad
 if (id) therm_MatchRom(id);
 else therm_WriteByte(THERM_SKIPROM);
 therm_WriteByte(THERM_READSCRATCH);
 *t0 = therm_ReadByte(); // first byte
 *t1 = therm_ReadByte(); // second byte
}

sehe ich das richtig?

von Matthias W. (Firma: Student) (mazze2000)


Lesenswert?

Habe den Fehler gefunden!!!

Die Programmzeilen aus meinem vorherigen Post waren betroffen...:

void therm_ReadTempRaw(byte id[], byte *t0, byte *t1)
// Returns the two temperature bytes from the scratchpad
{
 therm_Reset();
 if (id) therm_MatchRom(id); // skip ROM & start temp conversion
 else therm_WriteByte(THERM_SKIPROM);
 therm_WriteByte(THERM_CONVERTTEMP);
 while (!therm_ReadBit()); // wait until conversion completed

 therm_Reset(); // read first two bytes from scratchpad
 if (id) therm_MatchRom(id);
 else therm_WriteByte(THERM_SKIPROM);
 therm_WriteByte(THERM_READSCRATCH);
 *t0 = therm_ReadByte(); // first byte
 *t1 = therm_ReadByte(); // second byte
}

Die if (id) ... Abfrage habe ich raus genommen. nun klappt es.

Verstehe ich das richtig, dass wenn ich die if Abfrage raus nehme, ich 
den Sensor nicht per ID anspreche?

LG

von Joachim B. (jar)


Lesenswert?

Matthias W. schrieb:
> Verstehe ich das richtig, dass wenn ich die if Abfrage raus nehme, ich
> den Sensor nicht per ID anspreche?

keine Ahnung ist zulange her bei mir, läuft seit 5 Jahre oder so

ich suche solange bis ich keine Sensoren mehr finde und lege jeden 
gefundenen Sensor in ein array, hab ich eine ID gefunden dann setze ich 
im Array das Flag

da ich immer alle Sensoren lese schaue ich nur ins Array und ordne es 
nach IDs den Zimmern zu

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.