Forum: Mikrocontroller und Digitale Elektronik Probleme mit der Kommunikation mit DS2482-100 auf DS18B20 (Temperatursensor)


von Torsten G. (ladinov)


Lesenswert?

Hi,

ich bin neu im Forum und hoffe schonmal zu Beginn dass ich die richtige 
Kategorie gewählt habe. Wenn nicht, tut es mir schonmal leid ;).

So, nun zu meinem Problem. Ich habe ein Raspberry Pi und darauf den 
DS2482-100 1-Wire Adapter gesteckt. An diesem Adapter ist der DS18B20 
Temperatursensor angeschlossen.

Hier mal kurz die beiden Links zu den entsprechenden Datenblättern des 
DS2482-100 und DS18B20:

http://datasheets.maximintegrated.com/en/ds/DS2482-100.pdf

http://datasheets.maximintegrated.com/en/ds/DS18B20.pdf

Eine grundlegende Übersicht wie die Geräte angeschlossen sind habe ich 
auch.

http://evil.hn.vc/linux/HomeServer/pdf/Raspberry%20Pi%20-%20Hardware.pdf

Auf Seite 8 ist das ganze mal schematisch dargestellt. Den zweiten 
Sensor einfach wegdenken, es ist nur einer angeschlossen. Danach wird 
beschrieben wie man das ganze mit Hilfe von OWFS ausliest.

Nun möchte ich aber nicht mit OWFS darauf zugreifen sondern mit den 
i2c-tools Befehlen i2cset und i2cget (Ziel ist es ohne OWFS zu 
arbeiten). Und hier komme ich nicht weiter. Der i2cset Befehl sieht 
grundlegend so aus:

i2cset -y <Bus> <Adresse> <Register> <Wert>

Der i2cget Befehl ist ähnlich:

i2cget -y <Bus> <Adresse>

Der Bus wäre 1 und die Adresse 0x18, aber welches Register muss ich 
benutzen? Ich muss folgende Befehle an den DS18B20 senden:

0xCC für das SkipROM Command

0x4E für Write Scratchpad

Dann eine Sekunde ungefähr warten damit die Daten geschrieben werden. 
Und dann:

0xBE für READ Scratchpad

Mit ist einfach nicht klar wie ich dass über den DS2482-100 machen muss, 
da ich ja die Befehle zuerst an ihn senden muss. Der leitet doch dann 
die Befehle an den DS18B20 weiter, dass ist doch richtig so oder? Sobald 
dann der READ Scratchpad-Befehl gelaufen ist müsste ich das Ergebnis 
doch beim DS2482-100 auslesen können oder?

Ich weiß dass sind eine ganze Menge Fragen aber ich sitze jetzt schon 
eine ganze Weile an dem Problem, genau genommen knapp 3 Wochen und komme 
einfach nicht weiter. Weiß vielleicht jemand von euch wie ich dass 
machen muss?

Ich bin dankbar für jede Idee bzw. jeden Hinweis den ihr mir geben 
könnt. Ich habe schon so viel im Internet gesucht, mir fällt einfach 
nichts mehr ein wo ich noch suchen soll bzw. welche Suchbegriffe ich 
noch verwenden soll :(.

von Moritz (Gast)


Lesenswert?

Hi,
habe mich auch kürzlich mit dem DS2482 bzw. DS18B20 beschäftigt. Habe da 
zwar noch ärger mit der parasitären Stromversorgung, aber ganz andere 
Baustelle.

Schau dir mal im Datenblatt vom DS2482 ab Seite 18 an. Hier ist 
beschrieben, welche Befehle du über I2C senden musst, damit er z.B. ein 
Byte über 1-Wire rausschickt.

Du willst z.B. alle Sensoren anweisen, eine Messung durchzuführen. Der 
allererste Schritt ist das Initialisieren vom DS2482. Du Sendest also 
ein

I2C_start, Adresse + Write (Write ist 0, also direkt die Adresse), 
DS-Reset, I2C_stop

Das sollte dann z.B. so aussehen

i2cset -y 0 0x30 0xF0

Jetzt musst du das Teil konfigurieren, also Statusregister setzen. Das 
Teil soll auf normaler geschwindigkeit mit Active-Pull-Up laufen, das 
Byte für das Control-Register ist damit 11100001 -> E1 (die vorderen 4 
Bit sind die hinteren 4 invertiert, Bit 5 ist immer 1, Bit 1 ist immer 
0)

Das Konfigurationsregister des DS2482 ist 0xD2

also i2cset -y 0 0x30 0xD2 0xE1


Als nächstes möchtest du die Temperaturmessung anwerfen...
Dazu musst du dem 1-Wire-Sensor ein Skip ROM 0xCC und dann ein convert_t 
0x44 schicken. Das Senden von 1-wire-Bytes geht mit dem DS2482 über den 
OW-Write-Byte-Befehl 0xA5

ic2set -y 0 0x30 0xA5 0xCC
i2cset -y 0 0x30 0xA5 0x44

Schließlich nach einer kleinen Pause noch auslesen. Entweder du ließt 
über Match-Rom aus 0x55 oder wieder über Skip-Rom, wenn du nur einen 
Sensor hast.

Bei Match-Rom musst du dann die 8-Byte ROM-ID einzeln verschicken, 
danach den Read Scratch-Pad-Befehl 0xBE

ic2set -y 0 0x30 0xA5 0x55 # Match ROM
ic2set -y 0 0x30 0xA5 0x28 # Family Code DS28B20
ic2set -y 0 0x30 0xA5 <1. Byte Adresse>
.... und die weiteren 8 Byte
ic2set -y 0 0x30 0xA5 0xBE # Read Scratch-Pad

und jetzt 9x
ic2set -y 0 0x30 0x96      # 1-wire receive byte
i2cget -y 0 0x30 0xE1      # Read Register 0xE1 <- hier ist das 1. byte 
aus scratch pad

Danach hast du alles ausgelesen...

Hoffe das Hilft dir etwas weiter, sonst wie gesagt im Datenblatt stehen 
ein Haufen Befehlssequenzen...

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.