Forum: Mikrocontroller und Digitale Elektronik Atmega328P I2C - kein Ack vom Slave


von Christian H. (christian_h)


Angehängte Dateien:

Lesenswert?

Hallo,

ich möchte gerne einen Slave über I2C ansteuern und habe mir deshalb mit 
Hilfe des Datenblatts und diverser I2C-Erklärungen die Funktionen 
geschrieben. Doch leider bekomme ich kein Ack vom Slave, weder bei 
Daten, noch bei Adressen.

Ich programmiere derzeit auf einem Arduino Uno (reine Bequemlichkeit, 
dass der Bootloader Platz wegnimmt stört nicht, weil das Programm wohl 
etwas drunter bleiben wird. Ich programmiere den Atmega328P mit ganz 
normalen avr-gcc, also NICHT im Arduino-Slang.

Ich habe nachdem ich verzweifelt in meinem Code gesucht hab, auch mal 
andere I2C-Implementierungen angeschaut und diese sind im Wesentlichen 
recht gleich. Deswegen frage ich mich, was da schief läuft?

Also:
 - Die Prescaler sind korrekt auf 100kHz und 400kHz getestet worden 
(F_CPU auf 16000000UL, damit ist der Arduino Uno auch getaktet, ohne 
Prescaler Fuses (diese Fragen stellen sich da natürlich nicht)).

- Mein Code und andere Codes machen im Wesentlichen genau dasselbe (wie 
sollten sie auch was anderes tun, bei einem festgelegten Protokoll). Hab 
schon gefühlte 50x drübergeschaut, vielleicht hab ich aber auch einen 
Tunnelblick und übersehe eine Kleinigkeit.

- An PullUp-Widerständen wird es auch nicht scheitern, das Slave-Board, 
was angesteuert wird hat passende I2C-Widerstände. Zusätzlich hab ich es 
mit einer fertigen Software probiert (welche übrigens ebenfalls 
eigentlich dasselbe macht, wie meine, also genau die gleichen 
Registereinstellungen in der selben Reihenfolge, soweit ich das gesehen 
hab) und da funktioniert der Slave einwandfrei und liefert Daten, sodass 
man die Hardware-Seite ausschließen kann.

- Bei der Adresse 0x68 bin ich mir auch sehr sicher, da mir das bereits 
bestätigt wurde (geshiftet 0xD0) und ebenfalls im Datenblatt steht.

Was mache ich dann falsch? Hab ich was grundlegendes übersehen, ist 
vielleicht SCL aus irgendeinem anderen Grund zu langsam?

Edit: das i2c.ino ist eine .c Datei, hab vergessen die umzubenennen.

Gruß,
Christian

von Markus U. (markjus) Benutzerseite


Lesenswert?

Um welchen Baustein handelt es sich denn?

von Christian H. (christian_h)


Lesenswert?

Es geht um ein MPU6050 auf einem Drotek 6DOF MPU6050 Board

von holger (Gast)


Lesenswert?

>- Mein Code und andere Codes machen im Wesentlichen genau dasselbe

Nö, tun sie NICHT. Deiner funktioniert nicht.

>Zusätzlich hab ich es
>mit einer fertigen Software probiert (welche übrigens ebenfalls
>eigentlich dasselbe macht, wie meine, also genau die gleichen
>Registereinstellungen in der selben Reihenfolge, soweit ich das gesehen
>hab) und da funktioniert der Slave einwandfrei und liefert Daten

Dann nimm doch die fertige Software. Und komm mir jetzt
nicht mit "ich will das selber machen und was lernen".
Dann dürftest du hier gar nichr fragen;)
Zum selber machen gehört auch Fehler selber suchen.

von Christian H. (christian_h)


Lesenswert?

Interessant. Wofür meinst du gibt es dann Foren? Nach deiner Meinung 
sind diese dann überflüssig. Ich meine ich habe nur darum gebeten, ob 
jemand etwas sieht, was ich übersehe, da wie gesagt, ich hab mich 
bereits auch auf die Suche gemacht und ja schon diverse Fehlerquellen 
ausschließen können.

von Markus U. (markjus) Benutzerseite


Lesenswert?

Hast Du Dir mal die I2C library von Peter Fleury angeschaut? Da sind die 
ganzen Methoden gut beschrieben.

von Christian H. (christian_h)


Lesenswert?

Danke. Da werde ich auch nochmal nachschauen.

von holger (Gast)


Lesenswert?

>Interessant. Wofür meinst du gibt es dann Foren? Nach deiner Meinung
>sind diese dann überflüssig.

Ja, wenn du nicht den kompletten Sourcecode postest
kann man dir sowieso nicht helfen.

Dein Fehler liegt in get_sensor_data(0x75);
Das kennt jetzt aber keiner hier.

PS: Dein stop_i2c() enthält einen Fehler.

von Christian H. (christian_h)


Angehängte Dateien:

Lesenswert?

Oh, sorry, hier der Rest was mit I2C in Berührung kommt.

Hab Peter Fleury's Code getestet, das gleiche wie bei mir: kein Ack. 
Aber bei einem funktionierenden Beispiel (hier MultiWii 2.1), das ich 
gerade getestet habe, funktioniert alles einwandfrei. Also muss der 
Fehler anscheinend doch wo anders liegen in der main oder in sensor.ino, 
das ich dem Chip vielleicht doch falsche Daten gebe? Allerdings habe ich 
das Datenblatt vom MPU6050 vor mir liegen und der erwartet, wie jeder 
andere Chip auch, eben diese Daten, also Start, dann Adresse, dann 
Registeradresse, Dann nochmal Start dann Adresse+R und dann kann man 
lesen.

Bei I2C, stimmt, da fehlt TWEN und man könnte noch drauf warten, dass 
der Bus wirklich freigegeben ist, also TWSTO gelöscht ist, danke dafür. 
Den Fehler behebt es leider nicht, weil der Slave ja schon bei seiner 
Adresse kein Ack gibt und bei Daten kein Ack.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.