Forum: Mikrocontroller und Digitale Elektronik TWI, I2C Master-Slave mit AVR


von Philipp P. (putzer_philipp)


Lesenswert?

Hallo!

Ich versuche seit ein paar Tagen eine einfache Kommunikation zwischen 
zwei AVR µC mit dem I2C Bus aufzubauen. Dazu verwende ich die i2c.c und 
Gefolge aus der AVR-LIBC.

Die Idee wäre ja ganz einfach. Man hat einen Master (MEGA64) welcher vom 
Slave Daten anfordert. Dieser misst in meinen Fall etwas, und sendet die 
Daten an den aufrufenden Master zurück. Nur leider bekomme ich das immer 
nur in eine Richtung hin. Wenn überhaupt!!

DAs ganze sol Interruptbasierend sein,zwar helfen die Debug-Ausgaben in 
der i2c.c etwas weiter, nur leider komme ich einfach nicht hin.

Kann mir jemand sagen, wo ich vielleicht eine 
Dokumentation/Anleitung/sonstwas zur i2c.c finde? in der onlinedoku 
steht ziemlich wenig bis gar nix drin!

Gibts da vielleicht irgendwelche Refenzprojekte die man sich mal 
anschauen könnte? Auch egal wenns eine andere lib ist!


Vielen Dank und schönen Abend noch!

von Otto (Gast)


Lesenswert?

Hallo Philipp,

Deine Informationen sind leider etwas dürftig:

- wie sieht der aktuelle Code aus (bitte als Anhang)
- welche Debug-Möglichkeiten hast Du
- was geht nicht
- wird der slave richtig adressiert
- "laufen" beide Controller

..
..
..
..

Otto

von Philipp P. (putzer_philipp)


Angehängte Dateien:

Lesenswert?

Den Code habe ich als Rar angehängt, da ist alles vom Master und vom 
Slave drin.

Beim Master gehe ich so vor:
- Bei Tastendruck wird ein Byte (hier nur als test die fiktive adresse 
des masters) an den Slave gesendet.
- Frage: Wie mache ich es, um die Daten, welche vom Slave zurückgesendet 
werden abzurufen?

Beim Slave stelle ich mir das so vor:
- Wenn ein TWI-Interrupt auftretet, starte ich in der ISR (ist das schon 
gut/richtig?) eine Messung. Den Codeteil zur Messung startetn habe ich 
aber unter "I2C: SR->DATA_ACK" UND unter "I2C: ST->DATA_ACK". Ich bin 
mir noch nicht im klaren, wo ich den genau hintun muss, leider.
Laut Debug (UART) lande ich beim Slave im "I2C: SR->DATA_ACK", was 
meines Erachtens ja auch Sinn macht, da der Slave ja Daten empfängt.
Frage: Nur, wie sende ich nun die Daten an den Master zurück??


Danke schon mal!!

von Otto (Gast)


Lesenswert?

Hallo Philipp,

könntest Du das Listing bitte unkomprimiert anhängen, so dass man es 
direkt ansehen kann ?

In der Codesammlung gibt es ein schönes Beispiel in Assembler.

1. Nur die Slaves haben Adressen

Schreibadresse z. B. 0xA0

2. "TWI-Interrupt auftretet, starte ich in der ISR "

Das ist richtig so - dann musst Du in eine Auswertung verzweigen.


3. Ich bin mir noch nicht im klaren, wo ich den genau hintun muss, 
leider.

Bei einem Schreibzugriff des Masters setzt Du abhängig von der 
gewünschten Aktion ein Flag oder speicherst eine Variable, welche Du im 
zyklischen Programm auswerten kannst. Z. B. 0-255 = Messung aus/ein, 
wenn > 0 alle x Sekunden


4. Frage: Nur, wie sende ich nun die Daten an den Master zurück??

Gar nicht - der Master holt die Daten mit einem Lesezugriff ab.

Leseadresse z.B. 0xA1

Gruss Otto

von Philipp P. (putzer_philipp)


Angehängte Dateien:

Lesenswert?

Hier das Listing für den Master 1.Teil

von Philipp P. (putzer_philipp)


Angehängte Dateien:

Lesenswert?

Listing für Master Teil 2 (i2c-Routine)

von Philipp P. (putzer_philipp)


Angehängte Dateien:

Lesenswert?

Listing Slave (i2c-routine)
Die ganze übertragung läuft nur hier ab

von Philipp P. (putzer_philipp)


Lesenswert?

P.S
Wie kann ich hier mehr als eine Datei anhängen? So ists verdammt lässtig 
und unübersichtlich! sorry

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.