Hallo liebe Community
Ich hab da mal wieder ein Problem...
Zuerst meinen Sourcecode, den ich verwende:
http://pastebin.com/jLUTKng1
Und der I2C Treiber von Atmel für ATXmegas:
http://www.atmel.com/Images/AVR1308.zip
Datenblatt zum MPU-6050:
http://invensense.com/mems/gyro/documents/PS-MPU-6000A.pdf
http://invensense.com/mems/gyro/documents/RM-MPU-6000A.pdf
Ich versuche gerade aus einem Beschleunigungssensor MPU6050 mit einem
ATXmega32A4U das WHO_AM_I Register über I2C auszulesen um zu testen ob
die Kommunikation zwischen den Bausteinen funktioniert. Das WHO_AM_I
Register enthält standardmäßig den Wert 0x68 und befindet sich an
Adresse 0x75.
Um I2C benutzen zu können, verwende ich den originalen TWI-Treiber von
Atmel (link am Anfang). Mit diesem Treiber ist es relativ einfach eine
Kommunikation aufzubauen.
Dass die Kommunikation funktioniert, kann ich mit Gewissheit sagen, da
ich einen Logic Analyzer ausgeliehen bekommen habe, der mir genau die
gewünschten Werte aufzeichnet (siehe Anhang). Der Ablauf der Signale
stimmt mit dem Protokoll überein, das der MPU-6050 benötigt (Datenblatt
MPU6050). Man sieht auch, dass der MPU6050 antwortet und den Wert 0x68
zurückgibt.
Allerdings kommt dieser Wert nicht beim Mikrokontroller an
(softwaretechnisch meine ich). In der Zeile 73 meines Codes wird der
gelesene Wert (0x68) der Variable "val1" übergeben. Lese ich dann aber
die Variable "val1" mit einem Debugger aus, so steht in ihr nichts drin.
Der Wert wurde also nicht korrekt der Software übergeben. Und
seltsamerweise hängt sich mein Mikrokontroller in der Zeile 73 auf,
nachfolgende Befehle werden nicht mehr ausgeführt.
Woran könnte es also liegen, dass ich den Wert in der Software nicht
erhalte und dass sich der Mikrokontroller aufhängt?
Sind die TWIE-Ausgänge in der Zeile 49-50 richtig initialisiert, oder
muss ich TWIE-Ausgänge "besonders" initialiseren?
Ich freue mich über eure Antworten!
Viele Grüße
Matthias