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
>- 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.
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.
Hast Du Dir mal die I2C library von Peter Fleury angeschaut? Da sind die ganzen Methoden gut beschrieben.
>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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.