DS18B20 Fehler beim Messen der Temperatur

OP (Firma: Student) #4355254
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
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?
Gast #4355496
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.
#4355515
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
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
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
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
Gast #4356273
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?
OP (Firma: Student) #4356291
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
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
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
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

Eine eigene Frage? Dieser Thread ist über 10 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.