Hallo zusammen,
ich versuche den Temperatur Sensor DS1621 via I2C zum laufen zu bringen, aber irgendwas mache ich falsch.
Hier erstmal der Code:
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
Lesezeichen