mikrocontroller.net

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


Autor: Jo Hannes (haveaniceday)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Schlaf Loser (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Moin,

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

indem Du einen Blick in das Datenblatt zum DS1631 wirfst.

Autor: Jo Hannes (haveaniceday)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Justus Skorps (jussa)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Jo Hannes (haveaniceday)
Datum:

Bewertung
0 lesenswert
nicht 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:
#define GETTEMP 0xAA         
#define I2CTHERMO 0x90       
#define STARTCONVERT 0x51 
...
   i2c_init();
   i2c_start(I2CTHERMO+I2C_WRITE);             //Sensor ansprechen
   i2c_write(STARTCONVERT);     //Temperatur Umwandeln
   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?
 MSb  bit6  bit5  bit4  bit3  bit2  bit1  LSb
DONE  THF   TLF   NVB   R1    R0    POL*  1SHOT*

00001000 also in Hex 08.


#define GETTEMP        0xAA         
#define I2CTHERMO      0x90       
#define STARTCONVERT   0x51 

#define ACCESSCONFIG   0xAC
#define CONFIGREGISTER 0x08
...
   i2c_init();
   i2c_start(I2CTHERMO+I2C_WRITE);             //Sensor ansprechen

   i2c_write(ACCESSCONFIG+CONFIGREGISTER+STARTCONVERT);     
   i2c_stop(); 

Kann ich das so machen?

Danke

Autor: Justus Skorps (jussa)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Jo Hannes (haveaniceday)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Aber vom Ansatz her richtig? Dann bin ich ja schon mal froh :)

Dann müsste es also folgendermaßen aussehen:
#define GETTEMP        0xAA         
#define I2CTHERMO      0x90       
#define STARTCONVERT   0x51 
#define ACCESSCONFIG   0xAC
#define CONFIGREGISTER 0x08
...
   i2c_init();
   i2c_start(I2CTHERMO+I2C_WRITE);             //Sensor ansprechen
   i2c_write(ACCESSCONFIG);   
   i2c_write(CONFIGREGISTER);     
   i2c_write(STARTCONVERT);       
   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.

Autor: Jo Hannes (haveaniceday)
Datum:

Bewertung
0 lesenswert
nicht 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:
   i2c_init();
   i2c_start(I2CTHERMO+I2C_WRITE);             //Sensor ansprechen
   i2c_write(ACCESSCONFIG);   
   i2c_write(CONFIGREGISTER);     
   i2c_write(STARTCONVERT);       
   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:
   i2c_init();
   i2c_start(I2CTHERMO+I2C_WRITE);             //Sensor ansprechen
   i2c_write(STARTCONVERT);       
   i2c_stop(); 
zeigt er wieder richtig an.

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

Autor: Ali Bombastic (Firma: FH) (holzer)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Route_66 (Gast)
Datum:

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

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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.