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();
:
Bearbeitet durch User
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.