hey,
ich versuche schon seit einigen Tagen den MPU9150 von invensense mit dem
atmega 328 anzusteuern.
Programmiert wird das Teil in Atmelstudio (neuste version).
Ich nutze den Arduino Bootloader und lade die Hexfile mit xloader auf
den atmega.
Soweit so gut, ich bekomme aber immer konstante werte für alle achsen.
Die Werte ändern sich nach jedem reset, bleiben dann aber konstant.
In den Tiefen des Internets habe ich einen funktionierenden Beispielcode
für die Arduino IDE gefunden die mir die richtigen Werte liefert.
Der konstante Wert aus meinem Code stimmt ungefähr mit den Offsetwerten
aus dem Beispielcode überein.
Daraus habe ich gefolgert, dass entweder kein neuer Wert in die Register
des Sensors geladen wert(kann das sein? der beispiel code geht ja mit
der selbe initalisierung), oder mit der i2c kommunikation läuft etwas
schief
Ich habe die selben Einstellungen wie im Beispielcode verwenden. Für
die kommunikation nutze ich die i2c library von peter fleury.
ich habe die gesamten dateien angehängt hoffe es ist alles übersichtlich
genug...
Hier der relevante teile des Codes:
while (1)
{
i2c_start_wait(MPU9150_ADDRESS);
i2c_write(MPU9150_GYRO_XOUT_H);
i2c_rep_start(MPU9150_ADDRESS | 1);
int f = i2c_readAck() << 8 | i2c_readAck();
sprintf(stest,"%i\n",f);
uart_puts(stest);
}
der sensor wird wie folgt initialisiert:
void imu_init(void)
{
//WAKEUP
i2c_start(MPU9150_ADDRESS);
i2c_write(MPU9150_PWR_MGMT_1);
i2c_write(0);
i2c_stop();
//INIT COMPASS
//power down mode
i2c_start(MPU9150_CMPS_ADDRESS);
i2c_write(0x0A);
i2c_write(0x00);
//selftest
i2c_rep_start(MPU9150_CMPS_ADDRESS);
i2c_write(0x0A);
i2c_write(0x0F);
//power down mode
i2c_rep_start(MPU9150_CMPS_ADDRESS);
i2c_write(0x0A);
i2c_write(0x00);
//wait for data at slave0
i2c_rep_start(MPU9150_ADDRESS);
i2c_write(0x24);
i2c_write(0x40);
//Set i2c address at slave0 at 0x0C
i2c_rep_start(MPU9150_ADDRESS);
i2c_write(0x25);
i2c_write(0x8C);
//Set where reading at slave 0 starts
i2c_rep_start(MPU9150_ADDRESS);
i2c_write(0x26);
i2c_write(0x02);
//set offset at start reading and enable
i2c_rep_start(MPU9150_ADDRESS);
i2c_write(0x27);
i2c_write(0x88);
//set i2c address at slv1 at 0x0C
i2c_rep_start(MPU9150_ADDRESS);
i2c_write(0x28);
i2c_write(0x0C);
//Set where reading at slave 1 starts
i2c_rep_start(MPU9150_ADDRESS);
i2c_write(0x29);
i2c_write(0x0A);
//Enable at set length to 1
i2c_rep_start(MPU9150_ADDRESS);
i2c_write(0x2A);
i2c_write(0x81);
//overvride register
i2c_rep_start(MPU9150_ADDRESS);
i2c_write(0x64);
i2c_write(0x01);
//set delay rate
i2c_rep_start(MPU9150_ADDRESS);
i2c_write(0x67);
i2c_write(0x03);
//wtf??
i2c_rep_start(MPU9150_ADDRESS);
i2c_write(0x01);
i2c_write(0x80);
//set i2c slv4 delay
i2c_rep_start(MPU9150_ADDRESS);
i2c_write(0x34);
i2c_write(0x04);
//override register
i2c_rep_start(MPU9150_ADDRESS);
i2c_write(0x64);
i2c_write(0x00);
//clear usr setting
i2c_rep_start(MPU9150_ADDRESS);
i2c_write(0x6A);
i2c_write(0x00);
//override register
i2c_rep_start(MPU9150_ADDRESS);
i2c_write(0x64);
i2c_write(0x01);
//enable master i2c mode
i2c_rep_start(MPU9150_ADDRESS);
i2c_write(0x6A);
i2c_write(0x20);
//disable slv4
i2c_rep_start(MPU9150_ADDRESS);
i2c_write(0x34);
i2c_write(0x13);
i2c_stop();
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.