DS18B20 Fehler beim Messen der Temperatur

OP (Firma: Student) #4355254
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
Angehängte Dateien:
#4355487
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?
#4355515
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?
OP (Firma: Student) #4355528
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.
#4355533
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 ;-)))
OP (Firma: Student) #4356066
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
OP (Firma: Student) #4356291
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
OP (Firma: Student) #4356305
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?
OP (Firma: Student) #4356339
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
#4356440
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren