PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Ich habe ein Problem mit dem DS1621



NemesisoD
25.09.2008, 12:46
Hallo zusammen,

ich versuche den Temperatur Sensor DS1621 via I2C zum laufen zu bringen, aber irgendwas mache ich falsch.

Hier erstmal der Code:



void main(void)
{
...
i2c_init();
...
i2c_start();
i2c_sendbyte(0x96,0xEE);
i2c_start();
...
while(1)
{
i2c_start();
i2c_sendbyte(0x96,0xAA);
i2c_start();
word = i2c_receivebyte(0x96);
i2c_stop();
}
}


void i2c_init(void)
{

// 100 kHz SCL bei 4MHz CPU
TWBR = 12;
TWSR = 0;
}

void i2c_start(void)
{
// I2C-Startbedingung
TWCR = (1<<TWINT) | (1<<TWSTA) | (1<<TWEN);
// Warten bis fertig ist
loop_until_bit_is_set(TWCR,TWINT);
}

void i2c_stop(void)
{
// Stoppe Übertragung
TWCR = (1<<TWINT) | (1<<TWSTO) | (1<<TWEN);
}

void i2c_sendbyte(uint8_t adresse,uint8_t byte)
{

// Schreibe zu Adresse
TWDR = (adresse & 0xFE);

// Senden
TWCR = (1<<TWINT) | (1<<TWEN);

// Warten bis fertig ist
loop_until_bit_is_set(TWCR,TWINT);


// Lege Daten an
TWDR = byte;

// Senden
TWCR = (1<<TWINT) | (1<<TWEN);

// Warten bis fertig ist
loop_until_bit_is_set(TWCR,TWINT);

}

uint16_t i2c_receivebyte(uint8_t adresse)
{
uint16_t data;
// Schreibe zu Adresse
TWDR = (adresse | 0xFF);

// Senden
TWCR = (1<<TWINT) | (1<<TWEN);

// Warten bis fertig ist
loop_until_bit_is_set(TWCR,TWINT);

// Empfange Daten
TWCR = (1<<TWINT) | (1<<TWEN);

// Warten bis fertig ist
loop_until_bit_is_set(TWCR,TWINT);

data = (TWDR<<8);

// Empfange Daten
TWCR = (1<<TWINT) | (1<<TWEN) | (1<<TWEA);;

// Warten bis fertig ist
loop_until_bit_is_set(TWCR,TWINT);

data |= (TWDR);

// Empfange Daten
TWCR = (1<<TWINT) | (1<<TWEN) | (1<<TWEA);;

// Warten bis fertig ist
loop_until_bit_is_set(TWCR,TWINT);

return data;
}


Also laut Datenblatt muss ich erst 0xEE senden damit dieser mit dem Wandeln anfängt, und mit 0xAA kann ich anschließend 2 Bytes abholen.

Das Sensen scheint auch zu funktionieren, da er dort wieder rausläuft, aber wenn er in die Receive Routine geht, so hängt er sich auf.

Es wäre toll wenn mit jemand helfen könnte.

Gruß
Michael

linux_80
25.09.2008, 19:00
Hallo,

Du schreibst immer 0x96 als SlaveAdresse, beim lesen muss man das RW-Bit darin setzen, damit der Daten raus rückt.

Und ich glaub das mit dem | 0xFF kommt nicht gut in i2c_receivebyte, denn danach sind alle Bits gesetzt !

NemesisoD
25.09.2008, 20:32
Ah,

da ist also diese sch... kleine Fehler.
Dann ist mir auch klar das es nicht fuzt.

Danke für deine Antwort.