Forum: Mikrocontroller und Digitale Elektronik ATtiny2313 als i2c Slave lässt sich nicht auslesen (mit Lego NXT als Master)


von Stephan Lohse (Gast)


Angehängte Dateien:

Lesenswert?

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
until(LowspeedCheckStatus(I2C_PORT) == 0);
2
byte send[1];
3
send[0] = (NODE_ADDR << 1) | 0x01;
4
int len = 1;
5
LowspeedWrite(I2C_PORT, len, send);
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.

von Lego (Gast)


Lesenswert?

Hi Lohse,

hast du geschafft, ATTiny mit NXT zu verbinden?

Gruß
Lego-Fan

von GR (Gast)


Lesenswert?

Hab das selbe Problem, aber leider keine Instrumente, um das genauer zu 
prüfen :(

Irgendein Fortschritt?

von Benjamin A. (beni0664)


Lesenswert?

Ich weiß der Thread ist nicht mehr neu, aber
hast du schon Ergebnisse?

Ich bin nämlich auch gerade mit dem NXT & I2C
beschäftigt.

Ich will einen Honeywell Kompasssensor auslesen.
Der Kompass funktioniert (mit einem AVR als Master getestet),
sowie das I2C Interface vom NXT, wenn das angeschlossene Device
sich wie ein EEPROM verhält (ebenfalls mit einem AVR getestet)...

mfg beni

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.