Forum: Mikrocontroller und Digitale Elektronik DS1631 Auflösung umschalten


von Carsten (Gast)


Lesenswert?

Hallo,

ich habe mal wieder Probleme mit meinem DS1631 und hoffe iihr könnt mir 
nochmal helfen.

Die Kommunikation über I2C mit meinem ATMega2561 läuft und ich kann 
beide Temperaturregister auslesen. Dazu habe ich den Code von Peter 
Fleury genommen.

Laut Datenblatt sollen Ro und R1 nach dem Power Up "1" sein, also sollte 
ich eine 12 Bit Auflösung erhalten. Zurzeit habe ich aber nur eine 9 Bit 
Auflösung.

Die Initilaliesrung mach ich wie folgt
1
void DS1631_init(void)
2
{
3
  i2c_init();
4
  i2c_start(DS1631_ADDRESS + I2C_WRITE);    // 0x90
5
  i2c_write(0xAC);                          // Access Config
6
  i2c_write(0x08);                          // nur R0 und R1 setzen
7
  i2c_stop();
8
  _delay_ms(200);
9
}

Und das Auslesen der Temperatur
1
int16_t DS1631_temperatur(void)
2
{
3
4
  i2c_start(DS1631_ADDRESS + I2C_WRITE);
5
  i2c_write(0xAA);                          // Read Temp
6
  i2c_stop();
7
  i2c_start(DS1631_ADDRESS + I2C_READ);
8
  temperatur = i2c_readAck();              // MS Byte lesen
9
  temperatur = temperatur<<8;              // Bit shift 8 nach links
10
  temperatur |= i2c_readNak();             // LS Byte lesen
11
  return temperatur;
12
}

Wo habe ich meinen Gedankenfehler?
Es scheint ehal zu sein ob ich die R0 und R1 setzte oder nicht, ich 
erhalte immer 9 Bit anstatt 12 Bit. Auch ein Neustart des DS1631 von 
Hand vor dem Init hat nicht geholfen.

Gruß
Carsten

von Marco F. (m8_killer)


Lesenswert?

hallo, ich initialisiere meinen ds1631 wie folgt:
1
void ds1631_init(void)
2
{
3
    // DS1631 Configurieren, continuous conversion
4
    // 12Bit Auflösung
5
    i2c_start_wait(DS1631_W);
6
    i2c_write(0xAC);
7
    i2c_write(0x0C);
8
    i2c_stop();
9
  _delay_ms(10);
10
    i2c_start_wait(DS1631_W);
11
    i2c_write(0xA1);
12
    i2c_write(0x28);
13
    i2c_write(0x00);
14
    i2c_stop();
15
  _delay_ms(10);
16
    i2c_start_wait(DS1631_W);
17
    i2c_write(0xA2);
18
    i2c_write(0x0A);
19
    i2c_write(0x00);
20
    i2c_stop();
21
  _delay_ms(10);
22
    i2c_start_wait(DS1631_W);
23
    i2c_write(0x51);
24
    i2c_stop();
25
}

0xA1 ist die adresse für Temp High, 0xA2 entsprechend für Temp-Low
jeweils 2 Byte
0xAC ist das Config.-Register; der wert 0x0c stellt R1 und R2 auf 
1(High)
und Continuirliches Messen. 0x51 startet den messvorgang.

bei mir funzt es in einem ATmega32 mit der i2c-lib von Peter Fleury

von Marco F. (m8_killer)


Lesenswert?

Hallo,

ich nochmal. schau mal bei maxim vorbei, in der appnote 135 steht eine 
gute beschreibung wie der ds1631 konfiguriert wird. kannste als pdf 
herunterladen.

http://www.maxim-ic.com/app-notes/index.mvp/id/135

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.