DS1631 Auflösung umschalten

Gast #1971678
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
#1983482
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren