Hallo zusammen,
ich arbeite mich gerade in C ein und bin am I2C mit einem ATMega128P
dran. Hier würde ich gern den Beschleunigungssensor ADXL345 via I2C
anbinden.
Das Grundgerüst vom I2C steht auch bereits. Chip konfigurieren klappt
auch aber es hadert beim auslesen der Werte.
Ich vermute, ich setze irgendein Leseregister nicht bzw. nutze die
falsche Leseadresse. Könnte sich das mal jemand ansehen?
zurück kommt nichts. Das Array wird nicht befüllt. Erwarten würde ich 6
Integer werte jeweils 8 Bit H/L. Aber soweit bin ich jetzt noch garnicht
gewesen. Ich wollte quasi nur erstmal die Register auslesen.
lg
Theo
Ich habe jetzt nochmla was am Code geändert. Write und Read Adresse
müssten jetzt stimmen. Leider kommt immernoch nichts zurück.
Was auch sehr seltsam ist: Im Terminal bekomme ich alle 2 Sekunden den
"Init". Das dürfte ja eigentlich garnicht passieren, da er die while
Schleife ja garnciht verlassen dürfte und das "Init" ja davor steht.
Theo W. schrieb:> Leider kommt immernoch nichts zurück.
Was heißt "es kommt nichts zurück"? Bleibt die Funktion i2cread hängen?
Liefert sie den Wert 0 zurück?
Ansonsten folgende Fragen:
Ist der ADXL überhaupt für I2C konfiguriert? (Andernfalls macht er SPI)?
Hast du dir den Ablauf auf dem Bus für ein Register-Read schon mal
angeschaut (Fig. 41 in
http://www.analog.com/media/en/technical-documentation/data-sheets/ADXL345.pdf)?
Für ein single Byte Read brauchst du:
- eine Startcon
- ein Write mit der Deviceadresse
- ein Write mit der gewünschten Registeradresse
- eine neue Startcon
- ein Read mit der Registeradresse
- acht weitere SCL-Flanken zum Einlesen der Read-Daten
- eine Stopcon
Läuft das tatsächlich alles nacheinander ab, wenn du einfach
adxlvalue[0]=i2c_read(1); in deinen Code schreibst?
Hier ein Link zu einer Application-Note samt Beispielcode zur Nutzung
des TWI
http://www.microchip.com//wwwAppNotes/AppNotes.aspx?appnote=en591794
Hallo zusammen,
also von vorn:
Der ADXL ist für I2C konfiguriert.
Wie oben geschrieben, läuft die Konfiguartion sauber durch und bleibt
auch nicht hängen. Feststellen lässt sich das leicht am Stromverbrauch.
Setze ich das Powerregister auf Sleep habe ich 30uA, beim´der normalen
Konfig gut 100uA. Ebenso beim verändern von Abtastraten.
Der I2C Bus läuft also.
@Achim
Ich habe oben meinen Code gepostet. Dort ist folgendes zu sehen:
1
i2c_start();
2
i2c_write(ADXL_ADDRESSW);
3
i2c_write(ADXL_ACC_Data);
4
i2c_stop();
5
i2c_start();
6
i2c_write(ADXL_ADDRESSR);
7
adxlvalue[0]=i2c_read(1);
8
adxlvalue[1]=i2c_read(1);
9
adxlvalue[2]=i2c_read(1);
10
adxlvalue[3]=i2c_read(1);
11
adxlvalue[4]=i2c_read(1);
12
adxlvalue[5]=i2c_read(0);
13
i2c_stop();
Das entspricht exakt deiner angegebenen Reihenfolge.
Kleine Unklarheit: Muss ich nach der zweiten Startcon die Leseadresse
Lesen oder Schreiben? Aktuell Schreibe ich das Leseregister auf den Bus
und gehe dann in i2c_Read.
Und wie sollte das nicht direkt nacheinander ablaufen?
Vielleicht hat jemand die Muße die i2C_read Funktion mal kurz anzusehen?
(Angehangen an den ersten Post)
Ich habe leider kein Oszi hier um direkt auf den Bus zu gucken.
Mit "zurück kommt nichts" meine ich, dass die Read Funktion keine Werte
zurückgibt, die Funktion an sich aber durchläuft. Da der Code auf ein
Ack wartet wenn ich das richtig interpretiert habe, muss ja auch
eigeltich was passieren.
Darüber hinaus: Hat jemand beim Code eine Idee wie es sein kann, dass
der aus der While Schleife rausspringt und das "Init" erneut macht?
lg
Theo
Theo W. schrieb:> Ich habe leider kein Oszi hier um direkt auf den Bus zu gucken.
Dann habe ich einen Vorschlag für dich:
Nutze die Zeit, wo du hier auf Antwort wartest, und bestelle dir über
eBay o.ä. einen kleinen Logikanalysator. Kostet dich keine 7€ und hilft
beim nächsten Mal ungemein.
Suchbegriff z.B. "USB Logic Analyzer 8CH 24MHz"
Theo W. schrieb:> Darüber hinaus: Hat jemand beim Code eine Idee wie es sein kann, dass> der aus der While Schleife rausspringt und das "Init" erneut macht?
Läuft vielleicht dein Watchdog Timer?
Theo W. schrieb:> Im Terminal bekomme ich alle 2 Sekunden den "Init". Das dürfte ja> eigentlich garnicht passieren, da er die while Schleife ja garnciht> verlassen dürfte und das "Init" ja davor steht.
Ja, sieht nach Watchdog aus...
Hallo zusammen,
also als erstes: Ich wusste garnicht, dass es Logik Analyzer für ein
Paar Euros gibt....sofort bestellt.
Zu allem anderen:
Ich habe festgestellt, dass sobald ich eine bestimmte Uart Zeile
auskommentiere ich nicht mehr aus der While Schleife springe.
Daraufhin, habe ich die gesamten Uart Funktionen in eine separate header
Datei ausgelagert. Und schon gibt der Compiler Fehler aus. Hauptsächlich
lag es daran, dass das I2C lief, aber die Ausgabe nicht.
Da ich von Basic (Bascom) komme kann man alles in einen Print Befehl
schmeißen. Hier muss sauber konvertiert werden (itoa). Wieder was
gelernt.
Dennoch vielen Dank an alle und ein schönes Wochenende.
-----Closed------
Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.
Wichtige Regeln - erst lesen, dann posten!
Groß- und Kleinschreibung verwenden
Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang