Zur Übersicht - INFO - Neueste 50 Beiträge - Neuer Beitrag - Suchen - FAQ - Zum CC1-Forum - Zum CC-Pro-Forum

Re: 18B20 misst falsch? Kategorie: I²C-Bus (von ChristianS - 12.10.2010 22:01)
Als Antwort auf Re: 18B20 misst falsch? von BerndK - 11.10.2010 21:52
Ich nutze:
C-Control II Station, OSOPT V3.1
Hallo Bernd,
jau ich habe es jetzt. Wenn man zu blöd ist die richtige Adresse einzustellen, dann ändern
sich die 16,0 Grad einfach nicht.... Ich habe jetzt  eine 0.25er Auflösung mit "*25/4"; realisiert.
Die Abweichung zum DS1631 beträgt jetzt ca. 0,1 Grad. Das ist schon OK.

Vielen Dank für die Unterstützung und da ich mein ganzes Programm umbaue, werde ich
mich sicherlich noch mal melden...

Schönen Gru�,
ChristianS.


> Hallo Christian,
>
> die Sensoren können von 9 bis 12 Bit Genauigkeit betrieben werden. Default ist aber 12 Bit
> (jedenfalls laut Datenblatt). Läuft die Messung im 9-Bit-Modus, so sind es Schritte von 0.5 °C.
> An der Auflösung habe ich aber noch nichts umkonfiguriert.
>
> Bewegt sich die Temperatur wenn Du den Sensor z.B. mit den Fingern erwärmst?
> Wichtig ist auch, daÃ? erst "*5" und dann "/8" gerechnet wird. Wenn erst durch 8 dividiert wird,
> dann entspricht dies einer Verschiebung um 3 Bit nach rechts. Man vernichtet so diese drei Bits.
> Die Auflösung ist dann auch unnötigerweise 0.5 °C.
>
> Jetzt kommt noch eine vorsichtige Frage: Es ist schon ein 18B20? In dieser Dallas-Familie gibt
> es eine ganze Reihe von Temperatursensoren, die sich teilweise etwas unterscheiden und nicht völlig
> kompatibel sind. Z.B. kann der 18S20 nur 9 Bit und stellt die Temperatur auch anders in den 16 Bits
> dar.
> Dein ursprünglicher Code, der die "/8" nicht enthält, pa�t eher zum 18S20. Dort steht Bit 0 für
> 0.5 °C. Man nimmt die Integerzahl mal fünf und erhält dann die Temperatur in Dezigrad.
>
> Wenn es immer noch nicht so recht paÃ?t, dann baue doch mal eine Ausgabe der beiden vom Sensor
> gelesenen Bytes als Hex- oder notfalls auch Dezimalausgabe ein bevor irgendwas umgerechnet wird.
> Eine Blick auf die originalen Daten zur Plausibilitäsprüfung kann bei der Analyse hilfreich sein.
>
> Viele Grü�e
> Bernd
>
>
>
> > Hallo Bernd,
> > danke für die Erklärung, ich glaube ich habe es verstanden. Aber irgendwo ist immer noch der
> > Wurm drin. Ich muss mir meinen Code noch mal genau ansehen. Die Temperaturanzeige bleibt
> > konstant bei 16.0 Grad stehen, obwohl ich nur Deine Zeile eingebaut habe.... ich melde mich
> > noch einmal.
> >
> > ChristianS.
> >
> >
> > > Hallo Christian,
> > >
> > > ich habe jetzt doch noch einen Blick in das Datenblatt des DS18B20 geworfen.
> > > Datenblatt DS 18B20
> > >
> > > Es werden mit den readByte-Kommandos nacheinander die ersten beiden Bytes aus dem Sensor gelesen.
> > > Die Beschreibung der Bedeutung der einzelnen Bytes steht auf Seite 7 in Figure 7. Uns interessiert
> > > das Byte 0 (LSB) und das Byte 1 (MSB).
> > > Diese beiden Bytes stellen zusammen eine Integerzahl mit 16 Bit dar in der die Temperaur binär als
> > > Zweierkomplement codiert ist. Das ist auf Seite 4 in Tabelle 1 dargestellt. Bei den beim Sensor
> > > möglichen negativen Werten (0 bis -55 °C) sind die ersten sechs Bits immer "1".
> > >
> > > Der Code macht nun folgendes:
> > > Das erste readbyte holt das LSB. Das zweite readbyte holt das MSB. Das LSB enthält die rechten acht
> > > Bit (least significant byte) das MSB die linken (most significant byte). Das MSB muÃ? nun mit 256
> > > (2 hoch 8) multipliziert werden oder eben um 8 Bit nach links verschoben. Das macht das "shl 8".
> > >
> > > Jetzt haben wir eine Zweierkomplement-Dastellung der Temperatur, so wie sie in Table 1 abgebildet
> > > ist.
> > >
> > > Jetzt müssen wir die Temperatur für uns brauchbar darstellen. Wie auf Seite 3 steht, ist die
> > > Auflösung des Sensors max. 0.0625 °C. Das ist das letzte Bit 0 ganz rechts.
> > > Bit 1 stellt dann 0.125 °C dar, Bit 2 0.25 °C und Bit 3 0.5 °C. (Binärdarstellung: Faktor 2 pro
> > > Stelle)
> > > Die 0.5 °C sind auch in der Table 1 enthalten: Bit 3 ist "1", alle anderen "0".
> > >
> > > Jetzt rechnen wir: Die 0008h für 0.5 °C entsprechen 8 dezimal.
> > > Wir müssen also die 0008h durch 8 dividieren und mit 0.5 multiplizieren um unsere Temperatur in
> > > "°C" zu erhalten. Da aber Dezimalstellen in einer derartigen Umgebung immer etwas unhandlich sind,
> > > normieren wir auf 1/10 Grad (Dezigrad). Der Wert ist also noch mit 10 zu multiplizieren. Aus dem
> > > "mal 0.5" wird jetzt "mal 5" für Werte ind Dezigrad.
> > > Das ist das "*5/8" am Ende der Zeile.
> > >
> > > Der Rest kümmert sich darum, da� negative Werte im Fehlerfalle nicht beliebig klein werden können,
> > > indem immer die
> > > linken 4 Bits immer gesetzt werden.
> > >
> > > Hoffentlich konnte ich etwas Licht in die Sache bringen.
> > >
> > > Viele Grü�e
> > > Bernd
> > >
> > >
> > >
> > >
> > > > Hallo,
> > > > tja, ich weiss nicht. Jetzt habe ich nur eine Nachkommastelle und messe jetzt schon seit Stunden
> > > > 16,0 Grad. Der DS1631 ist mittlerweile bei 15,43 Grad. Ich muss gestehen, die Temperatur fällt auch
> > > > sehr langsam. Ich werde das mal bis morgen laufen lassen. Mal sehen, ob sich an den 16,0 Grad noch
> > > > was ändert. Allerdings, was bewirkt der gänderte Code? kann das jemad mal erläutern?
> > > >
> > > > ChristianS.
> > > >
> > > >
> > > > > Hallo Christian,
> > > > >
> > > > > mit und gegen die Temperatursensoren habe ich auch schon heftig gekämpft. Bei Recherchen habe ich
> > > > > verschiedene Codeschnipsel gefunden. Bei mir läuft seit einem Jahr in einer Heizungssteuerung
> > > > > (also eine "kritische Anwendung") die Auswertung der 18B20 mit folgendem Code:
> > > > >
> > > > > x=(ds2482.readByte(0) or ds2482.readByte(0) shl 8)*5/8;
> > > > > if x and 0xF000
> > > > > temp[busNummer]= (x) or 0xf000;
> > > > > else
> > > > > temp[busNummer]= (x) ;
> > > > >

> > > > >
> > > > > Das ersetzt die Zeile "x=..." und das "return x*5;"
> > > > >
> > > > > Ein Möglichkeit, die Dallas-Sensoren auch ohne die CC2 auszulesen besteht unter Linux mit digitemp.
> > > > > Damit kann man mit zwei nebeneinanderliegenden Sensoren recht schnell feststellen, ob der CC2-Code
> > > > > taugt. RS232-1Ŵire-Adapter kursieren im Internet etliche.
> > > > > Der Quellcode von Digitemp ist au�erdem sehr informativ für die Behandlung der 1-Wire-Sensoren.
> > > > >
> > > > > Hoffentlich konnte ich ein Stück weiterhelfen.
> > > > >
> > > > > Viele Grü�e
> > > > > Bernd
> > > > >
> > > > >
> > > > >
> > > > >
> > > > > > Hallo,
> > > > > > ich habe folgende Routine um die Temperatur von einem 18B20 auszulesen. Ich muss
> > > > > > feststellen, dass ich andere Temperaturwerte kriege, als von einer DS1631, die ich an der
> > > > > > selben Stelle als Referenz angebracht habe. Ich habe bei dem 18B20 fast 2 Grad weniger als beim
> > > > > > DS1631. Ein externes Me�gerät bestätigt, das der DS1631 richtig misst. Was ist an der
> > > > > > Ansteuerung des 18B20 falsch?
> > > > > >
> > > > > >
> > > > > > {long temp;
> > > > > >  int x;
> > > > > >  ds2482.matchROM(5,ROM);
> > > > > >  ds2482.writeByte(ds2482addr,convertTEMP);
> > > > > >
> > > > > >  sleep 750;
> > > > > >
> > > > > >  ds2482.matchROM(5,ROM);
> > > > > >  ds2482.writeByte(ds2482addr,readSCRATCHPAD);
> > > > > >   x=ds2482.readByte(ds2482addr) or ds2482.readByte(ds2482addr) shl 8;
> > > > > >  return x*5;
> > > > > >

> > > > > >
> > > > > > Die Routine wird 1 x pro Minute aufgerufen und im Programm über hwcom mit zwei
> > > > > > Nachkomastellen ausgegeben.
> > > > > >
> > > > > >
> > > > > >
> > > > > > DS1820_1=getTemp(5,DSAddress);
> > > > > > .....
> > > > > > sendTemp2Com(DS1820_1);
> > > > > > .....
> > > > > >
> > > > > > function sendTemp2Com(int temp)
> > > > > > /******************************************************************************/
> > > > > > /*   Routine zum Ausgeben der Temperatur über HWCOM                           */
> > > > > > /*   x:= Temperatur                                                           */
> > > > > > /******************************************************************************/
> > > > > > {
> > > > > >  if temp < 0
> > > > > >   hwcom.print("-");
> > > > > >  else if temp < 1000 // wenn Wert positiv war => eine Null voranstellen? Bereich 0-999
> > > > > >   hwcom.print("0");
> > > > > >  temp = math.abs(temp); // Betrag bilden (Wert ist ab jetzt immer positiv)
> > > > > >  hwcom.num(temp / 100); // Vorkommawert
> > > > > >  hwcom.print(",");
> > > > > >  temp = temp % 100;
> > > > > >  if temp < 10           // eine Null voranstellen?
> > > > > >   hwcom.print("0");
> > > > > >  hwcom.num(temp);       // Nachkommawert
> > > > > >  hwcom.print("°C");
> > > > > >  hwcom.ret();
> > > > > >  wait hwcom.ready();
> > > > > > } //Ende function Temp_Ausgabe
> > > > > > /******************************************************************************/
> > > > > >

> > > > > >
> > > > > > P.S.: ich habe den 18B20 in einen Schrumpfschlauch eingeschweiÃ?t, da sich der Sensor
> > > > > > im Au�enbereich befindet. Die DS1631 ist nicht eingeschwei�t.Das müsste eigentlich
> > > > > > bedeuten, dass der Sensor träger reagiert als der DS1631. Das sollte aber doch keine 2
> > > > > > Grad auf Dauer ausmachen, oder?
> > > > > >
> > > > > > ChristianS.


    Antwort schreiben


Antworten: