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

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.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.