Re: 18B20 misst falsch? Kategorie: I²C-Bus (von ChristianS - 11.10.2010 9:14) | ||
Als Antwort auf Re: 18B20 misst falsch? von BerndK - 10.10.2010 23:01 | ||
| ||
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: Re: 18B20 misst falsch? (von BerndK - 11.10.2010 21:52) Re: 18B20 misst falsch? (von ChristianS - 12.10.2010 22:01) |