Gast
#1710235
Hallo, ich versuche momentan mit einem ATtiny einen "Übersetzer" zwischen einem UART und einem i2c-Bus zu realisieren. Sprich: Daten, die auf dem i2c-Bus zum ATtiny geschrieben werden, werden von diesem direkt über den UART rausgeschrieben. Andersherum werden Daten, die über den UART zum ATtiny kommen gepuffert und beim nächsten i2c-Lesevorgang an den Master übergeben. Den i2c-Teil habe ich größtenteils von einem Eintrag hier aus dem Forum übernommen ( Beitrag "attiny USI Slave Implementierung" ) (meine Version ist im Anhang) Schreiboperationen funktionieren auch einwandfrei, Daten die ich über i2c auf den Tiny schreibe, kommen problemlos auf dem UART an. Aber mein Problem ist nun, dass Lese-Operationen auf dem Tiny fehlschlagen. Ich habe die Lesevorgänge mal mit einem Oszilloskop angeschaut und werde einfach nicht schlau daraus (siehe Bilder im Anhang, die grüne, obere Linie ist SDA, die gelbe, untere SCL.). Es sieht so aus, als ob der tiny zu spät anfängt Daten rauszuschieben, aber warum er das tut verstehe ich nicht. Es sieht auch so aus, als ob er an irgendeiner Stelle einen halben Takt verliert, da er seine Daten dann zu den Low-Phasen des Taktes rausschreibt. Auch seltsam sind die zwei verlängerten Clock-Pulse vom Master (ein Lego NXT) nachdem der tiny seine Adresse mit einem ACK bestätigt hat. Einige Werte, die ich beim tiny rausschreibe, liefern recht reproduzierbare Ergebnisse auf dem NXT, zB. wird 0x0f fast immer zu 0x3f. Auch andere Werte folgen diesem "um zwei nach links geshiftet, mit Einsen aufgefüllt"-Schema, aber andere Werte folgen anderen Mustern oder sind nicht wirlich reproduzierbar. der tiny läuft mit 8MHz (interner Oszillator) Der NXT wurde mit NXC programmiert und der wesentliche Code-Ausschnitt ist eigentlich nur
1 | |
2 | |
3 | |
4 | |
5 | |
len ist die Länge der zu erwartenden Antwort. Es verwundert mich auch etwas, dass der NXT bei dem 0x0f-Lesevorgang offenbar ein zweites Byte liest und mir dieses dann als das Ergebnis der Leseoperation verkauft. Sieht irgendjemand, wo mein Fehler ist? Oder hat irgendwer Erfahrung mit i2c auf dem NXT? Ich vermute ja, dass das Problem erst durch das Zusammenspiel der beiden entsteht, ich habe leider keinen anderen i2c-Master um die Funktion des tiny zu überprüfen. PS: Ich weiß, dass ich mit den angehängten Oszilloskop-Bildern gegen die Forenregeln verstoße, aber da ich die Bilder nur im JPG-Format habe macht es wenig Sinn sie zu PNG zu konvertieren. Das würde sie nur größer machen und die verloren gegangene Qualität kommt so auch nicht wieder.

