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:
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
Die "Skalierung" am Ende der Routine muss eventuell nicht sein, wenn die Algorithmen entsprechend angepasst werden.
Lesezeichen