Hallo!
Ich habe auf einem alten W500V Router (Telekom) openWRT zum Laufen
gebracht.
1Wire und I2C werden über GPIOs (waren vorher mal die LEDs) und die
passenden Kernel-Module realisiert.
Am 1Wire-Bus hängt ein DS18S20 Temp-Sensor, am I2C ein LM75. Beide haben
die zugehörigen Pull-up Widerstände (1Wire: 4,7k, I2C: 2x 10k).
Beide funktionieren soweit, und liefern mir die Temperatur.
1Wire:
1
cat /sys/bus/w1/devices/10-xxxxx/w1_slave
-> ~24 °C
I2C:
1
i2cget -y 0 0x48 0x00 w
-> nach Umwandlung der 2 Bytes in Temp (im Datasheet beschrieben) -> ~16
°C
Wie könnte dieser Temperaturunterschied zu Stande kommen? Beide Sensoren
liegen hier vor mir auf dem Breadboard. Der DS18S20 wurde sowohl in
Parasite-Power Modus, als auch "normal" angesteuert und getestet ->
macht keinen Unterschied.
Ein 2. DS18S20 liefert den gleichen Wert - also kann der DS18S20 nicht
kaputt sein.
Da der LM75 wie im Datenblatt beschrieben reagiert, und auch ohne Murren
erkannt wurde (per i2cdetect) gehe ich auch mal davon aus, dass der auch
nicht "kaputt" ist.
Was kann solche Temperaturunterschiede verursachen?
Nachtrag: VCC = 3,3V (kommt vom Router).
- keine "langen" Kabel wurden verwendet. Die Sensoren stecken im
Breadboard und wurden mit Litze an das Router PCB gelötet.
- Der Anschluss an die GPIOs erfolgte "direkt", etwaige Widerstände von
den LEDs (die da vorher waren) wurden ausgelötet.
openWRT schrieb:> Was kann solche Temperaturunterschiede verursachen?
Unterschiedliche Temperaturen. ;-)
Welche Gehäusebauformen haben deine Sensoren und wie werden sie von der
Luft angeströmt? Guck mal, ob der angezeigte Temperaturunterschied
geringer wird, wenn du mit einem Lüfter beiden die gleiche Luft
zuführst.
Mike A. schrieb:> openWRT schrieb:>> Was kann solche Temperaturunterschiede verursachen?>> Unterschiedliche Temperaturen. ;-)>> Welche Gehäusebauformen haben deine Sensoren und wie werden sie von der> Luft angeströmt? Guck mal, ob der angezeigte Temperaturunterschied> geringer wird, wenn du mit einem Lüfter beiden die gleiche Luft> zuführst.DS18S20: TO92
LM75: µSOP-8 (LM75-CIM3)
Beide stecken nebeneinander (der SMD LM75 via Adapter) auf dem
Breadboard. Die Fenster sind zu und es gibt keine Zugluft.
A. K. schrieb:> Und wieviel Grad hat es wirklich? Draussen wären die 16° realistisch und> drinnen käme ich allenfalls im Gehäuse des Routers auf 24°.
Wie meinst du das? Beide Sensoren sind natürlich hier bei mir auf dem
Schreibtisch und nicht draußen. Des Weiteren sind sie natürlich auch
nicht im Router-Gehäuse verbaut, sondern stecken auf einem Breadbord,
von dem die (kurzen) Kabel zum Router PCB gehen.
Ich habe leider kein anderes Thermometer zur Verfügung hier.
Ich würde ja auch erwarten, dass die beiden Sensoren leicht
unterschiedliche Werte ausgeben. Aber nicht einen Unterschied von 8°C.
openWRT schrieb:> Ich habe leider kein anderes Thermometer zur Verfügung hier.
Und ohne Thermometer bist du nicht in der Lage, bei der Raumtemperatur
den Unterschied zwischen 16°C und 24"C festzustellen?
A. K. schrieb:> openWRT schrieb:>> Ich habe leider kein anderes Thermometer zur Verfügung hier.>> Und ohne Thermometer bist du nicht in der Lage, bei der Raumtemperatur> den Unterschied zwischen 16°C und 24"C festzustellen?
Ach das meinst du ;)
Ich denke, dass der DS18S20 grob richtig liegt. Ich würde die Temperatur
hier auf ~24 °C einschätzen.
Ich frage mich jedoch, wieso der LM75 dann so weit falsch liegt.
Habe eben nochmal die Konvertierung überprüft.
Der LM75 liefert "0x7710" zurück. 0x10 ist Upper-Byte, 0x77 ist
Lower-Byte. In Binär wäre das ja 0001000001110111. Signifikant sind nur
die ersten 9 Bit (8 vom Upper Byte, 1 vom Lower Byte).
Ergibt somit 000100000:
openWRT schrieb:> ein LM75. Beide haben die zugehörigen Pull-up Widerstände (1Wire: 4,7k,> I2C: 2x 10k).
Mach mal einen 100nF Kerko an den LM75 und 1k vor SCLK.
openWRT schrieb:> Die Fenster sind zu und es gibt keine Zugluft.
Dann sorge mal mit einem Lüfter dafür, dass mögliche
Temperaturunterschiede abgebaut werden.
openWRT schrieb:> i2cget -y 0 0x48 0x00 w
Bist du sicher, dass das stimmt. Nach DS Tab. 3 entsprich ein Wert von
0x4800 im Temperaturregister einer Temperatur von 72°C. Da passiert
irgendetwas in deine Auslesefunktion. In Tab. 4 mit den Beispielwerten
wird für 25°C ein Registerwert von 0x190x genannt.
Mike A. schrieb:> openWRT schrieb:>> i2cget -y 0 0x48 0x00 w>> Bist du sicher, dass das stimmt. Nach DS Tab. 3 entsprich ein Wert von> 0x4800 im Temperaturregister einer Temperatur von 72°C. Da passiert> irgendetwas in deine Auslesefunktion. In Tab. 4 mit den Beispielwerten> wird für 25°C ein Registerwert von 0x190x genannt.
Das ist falsch. 0x48 ist die Adresse, wenn A0-A1 auf GND liegen. Ist die
default i2c Adresse dieser Sensoren.
Laut Datenblatt wird im Register 0x00 dann die Temperatur gelesen.
i2cget <i2c-bus-id> <i2c device addr> <read register> <ausgabe als word>
Das -y ist nur ein Schalter, damit er ohne Rückfrage auf den i2c Bus
zugreift.
MaWin schrieb:> openWRT schrieb:>> ein LM75. Beide haben die zugehörigen Pull-up Widerstände (1Wire: 4,7k,>> I2C: 2x 10k).>> Mach mal einen 100nF Kerko an den LM75 und 1k vor SCLK.
Habe ich gerade probiert. Macht keinen Unterschied. :(
Aber danke schon mal allen, die geantwortet haben :)
0x7710
0xf712
0x7713
->
0001000001110111
0001001011110111
0001001101110111
->
16 °C
17 °C
17,5 °C
Das sind die Werte, die ich von dem LM75 als "Probe" gelesen habe,
während ich ihn kurz mit den Fingern anfasse.
Passt alles soweit von der Umrechnung :/
Datasheet LM75: "However, only the 11 significant bits should be used,
and the 5 LSB bits of the LS byte are zero and should be ignored."
Die unteren 5 Bits sind bei dir aber nicht 0. Folglich sind die
gelesenen Bits Unsinn. Und zwar nicht nur die unteren 5.
A. K. schrieb:> Datasheet LM75: "However, only the 11 significant bits should be used,> and the 5 LSB bits of the LS byte are zero and should be ignored.">> Die unteren 5 Bits sind bei dir aber nicht 0. Folglich sind die> gelesenen Bits Unsinn. Und zwar nicht nur die unteren 5.
Woher hast du dieses Zitat?
Datasheet: http://datasheets.maximintegrated.com/en/ds/LM75.pdf
In diesem steht davon nicht. Da steht für die unteren, nicht genutzten 5
Bit, "X = Don’t care".
openWRT schrieb:> Das ist falsch. 0x48 ist die Adresse, wenn A0-A1 auf GND liegen.
Ok, das hatte ich falsch verstanden.
openWRT schrieb:> Passt alles soweit von der Umrechnung :/
Mmh. Der Temperaturanstieg sieht vernünftig aus. Mit Erwärmung durch
einen warmen Luftstrom (Föhn in ausreichender Entfernung) könnte man
noch mal über einen größeren Bereich beide Sensoren vergleichen und die
Bitbewertung prüfen. Fehler sollten sich als dicker Faktor in der
Steigung bemerkbar machen.
16°C als Zimmertemperatur würden dir bestimmt auffallen ;-)
Jetzt wäre ein zweiter LM75 nicht schlecht. Ich habe nur die DS18B20 im
Einsatz und die liegen auch über mehrere Lieferchargen sehr gut
beieinander (deutlich besser als 0.5°C).
Mike A. schrieb:> Jetzt wäre ein zweiter LM75 nicht schlecht. Ich habe nur die DS18B20 im> Einsatz und die liegen auch über mehrere Lieferchargen sehr gut> beieinander (deutlich besser als 0.5°C).
Ja, das stimmt. Habe aber leider nur einen :(
Habe nun nochmal einen DS18S20 aus einer anderen Charge getestet. Alle
drei liefern, wie du auch beschreibst, mit ~0,5°C Abweichung den
gleichen Wert.
Ich tippe, dass einfach der LM75 einen "Knack weg" hat.
Außer ich liege doch fundamental falsch mit meiner Umrechnung, so wie
von prx angedeutet.
openWRT schrieb:> Außer ich liege doch fundamental falsch mit meiner Umrechnung, so wie> von prx angedeutet.
Meine Aussage war, dass die ausgelesenen Bits schlichtweg nicht stimmen
können, weil die unteren 5 Bits 0 sein müssen. Und wenn die nicht
stimmen, dann stimmen die übrigen 11 Bits wahrscheinlich auch nicht.
Apropos: Was für ein LM75 ist es denn genau?
openWRT schrieb:> Außer ich liege doch fundamental falsch mit meiner Umrechnung, so wie> von prx angedeutet.
Das könntest du mit dem Temperaturvergleich über einen größeren Bereich
prüfen (s.o.)
openWRT schrieb:> Das ist aber ein LM75A. Der hat eine Auflösung von 0,125°C.
Weshalb es dort 5 ungenutzte Bits sind, beim LM75 aber 7.
> Außerdem> unterscheidet sich hier die Berechnung für den Temperaturwert.
Nur in der Maskierung, wenn das tatsächlich zwingend erforderlich ist.
Davon abgesehen wird der Wert linksbündig in 16 Bits unabhängig von der
Auflösung immer gleich interpretiert.
> Ich habe einen LM75 mit 0,5°C Auflösung.
Exakt ganz genau welchen?
Hab den LM75 mal ein wenig mit dem Feuerzeug von der Seite warm gemacht
(nein, nichts angeschmort oder sowas).
Die Berechnung müsste doch so stimmen? Auch die Werte sehen sinnig aus.
openWRT schrieb:> Hab den LM75 mal ein wenig mit dem Feuerzeug von der Seite warm gemacht> (nein, nichts angeschmort oder sowas).
Wie wäre es, wenn du mal beide Sensoren mit dem gleichen warmen
Luftstrom auf halbwegs gleiche Temperatur bringst. Woher willst du bei
der Feuerzeugmethode wissen, ob der Senser 10 oder 20°C erwärmt wird?
openWRT schrieb:> 0xf729 0010100111110111 001010011 41,5
0xf729 ist bei mir binär folgendes:
1111 0111 0010 1001
Irgendwie ist das nicht wirklich mit Deinen Binärziffern korreliert...
Der LM75 liefert das MSB zuerst aus. Der Prozessor aber je nach Bauart
das LSB oder das MSB. Da die 16 Bits des LM75 vom Linux-Kernel als
natives 16-Bit Wort durchgereicht werden (per union), werden bei einer
little endian CPU die Bytes verdreht.
Wer angesichts dessen die Weisheit des Autors des Kernel-Moduls in Frage
stellt, der hat meine volle Zustimmung.
A. K. schrieb:> Wer angesichts dessen die Weisheit des Autors des Kernel-Moduls in Frage> stellt, der hat meine volle Zustimmung.
:D
Also stimmt die Konvertierung so?
Falls ja, wären wir wieder beim Anfang des Problems. Wieso solch eine
hohe Abweichung?
Malefiz schrieb:> openWRT schrieb:>> 0x7719 0001100101110111 000110010 25>> laut Datenblat muss da aber 190x raus kommen
Guter Punkt...
Ich werde wohl nochmal intensiver lesen müssen.
Malefiz schrieb:>> 0x7719 0001100101110111 000110010 25>> laut Datenblat muss da aber 190x raus kommen
0x7719 ist auf einer little endian CPU tatsächlich 0x1977 - und wenn man
die unteren 7 Bits wegmaskiert 0x1900.
A. K. schrieb:> Malefiz schrieb:>>> 0x7719 0001100101110111 000110010 25>>>> laut Datenblat muss da aber 190x raus kommen>> 0x7719 ist auf einer little endian CPU tatsächlich 0x1977 - und wenn man> die unteren 7 Bits wegmaskiert 0x1900.
Ah. Super. Danke dir fürs Nachprüfen!
Also kann ich davon ausgehen, dass die Umrechnung stimmt?