Forum: Mikrocontroller und Digitale Elektronik DS1621 am Raspberry Pi - (fast) alles funktioniert


von J. K. (jo_ku)


Lesenswert?

Hallo liebe Forenmitglieder und Gäste,

ein rätselhaftes Problem plagt mich und hindert mich auf dem letzten 
Meter einen einfachen Heizregler fertig zu stellen.

Ich bin nach dieser Anleitung vorgegangen:
http://chemdroid.net/en/raspberry-pi/29-ds1621-temperature-sensor

Ich kann
- die Temperaturmessung starten (Register 0xEE)
- das Messergebnis ausgeben (0xAA),
- das Konfigurationsregister lesen und schreiben (0xAC),
alles funktioniert wie auf der verlinkten Seite.

Was allerdings nicht funktioniert ist die Einstellung der 
Thermostatschwellen (Register 0xA1 und 0xA2), egal ob ich 1 oder 2 Byte 
schreibe. Am Anfang waren die Schwellen 0x0F und 0x0A.

Das heißt, ich kann meine Temperaturschwellen scheinbar nicht ändern. 
Besser gesagt, nach einigen Versuchen sind beide zu 0 geworden.

Wenn ich das Bit "POL" für die Polarität des Ausgangs (active high oder 
low) ändere, schaltet das am Ausgang angeschlossene Relais (ja, mit 
Transistor, Basisvorwiderstand und Freilaufdiode).

Alles plausibel und aus der Shell bedienbar - warum kann ich die 
Temperaturschwellen-Register nicht beschreiben??? Ich habe auch einen 
zweiten DS1621 getestet, Verhalten ist exakt gleich.

Hier meine Versuche:

[code]
Anfangszustand:
pi@raspberrypi ~ $ sudo i2cget -y 1 0x4f 0xa1
0x0f
pi@raspberrypi ~ $ sudo i2cget -y 1 0x4f 0xa2
0x0a

Konfigurationsregister:
pi@raspberrypi ~ $ sudo i2cget -y 1 0x4f 0xac
0x8c

Temperaturregister ohne dass Messung gestartet wurde:
pi@raspberrypi ~ $ sudo i2cget -y 1 0x4f 0xaa
0xc4

Schreiben und Auslesen der Temperaturschwellen:
pi@raspberrypi ~ $ sudo i2cset -y 1 0x4f 0xa1 0x1a
pi@raspberrypi ~ $ sudo i2cget -y 1 0x4f 0xa1
0x0f
pi@raspberrypi ~ $ sudo i2cget -y 1 0x4f 0xa1
0x0f
pi@raspberrypi ~ $ sudo i2cget -y 1 0x4f 0xa1 w
0x000f
pi@raspberrypi ~ $ sudo i2cset -y 1 0x4f 0xa2 0x19
pi@raspberrypi ~ $ sudo i2cget -y 1 0x4f 0xa2
0x0a
pi@raspberrypi ~ $ sudo i2cget -y 1 0x4F 0xA2
0x0a

Start der Messung:
pi@raspberrypi ~ $ sudo i2cget -y 1 0x4F 0xEE
0x0f

Temperatur ist 22,5 °C und steigt:
pi@raspberrypi ~ $ sudo i2cget -y 1 0x4F 0xAA w
0x8016
pi@raspberrypi ~ $ sudo i2cget -y 1 0x4F 0xAA w
0x8017
pi@raspberrypi ~ $ sudo i2cget -y 1 0x4F 0xAA w
0x8019
pi@raspberrypi ~ $ sudo i2cget -y 1 0x4F 0xAA w
0x001a
pi@raspberrypi ~ $ sudo i2cget -y 1 0x4F 0xAA w
0x001b

Lesen und schreiben des Konfigurationsregisters:
pi@raspberrypi ~ $ sudo i2cget -y 1 0x4F 0xAC
0x4c
pi@raspberrypi ~ $ sudo i2cset -y 1 0x4F 0xAC 0x02
pi@raspberrypi ~ $ sudo i2cget -y 1 0x4F 0xAC
0x42

Ändern des Bits "POL" im Konfigurationsregister - das Relais an Tout 
schaltet dabei:
pi@raspberrypi ~ sudo i2cset -y 1 0x4F 0xAC 0x00
pi@raspberrypi ~ $ sudo i2cset -y 1 0x4F 0xAC 0x02
pi@raspberrypi ~ $ sudo i2cset -y 1 0x4F 0xAC 0x0
pi@raspberrypi ~ $ sudo i2cset -y 1 0x4F 0xAC 0x02

Zu guter Letzt noch Registerdumps:
pi@raspberrypi ~ $ sudo i2cdump -y 1 0x4f
No size specified (using byte-data access)
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef
00: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX
10: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX
20: XX XX 00 XX XX XX XX XX XX XX XX XX XX XX XX XX    XX.XXXXXXXXXXXXX
30: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX
40: 00 00 00 00 00 00 00 00 04 10 16 16 4e 04 04 04    ........????N???
50: XX 00 XX XX XX XX XX XX XX XX XX XX XX XX XX XX    X.XXXXXXXXXXXXXX
60: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX
70: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX
80: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX
90: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX
a0: XX 00 00 XX XX XX XX XX 0c 10 c4 XX 8e XX XX XX    X..XXXXX???X?XXX
b0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX
c0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX
d0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX
e0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX 08 XX    XXXXXXXXXXXXXX?X
f0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX
pi@raspberrypi ~ $ sudo i2cdump -y 1 0x4f w
     0,8  1,9  2,a  3,b  4,c  5,d  6,e  7,f
00: XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX
08: XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX
10: XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX
18: XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX
20: XXXX XXXX 0000 XXXX XXXX XXXX XXXX XXXX
28: XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX
30: XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX
38: XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX
40: 0000 0000 0000 0000 0000 0000 0000 0000
48: 0004 0010 8016 8016 004e e004 e004 e004
50: XXXX 0000 XXXX XXXX XXXX XXXX XXXX XXXX
58: XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX
60: XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX
68: XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX
70: XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX
78: XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX
80: XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX
88: XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX
90: XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX
98: XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX
a0: XXXX 0000 0000 XXXX XXXX XXXX XXXX XXXX
a8: 000c 0010 00c4 XXXX 008e XXXX XXXX XXXX
b0: XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX
b8: XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX
c0: XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX
c8: XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX
d0: XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX
d8: XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX
e0: XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX
e8: XXXX XXXX XXXX XXXX XXXX XXXX e008 XXXX
f0: XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX
f8: XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX

[\code]

Ich vermute, dass es etwas mit "Repeated Start" zu tun hat - das kann 
der BCM2835 anscheinend nicht. Aber warum geht sonst alles?

Grüße, Jonas

von J. K. (jo_ku)


Lesenswert?

Hallo,

ich freue mich sehr euch mitteilen zu können, dass ich mein Problem 
gerade gelöst habe!

Durch diese Seite:
http://kampis-elektroecke.de/?page_id=2035
kam ich darauf, den Befehl um ein i zu erweitern. Ich bin jetzt etwas zu 
müde um das auseinanderzunehmen, sorry. Ich verstehe auch nicht komplett 
was da passiert.

So sehen meine Befehle aus:

pi@raspberrypi ~ $ sudo i2cset -y 1 0x4f 0xa2 0x1b 0x00 i
pi@raspberrypi ~ $ sudo i2cget -y 1 0x4f 0xa2
0x1b
pi@raspberrypi ~ $ sudo i2cget -y 1 0x4f 0xa2 w
0x001b
pi@raspberrypi ~ $ sudo i2cset -y 1 0x4f 0xa2 0x19 0x00 i
pi@raspberrypi ~ $ sudo i2cget -y 1 0x4f 0xa2 w
0x0019
pi@raspberrypi ~ $ sudo i2cget -y 1 0x4f 0xa2
0x19


Wer in der Lage ist das zu interpretieren, der möge es bitte hier 
herniederschreiben um diese verrückte Welt ein bisschen besser zu 
machen. Danke.

von TomTom (Gast)


Lesenswert?

Danke vielmals für deinen Beitrag der mir extremst bei meinen ersten 
Gehversuchen mit dem I2C (und dem DS1621) geholfen hat!

Wenn du die Werte für TH und TL verändern möchtest musst du 2 Bytes 
zurück schreiben - darum das "i" am Schluss.

Zum Auslesen der beiden Bytes (also Grad als Ganzzahl und die 
"Kommastelle") hängst du abfragen das "w" an. Tust du das nicht bekommst 
du nur die Ganzzahl (ohne Kommastelle) zurück.

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.