Hallo RN-Gemeinde!
Habe hier einen HMC5883L und möchte diesen über I2C auslesen. Ich verwende dazu die I2C-Lib von P. Fleury.
Mein Code sieht folgendermaßen aus:
Wenn ich nun in mein Terminal schaue, bekomme ich nur das "Initializing HMC5883L..." ein "Done!" wird nicht gesendet, er bleibt also aus irgendeinem Grund in der Funktion init_HMC5883L hängen und ich sehe nicht warum.Code:#ifndef F_CPU #define F_CPU 16000000UL #endif #include <avr/io.h> #include <stdlib.h> #include <util/delay.h> #include "twimaster.c" #define HMC5883L 0x1E // device address int16_t raw_x = 0; int16_t raw_y = 0; int16_t raw_z = 0; char buffer[10]; void init_HMC5883L(void){ sendUSART("Initializing HMC5883L..."); i2c_start(HMC5883L+I2C_WRITE); i2c_write(0x00); // set pointer to CRA i2c_write(0x70); // write 0x70 to CRA i2c_stop(); i2c_start(HMC5883L+I2C_WRITE); i2c_write(0x01); // set pointer to CRB i2c_write(0xA0); i2c_stop(); i2c_start(HMC5883L+I2C_WRITE); i2c_write(0x02); // set pointer to measurement mode i2c_write(0x00); // continous measurement i2c_stop(); sendUSART("Done!"); } void getHeading(void){ i2c_start_wait(HMC5883L+I2C_WRITE); i2c_write(0x06); i2c_stop(); i2c_rep_start(HMC5883L+I2C_READ); raw_x = (raw_x << 8) | i2c_readAck(); raw_x |= i2c_readAck(); raw_z = (raw_z << 8) | i2c_readAck(); raw_z |= i2c_readAck(); raw_y = (raw_y << 8) | i2c_readAck(); raw_y |= i2c_readNak(); i2c_stop(); i2c_rep_start(HMC5883L+I2C_WRITE); i2c_write(0x03); i2c_stop(); } void init_USART(void) { UCSRB |= (1<<TXEN); //UART TX (Transmit - senden) einschalten UCSRC |= (1<<URSEL)|(3<<UCSZ0); //Modus Asynchron 8N1 (8 Datenbits, No Parity, 1 Stopbit) UBRRH = 0; //Highbyte ist 0 UBRRL = 103; //Lowbyte ist 103 (dezimal) -> (Frequenz_in_Hz / (Baudrate * 16)) - 1 <- Quarfrequenz = 16*1000*1000 Hz!!!! } void sendchar(unsigned char c) { while(!(UCSRA & (1<<UDRE))) //Warten, bis Senden möglich ist { } UDR = c; //schreibt das Zeichen aus 'c' auf die Schnittstelle } void sendUSART(char *s) //*s funktiniert wie eine Art Array - auch bei einem String werden die Zeichen (char) einzeln ausgelesen - und hier dann auf die Sendeschnittstelle übertragen { while(*s) { sendchar(*s); s++; } } int main(void){ init_USART(); i2c_init(); init_HMC5883L(); while(1){ getHeading(); itoa(raw_x, buffer, 10); sendUSART("Raw X: "); sendUSART(buffer); sendchar('\n'); itoa(raw_y, buffer, 10); sendUSART("Raw Y: "); sendUSART(buffer); sendchar('\n'); itoa(raw_z, buffer, 10); sendUSART("Raw Z: "); sendUSART(buffer); sendchar('\n'); _delay_ms(67); } }
Nun ist es auch so, dass ich noch nicht sonderlich viel mit I2C gemacht habe aber ich würde schon gerne wissen, was ich falsch mache, da ich auch andere Sensoren/Bausteine über I2C ansteuern möchte.
MfG und einen guten Rutsch!
Torrentula







Zitieren
Lesezeichen