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







Zitieren

Lesezeichen