PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : HMC5883L auslesen



Torrentula
30.12.2011, 23:13
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:


#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);

}
}


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.

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