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
Moin, >Oder mir kurz erklären wie ich die Genauigkeit ändere? indem Du einen Blick in das Datenblatt zum DS1631 wirfst.
> 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...
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...
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
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...
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.
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?
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.