Forum: Mikrocontroller und Digitale Elektronik DS1631 in 12bit genau auslesen


von Jo H. (haveaniceday)


Lesenswert?

Hallo zusammen,
ich probiere momentan meinen DS1631 via I2C (von Peter Fleury) so genau 
wie möglich (via 12bit, also mit 0,0625° Genauigkeit auszulesen. Dabei 
ist es nicht von Bedeutung dass diese Sensoren mit einer Genauigkeit von 
0,5° Ausgeliefert werden, da es mir bei dieser Sache primär um die 
Schwankung der Temperatur geht...
Kann mir evtl. jemand nen Beispiel-Code in C, für das auslesen des 
DS1631 mit einer solchen Genauigkeit zur Verfügung stellen? Oder mir 
kurz erklären wie ich die Genauigkeit ändere?

Vielen Dank schon mal

von Schlaf Loser (Gast)


Lesenswert?

Moin,

>Oder mir kurz erklären wie ich die Genauigkeit ändere?

indem Du einen Blick in das Datenblatt zum DS1631 wirfst.

von Jo H. (haveaniceday)


Lesenswert?

> indem Du einen Blick in das Datenblatt zum DS1631 wirfst.
Danke für die Antwort... Habe ich bereits gemacht.
Mir ist bewusst das ich die Registerbits R1 und R0 auf high oder low 
setzen muss, um die Auflösung der Messgenauigkeit zu ändern, allerdings 
ist für mich nicht aus dem Datenblatt ersichtlich wie ich es an den 
Sensor schicke, bzw. wie ich diese bits setze...

von Justus S. (jussa)


Lesenswert?

Jo Hannes wrote:

> allerdings
> ist für mich nicht aus dem Datenblatt ersichtlich wie ich es an den
> Sensor schicke, bzw. wie ich diese bits setze...

erst das passende Control Byte schicken, dann das Command "Access 
config", dann den Wert für das Configuration Register ...steht genau so 
im Datenblatt...

von Jo H. (haveaniceday)


Lesenswert?

Ok, für jemanden der sich damit auskennt oder schon mal gemacht hat ist 
es leicht aus dem Datenblatt zu erkennen, für mich allerdings leider 
nicht.
Ich verstehe nicht, wie ich das R0 und R1 Register setze.
Momentan initialisiere ich folgender maßen den Sensor:
1
#define GETTEMP 0xAA         
2
#define I2CTHERMO 0x90       
3
#define STARTCONVERT 0x51 
4
...
5
   i2c_init();
6
   i2c_start(I2CTHERMO+I2C_WRITE);             //Sensor ansprechen
7
   i2c_write(STARTCONVERT);     //Temperatur Umwandeln
8
   i2c_stop();
Um die Genauigkeit zu ändern muss neben dem "STARTCONVERT" die Codierung 
für R0 und R1 geschickt werden.
Aber wie setzt sich diese zusammen? Wenn ich es dem Datenblatt richtig 
entnehme sind R1 und R0 in diesem CONFIGURATION REGISTER
einzustellen, nur weiß ich nicht wie die anderen Register zu setzen 
sind. Kann sie ja nicht alle auf 0 setzen, oder?
1
 MSb  bit6  bit5  bit4  bit3  bit2  bit1  LSb
2
DONE  THF   TLF   NVB   R1    R0    POL*  1SHOT*

00001000 also in Hex 08.


1
#define GETTEMP        0xAA         
2
#define I2CTHERMO      0x90       
3
#define STARTCONVERT   0x51 
4
5
#define ACCESSCONFIG   0xAC
6
#define CONFIGREGISTER 0x08
7
...
8
   i2c_init();
9
   i2c_start(I2CTHERMO+I2C_WRITE);             //Sensor ansprechen
10
11
   i2c_write(ACCESSCONFIG+CONFIGREGISTER+STARTCONVERT);     
12
   i2c_stop();

Kann ich das so machen?

Danke

von Justus S. (jussa)


Lesenswert?

Jo Hannes wrote:


> Kann ich das so machen?

Nein, die Funktion i2c_write() schreibt immer nur ein Byte, sie muss 
also mehrmals aufgerufen werden. Und das Startconvert brauchst du beim 
Einstellen des Konfigurationsregisters eh nicht.

Wegen dem Config-Byte: die Read-Only-Werte interessieren beim Einstellen 
nicht, die Thermostat-Funktion scheinst du nicht zu benutzen, so dass 
außer R1 und R0 doch eh nur 1Shot für dich von Interesse ist...

von Jo H. (haveaniceday)


Lesenswert?

Aber vom Ansatz her richtig? Dann bin ich ja schon mal froh :)

Dann müsste es also folgendermaßen aussehen:
1
#define GETTEMP        0xAA         
2
#define I2CTHERMO      0x90       
3
#define STARTCONVERT   0x51 
4
#define ACCESSCONFIG   0xAC
5
#define CONFIGREGISTER 0x08
6
...
7
   i2c_init();
8
   i2c_start(I2CTHERMO+I2C_WRITE);             //Sensor ansprechen
9
   i2c_write(ACCESSCONFIG);   
10
   i2c_write(CONFIGREGISTER);     
11
   i2c_write(STARTCONVERT);       
12
   i2c_stop();

richtig?

Wenn ich das mit dem 1SHOT richtig verstanden hab, kann man darüber nur 
bestimmen, ob der Sensor dauerhaft messen soll, oder nur wenn er 
angesprochen wird...

>Thermostat-Funktion scheinst du nicht zu benutzen
Nein, das ist richtig. Die Temperatur wird im Programm selber 
verarbeitet.

von Jo H. (haveaniceday)


Lesenswert?

Hallo zusammen,
ich brauche noch mal bissel Hilfe bezüglich des setzen der Registerbits 
beim DS1631.
Wie oben im Beispiel-Code initialisiere ich momentan den Sensor, also:
1
   i2c_init();
2
   i2c_start(I2CTHERMO+I2C_WRITE);             //Sensor ansprechen
3
   i2c_write(ACCESSCONFIG);   
4
   i2c_write(CONFIGREGISTER);     
5
   i2c_write(STARTCONVERT);       
6
   i2c_stop();

Funktioniert auch soweit. Wenn ich die Spannung aber jetzt weg schalte 
und wieder zu, kommt es anscheinend zu Initialisierungs-Fehlern, so das 
der Sensor nur noch 196.0 anzeigt.
Erst wenn ich ihn wieder mit nem anderen Code mit einer anderen 
Initialisierung Programmiere, also:
1
   i2c_init();
2
   i2c_start(I2CTHERMO+I2C_WRITE);             //Sensor ansprechen
3
   i2c_write(STARTCONVERT);       
4
   i2c_stop();
zeigt er wieder richtig an.

Darf ich die Registerbits nicht bei jedem Start setzen? Also reicht es 
wenn sie einmal gesetzt wurden?

von Ali B. (Firma: FH) (holzer)


Lesenswert?

Es ist ein Register-BYTE kein bit. Wenn ich es richtig verstanden habe 
sendest du also mit

Jo Hannes schrieb:
> #define CONFIGREGISTER 0x08

eine 00001000.
Laut datenblatt müssen aber  R0 UND R1 auf 1 gesetzt werden, was da 
wäre: 00001100 - in HEX: 0xe. Man möge mich Aufklären wenn ich falsch 
liege,ich lese mich gerade erst ein und es funzt bei mir nämlich so noch 
nicht.

von Route_66 (Gast)


Lesenswert?

Hallo!
Ali Bombastic schrieb:
> wäre: 00001100 - in HEX: 0xe.

HEX-Umrechnung mußt Du noch lernen:
00001100 - in HEX: 0x0C!

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.