Hi Chris,
104 als Antwort vom MPU ist korrekt.
In der Leseroutine (Read_MPU() solltest du um Zeit zu sparen die Tatsache ausnutzen, dass die ACC- und die Gyro-Register jeweils ohne Lücke hintereinander liegen.
Das machst du, indem du das Startregister für X ACC vorgibst und dann alle 6 Werte hintereinander mit I2rbyte xxx, Ack , #2 einliest.
Erst beim zweiten Byte von Z ACC kommt der Lesebefehl mit Nack und anschließendem I2Stop.
Da wir die Z-Achse nicht verwenden, kannst du weitere 2 Leseops sparen, indem du schon bei Y ACC aufhörst.
Bei den Gyros genauso, aber da der Tempsensor dazwischen liegt, muss leider hier neu aufgesetzt werden.
[edit]
Für den Mega328p sieht das konkret so aus:
Die "Skalierung" am Ende der Routine muss eventuell nicht sein, wenn die Algorithmen entsprechend angepasst werden.Code:'===Read MPU-6050=============================================================== Sub Read_mpu '==All registers are read in one burst read operation, so FIFO has to be enabled ' wir müssten auf den FIFO-Interrupt warten und dann burst-lesen, aber der INT ist nicht verdrahtet :-( ' also kein burst mode zum Lesen '==Read only 2 really used ACC-Axis from MPU-6050== I2cstart 'start condition I2cwbyte Mpuaddw 'write adress of MPU-6050 I2cwbyte 59 'Register 59 ACCEL_XOUT_H I2cstart 'repeated start I2cwbyte Mpuaddr 'read adress of MPU-6050 I2crbyte Meas_accy(2) , Ack 'read byte ACCEL_XOUT_H (Reg 59) I2crbyte Meas_accy(1) , Ack 'read byte ACCEL_XOUT_L (Reg 60) I2crbyte Meas_accx(2) , Ack 'read byte ACCEL_YOUT_H (Reg 61) I2crbyte Meas_accx(1) , Nack 'read byte ACCEL_YOUT_L (Reg 62) I2cstop 'stop condition '==Read all 3 Gyro-Axis from MPU-6050== I2cstart 'start condition I2cwbyte Mpuaddw 'write adress of MPU-6050 I2cwbyte 67 'Register 67 GYRO_XOUT_H I2cstart 'repeated start I2cwbyte Mpuaddr 'read adress of MPU-6050 I2crbyte Meas_gyrox(2) , Ack 'read byte GYRO_XOUT_H (Reg 67) I2crbyte Meas_gyrox(1) , Ack 'read byte GYRO_XOUT_L (Reg 68) I2crbyte Meas_gyroy(2) , Ack 'read byte GYRO_YOUT_H (Reg 69) I2crbyte Meas_gyroy(1) , Ack 'read byte GYRO_YOUT_L (Reg 70) I2crbyte Meas_gyroz(2) , Ack 'read byte GYRO_ZOUT_H (Reg 71) I2crbyte Meas_gyroz(1) , Nack 'read byte GYRO_ZOUT_L (Reg 72) I2cstop 'stop condition Get_gyrox = Get_gyrox / 64 ' auf 10 bit schrumpfen Get_gyroy = Get_gyroy / 64 ' auf 10 bit schrumpfen Get_gyroz = Get_gyroz / 64 ' auf 10 bit schrumpfen Get_gyroy = Get_gyroy + 434 ' (512 - 68) die gelesenen Werte in die Nähe von 512 skalieren Get_gyrox = Get_gyrox + 589 ' (512 + 77) damit Willas Algorithmen stimmen Get_gyroz = Get_gyroz + 464 ' (512 - 48) Get_accx = Get_accx / 64 ' auf 10 bit schrumpfen Get_accy = Get_accy / 64 ' auf 10 bit schrumpfen Get_accx = Get_accx + 500 ' (512 +- xx) die gelesenen Werte in die Nähe von 512 skalieren Get_accy = Get_accy + 500 ' (512 +- xx) damit Willas Algorithmen stimmen End Sub







Zitieren


Lesezeichen