mikrocontroller.net

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


Autor: Stephan Lohse (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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
until(LowspeedCheckStatus(I2C_PORT) == 0);
byte send[1];
send[0] = (NODE_ADDR << 1) | 0x01;
int len = 1;
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.

Autor: Lego (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi Lohse,

hast du geschafft, ATTiny mit NXT zu verbinden?

Gruß
Lego-Fan

Autor: GR (Gast)
Datum:

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

Irgendein Fortschritt?

Autor: Benjamin A. (beni0664)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

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

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.