mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Auslesen eines DS18B20: stets 85°C


Autor: Luca K. (lukim)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen,
ich bin gerade erst vor kurzem in die AVR-Programmierung eingestiegen 
und stehe sogleich vor einem Problem:

Ich versuche mir den DS18B20 im nicht parasitären Modus auszulesen. Dies 
habe ich nach folgender Anleitung, da sie die Thematik gut erklärt, 
versucht:
http://www.teslabs.com/openplayer/docs/docs/other/...
Alles scheint mir soweit logisch. Doch in der Praxis funktioniert es 
nicht. Das Problem scheint in der Konvertierung der Temperatur ins 
Scratchpad zu liegen. Laut dem Datenblatt sendet der DS18B20 solange 
eine 0 bis die Konvertierung beendet ist, dann eine 1 (was ja nach etwa 
750ms der Fall sein sollte). Bei mir scheint aber direkt nach dem Befehl 
nur ein einziges Mal eine 0 gesendet zu werden danach folgt bereits die 
1. Ich weiss nicht, woran das liegen könnte. Anschliessend wird 
natürlich nur der Default-Wert, also 85°C, gelesen.

Ich benutze das STK500 mit dem Atmega8515 im Zusammenhang mit AVR Studio 
4. Da kein 4,7kOhm Widerstand für den DS18B20 vorhanden war, verwendete 
ich - bitte korrigiert mich falls die Überlegung kreuzfalsch ist - einen 
3,3kOhm und einen 1kOhm Widerstand in Reihenschaltung um immerhin auf 
4,3kOhm zu kommen. Die Ergebnisse lasse ich mir schlussendlich über 
einen LCD-Display anzeigen.

Danke schon mal im voraus!

Autor: mui (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
4,3 kOhm sind okay - bei mir funktionierts sogar mit 2,2K. das würde ich 
als fehler erstmal ausschliessen...bekommst du denn eine richtige 
temperatur, wenn du > 1s wartest? wie sieht denn dein quellcode aus?

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Funktionierenden Code findest du hier

Beitrag "DS1820, DS18B20 in C"

Autor: Luca K. (lukim)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
@mui: Hier der Quelltext (ohne der LCD-Ansteuerung)

@Karl: Hmm, es klappt. Danke für die Hinweis! Werde jetzt dann mal wohl 
die beiden Quellcode vergleich und versuchen den groben Unterschied bzw. 
den Fehler zu finden.

Autor: mui (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
du liest in therm_read_temperature nachdem du das kommando zum 
tempereatur messen geschickt hast nur EIN BIT aus, um zu schauen, ob der 
Sensor fertig ist...du musst aber abwarten bis ein ganzes BYTE aus 
Einsen besteht (also 0xff) - wenn du den sensor vorher ausliest kommt 
mist raus...

Autor: Luca K. (lukim)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich habe jetzt:
while(!therm_read_bit());
durch
while(therm_read_byte() != 0xff);
ersetzt. Es klappt leider immer noch nicht (Ich hoffe ich habe dich 
richtig verstanden). Aber danke für deine Mühe.

Autor: mui (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hast du es schonmal geschafft etwas ins scratchpad zu schreiben und dann 
wieder auszulesen? hatte da mal ein problem mit der bitreihenfolge - hat 
ewig gedauert, bis ich das rausgefunden hatte, da 85°C im Scratcpad 0x55 
entspricht...das ist aber eine wunderbar symmetrische Zahl und deswegen 
lies sich das nicht gleich erkennen...

ansonsten, probier mal aus zu warten, statt den status abzufragen - 
klappt das denn? wenn nicht ist noch was anderes vermurkst

Autor: Luca K. (lukim)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
1. Ins Scratchpad zu schreiben habe ich noch nicht versucht.
2. Nur warten klappt leider auch nicht, d.h. es wird immer noch 85°C 
angezeigt

Autor: mui (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
85°C bedeutet auf jeden Fall, das irgendwas noch nicht stimmt...es sei 
denn du hast wirklich 85°C in deinem Zimmer :-)

versuch erstmal was ins scratchpad zu schreiben und wieder zu lesen - 
dann kannst du schon mal sicher sein, dass deine schreib/lese routinen 
funktionieren - wenn das dann funktioniert versuchen den sensor zum 
messen zu überreden. wenn du ein oszi hast, guck dir mal die timings auf 
dem bus an - die sind recht kritisch.

Autor: Luca K. (lukim)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
So, ich konnte das Problem nach langem Vergleichen mit dem empfohlenen 
Code lösen: die Befehle THERM_HIGH(); und THERM_OUTPUT_MODE(); nach dem 
Convert_t Befehl und danach einfach 750ms warten. Endgültiger Quelltext 
wird noch folgen. Vielen Dank für die entgegengebrachte Hilfe!

Autor: Christoph S. (mixer) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

benutze ebenfalls den gleichen Code + LCD.

Ich messe im Zimmer momentan 2.625°C. Der Wert verändert sich auch wenn 
ich den DS18B20 anhauche bzw. zwischen zwei Finger nehme um ihn zu 
erwärmen.

Allerdings herrschen hier ca. 20°C!

Was hast du genau verändert um den richtigen Wert zu bekommen??

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
2,625°C * 8 = 21,0°C. Passt also.

Du verwendest Code für den DS18B20 mit dem DS18S20. Der eine liefert die 
Temperatur in 1/16 Grad, der andere in 1/2 Grad.

NB: 85°C ist der Wert, den der Sensor liefert, wenn seit Einschalten 
keine Messung vorgenommen wurde.

Autor: Christoph S. (mixer) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also muss ich das Array temperatur nur noch mal 8 nehmen oder?
          temperature[0]=therm_read_byte();
          temperature[1]=therm_read_byte();
          therm_reset();
          //Store temperature integer digits and decimal digits
          digit=temperature[0]>>4;
          digit|=(temperature[1]&0x7)<<4;
          //Store decimal digits
          decimal=temperature[0]&0xf;
          decimal*=THERM_DECIMAL_STEPS_12BIT;
          //Format temperature into a string [+XXX.XXXX C]
          sprintf(buffer, "%+d.%04u", digit, decimal);

hmm wie mach ich das am besten? Bin bei sowas noch nicht so ganz fit in 
c!

MFG Mixer

Autor: Christoph S. (mixer) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

hat sich mittlerweile erledigt - Hab nen DS1820 und der gibt die 
Temperatur anderst aus als der DS18B20 wofür der Code bestimmt war!
          temperature[0]=therm_read_byte();
          temperature[1]=therm_read_byte();
          therm_reset();
          //check if positive or negative
          sign = (temperature[1]<0x0F) ?'+' :'-';
          //Store temperature integer digits and decimal digits
          digit=temperature[0]>>1;
          //Store decimal digits
          decimal=(temperature[0]&1<<0)?5 :0;
          //Format temperature into a string [?XXX.X °C]
          sprintf(buffer, "%c%d.%01u %cC      ", sign, digit, decimal, 0xDF);
}


Wie effizient bzw. uneffizient ist eig. das sprintf??

Werd ich mit dem Timing probleme bekommen wenn ich noch Interrupts 
einsetze??

MFG Mixer

Autor: Luca K. (lukim)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hier nun die endgültige Version der Dateien zur Ansteuerung eines 
DS18B20. Ich habe einiges geändert. So habe ich beispielsweise die 
Funktionen, zu lesen und zu schreiben in der gleichen Funktion sowie die 
"delay"-Funktion aus dem Ansteuerungsvorschlag übernommen. Zudem habe 
ich noch die Funktionen: 1. die Temperatur als Zahl (d.h. als float) und 
2. die Zahl gerundet auszugeben hinzugefügt.

Ich hoffe hiermit anderen eine Hilfe sein zu können. Korrektur und 
Verbesserung ist stets erwünscht.

@mixer:
1. Bezüglich der Effizienz von "sprintf()" kann ich dir nicht viel 
sagen, da kenne ich mich nicht aus. In meiner neuen Version habe ich 
aber darauf verzichtet und durch "dtostrf()" ersetzt. Über dessen 
Effizienz weiss ich aber ehrlich gesagt auch nicht viel mehr. :-)
2. Ich denke Interrupts könnten durchaus Timingprobleme verursachen. 
Deshalb sollte man - korrigt mich - die gefährlichen Stellen durch 
Verwendung von "cli()" am Anfang bzw. "sei()" am Ende entschärfen.

PS: Ich konnte leider nicht früher die Dateien hochladen bzw. antworten, 
da mir zeitenweise das Internet nicht zur Verfügung stand.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.