Forum: Mikrocontroller und Digitale Elektronik atmega 328 und MPU 9150


von Philipp E. (flederfish)


Angehängte Dateien:

Lesenswert?

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
Noch kein Account? Hier anmelden.