MPU-6050 MEMS 6-Achs-Sensor

    Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

    Aufgrund technischer Veränderungen ist der Mailverkehr innerhalb des Forums (Private Nachrichten) nur noch eingeschränkt möglich. Die Einschränkung ist notwendig, um zusätzliche Betriebskosten für das Forum zu vermeiden. Näheres zu den Hintergründen im Thread "Aktuelles zum Forum".Wir bitten um Verständnis.

    Hinweis kann nach Kenntnisnahme deaktiviert werden!

    • wolleausmallo schrieb:

      Lies bitte meinen ersten Post
      Das hat auch nichts mit dem I2Cinit zu tun sondern mit deiner zusätzlichen Do Loop.
      Es kann nun mal nur eine Hauptschleife geben. Weitere Do Loop Schleifen haben dann eine Bedingung zum Beenden eingebaut.
      Lass die einfach mal weg und schreibe nur Portb = 1.
      Eine Lösung habe ich nicht, aber mir gefällt Ihr Problem.
    • Der Code ist der Originalcode von Michael aus 2017, mit dem Unterschied, daß ich einen Atmega16L und Michael einen Atmega32 verwendet hat. Die unterscheiden sich aber nur in der Größe des Ram. Grob jedenfalls, denke ich.
      Der Code ohne meinen Loop läuft auch nicht. Ich habe sicherheitshalber noch einen Mega32 bestellt.

      1. 'Demo MEMS-Sensor MPU-6050 Beschleunigung auslesen
      2. 'Created with Bascom-AVR 2079 Michael Kinz 01/2017
      3. $regfile = "m32def.dat"
      4. $crystal = 8000000
      5. $hwstack = 32
      6. $swstack = 32
      7. $framesize = 24
      8. '-------- Init I2C --------
      9. $lib "I2C_TWI.LBX" 'Hardware I2C
      10. Config Scl = Portc.0
      11. Config Sda = Portc.1
      12. I2cinit
      13. Const W_addr = &HD0 'I2C Adresse MPU-6050
      14. Const R_addr = &HD1
      15. '-------- Init I/O ---------
      16. Ddra = 255 'Ausgang für Bandanzeige
      17. '--------- Init Variablen ------------
      18. Dim Register_adresse As Byte
      19. Dim Register(6) As Byte
      20. Dim Acc_x As Integer At Register(1) Overlay
      21. Dim Acc_y As Integer At Register(3) Overlay
      22. Dim Acc_z As Integer At Register(5) Overlay
      23. Dim Z As Byte 'Hilfsvariable für Forschleife
      24. Dim Temp As Integer 'Hilfsvariable zum Rechnen
      25. '---------- Init Sensor ---------
      26. Register_adresse = &H68 'Signalpath Reset
      27. I2cstart
      28. I2cwbyte W_addr
      29. I2cwbyte Register_adresse
      30. I2cwbyte &H07 'Reset Gyro + Acc + Temp
      31. I2cstop
      32. Waitms 10
      33. Register_adresse = &H6B 'Power Management Register
      34. I2cstart
      35. I2cwbyte W_addr
      36. I2cwbyte Register_adresse
      37. I2cwbyte &H01 'Sleep = 0, Clocksource X-Gyro
      38. I2cstop
      39. Waitms 10
      40. Do
      41. I2cstart
      42. I2cwbyte W_addr 'Adresse I2C schreiben
      43. Register_adresse = &H3B 'Registerbeginn Acceleration Daten
      44. I2cwbyte Register_adresse
      45. I2cstart
      46. I2cwbyte R_addr 'Adresse I2C lesen
      47. For Z = 1 To 6
      48. I2crbyte Register(z) , Ack
      49. Next
      50. I2crbyte Register(6) , Nack
      51. I2cstop
      52. Swap Acc_x 'die Register sind MSB first, AVR aber LSB first
      53. Swap Acc_y
      54. Swap Acc_z
      55. 'Ausgabe als Bandanzeige auf 8 LEDs an Port A
      56. Temp = Acc_y / 4096 'Reduzieren der Auflösung
      57. Select Case Temp
      58. Case 0 : Porta = &B00000000
      59. Case -1 : Porta = &B00010000
      60. Case -2 : Porta = &B00110000
      61. Case -3 : Porta = &B01110000
      62. Case Is < -3 : Porta = &B11110000
      63. Case 1 : Porta = &B00001000
      64. Case 2 : Porta = &B00001100
      65. Case 3 : Porta = &B00001110
      66. Case Is >= 4 : Porta = &B00001111
      67. End Select
      68. Loop
      69. End
      70. 'Demo MEMS-Sensor MPU-6050 Beschleunigung auslesen
      71. 'Created with Bascom-AVR 2079 Michael Kinz 01/2017
      72. $regfile = "m32def.dat"
      73. $crystal = 8000000
      74. $hwstack = 32
      75. $swstack = 32
      76. $framesize = 24
      77. '-------- Init I2C --------
      78. $lib "I2C_TWI.LBX" 'Hardware I2C
      79. Config Scl = Portc.0
      80. Config Sda = Portc.1
      81. I2cinit
      82. Const W_addr = &HD0 'I2C Adresse MPU-6050
      83. Const R_addr = &HD1
      84. '-------- Init I/O ---------
      85. Ddra = 255 'Ausgang für Bandanzeige
      86. '--------- Init Variablen ------------
      87. Dim Register_adresse As Byte
      88. Dim Register(6) As Byte
      89. Dim Acc_x As Integer At Register(1) Overlay
      90. Dim Acc_y As Integer At Register(3) Overlay
      91. Dim Acc_z As Integer At Register(5) Overlay
      92. Dim Z As Byte 'Hilfsvariable für Forschleife
      93. Dim Temp As Integer 'Hilfsvariable zum Rechnen
      94. '---------- Init Sensor ---------
      95. Register_adresse = &H68 'Signalpath Reset
      96. I2cstart
      97. I2cwbyte W_addr
      98. I2cwbyte Register_adresse
      99. I2cwbyte &H07 'Reset Gyro + Acc + Temp
      100. I2cstop
      101. Waitms 10
      102. Register_adresse = &H6B 'Power Management Register
      103. I2cstart
      104. I2cwbyte W_addr
      105. I2cwbyte Register_adresse
      106. I2cwbyte &H01 'Sleep = 0, Clocksource X-Gyro
      107. I2cstop
      108. Waitms 10
      109. Do
      110. I2cstart
      111. I2cwbyte W_addr 'Adresse I2C schreiben
      112. Register_adresse = &H3B 'Registerbeginn Acceleration Daten
      113. I2cwbyte Register_adresse
      114. I2cstart
      115. I2cwbyte R_addr 'Adresse I2C lesen
      116. For Z = 1 To 6
      117. I2crbyte Register(z) , Ack
      118. Next
      119. I2crbyte Register(6) , Nack
      120. I2cstop
      121. Swap Acc_x 'die Register sind MSB first, AVR aber LSB first
      122. Swap Acc_y
      123. Swap Acc_z
      124. 'Ausgabe als Bandanzeige auf 8 LEDs an Port A
      125. Temp = Acc_y / 4096 'Reduzieren der Auflösung
      126. Select Case Temp
      127. Case 0 : Porta = &B00000000
      128. Case -1 : Porta = &B00010000
      129. Case -2 : Porta = &B00110000
      130. Case -3 : Porta = &B01110000
      131. Case Is < -3 : Porta = &B11110000
      132. Case 1 : Porta = &B00001000
      133. Case 2 : Porta = &B00001100
      134. Case 3 : Porta = &B00001110
      135. Case Is >= 4 : Porta = &B00001111
      136. End Select
      137. Loop
      138. End
    • wolleausmallo schrieb:

      mit dem Unterschied, daß ich einen Atmega16L und Michael einen Atmega32 verwendet hat.
      Dann solltest du auch Atmega16 bei $regfile eintragen ;)

      Ab Zeile 7 kommt das Programm nochmal, sicher ein Kopierfehler.

      Welche Bascom-Version verwendest du? (steht ganz obenin der Leiste im geöffneten Bascom)

      Versuch bitte das nächste Mal, das Programm als Code hier anzuhängen, nicht als Text.
      Beim Schreiben des Beitrags das Symbol </> in der Leiste über dem Beitrag nutzen.
    • @wolleausmallo
      In der Abbildung aus Post #34 kann man erkennen, dass die PullUp's für den I2C-Bus mit 8,2 kOhm Widerständen realisiert sind.
      Ich finde das reichlich hochohmig. Du solltest da 1k0 bis 2k2 Ohm verwenden.

      Dann sehe ich im Code auch keine Angabe, mit welchem Takt der I2C-Bus betrieben werden soll.
      Es fehlt eine Angabe wie

      BASCOM-Quellcode

      1. Config TWI = 400000 ' 400kHz I2C-Clock



      Es wurde bereits von Vorrednern gesagt, dass der Controller bei $RegFile falsch angegeben ist.
      Das solltest du unbedingt berichtigen! Vielleicht ist das die Ursache, warum bei dir I2CInit hängt.

      Richtige Angabe:

      BASCOM-Quellcode: Controller korrekt angeben!

      1. $RegFile = "m16def.dat"

      Beim Auslesen der Registerwerte für X, Y, und Z machst du auch einen Fehler.
      Hier liest du in der Schleife 6 Bytes aus mir ACK, und dann liest du noch ein Byte (Byte 7), und speicherst das nochmal in Register(6).
      Damit überschreibst du das 2. Byte von Ack_z.

      Richtig muss es so lauten (Augenmerk auf Zeile 3, nur bis 5 zählen):

      BASCOM-Quellcode

      1. I2cstart
      2. I2cwbyte R_addr ' Adresse I2C lesen
      3. For Z = 1 To 5 ' nur Byte 1-5 lesen
      4. I2crbyte Register(z) , Ack
      5. Next
      6. I2crbyte Register(6) , Nack ' Byte 6 lesen
      7. I2cstop
      Dann gibt es noch eine Stelle im Programm, die da lautet:

      BASCOM-Quellcode

      1. Swap Acc_x 'die Register sind MSB first, AVR aber LSB first
      2. Swap Acc_y
      3. Swap Acc_z
      Der Kommentar gibt an, dass die Reihenfolge der Bits gespiegelt ist.
      Mit Swap wird aber nur unteres und oberes Nibble vertauscht.
      Um die Bits zu spiegeln müsste Flip verwendet werden.

      Wie die Bits jetzt rein kommen weiß ich nicht. Habe weder ins Datenblatt geschaut, noch habe ich den Sensor verfügbar.
      Aber entweder ist der Kommentar falsch oder die Swap-Funktion muss durch Flip-Funktion ersetzt werden.
      Soll mit dem Swap das Low-Byte mit dem High-Byte getauscht werden, wäre der Kommentar auch falsch.

      Was auch gerne mal passiert, dass man Clock und Data vom Bus vertauscht anschließt. Das kannst du auch mal prüfen.
    • Mitch64 schrieb:

      Der Kommentar gibt an, dass die Reihenfolge der Bits gespiegelt ist.
      Mit Swap wird aber nur unteres und oberes Nibble vertauscht.
      Um die Bits zu spiegeln müsste Flip verwendet werden.
      MSB = most significant byte, LSB = least significant byte, es ist ja ein 2-Byte Wert.
      Das Programm funktioniert ja auch so, oder warum muss es jetzt Flip sein?

      Mitch64 schrieb:

      Wie die Bits jetzt rein kommen weiß ich nicht. Habe weder ins Datenblatt geschaut, noch habe ich den Sensor verfügbar.
      Ahh, ok.