[erledigt] I²C-Fragen

Hallo allerseits!

Bei meinen bisherigen Spielereien mit dem I²C-Bus war alles klar: Es gab einen oder zwei Slaves (z. B. eine DS1307 und ein SSD1306-Display) und einen Master (der Arduino).

Wer Slave war, war immer klar, weil Uhr und Display nicht Master sein konnten. Jetzt habe ich allerdings ein Setup aus mehreren Arduinos, die alle untereinander kommunizieren können sollen. Was mir dabei nicht klar ist: Muss es einen Master geben und kann dieser keine Adresse haben? Wenn ja: Wie kann ich dann dem Master etwas mitteilen? Kann ich die Arduinos so konfigurieren, dass jeder Busteilnehmer eine Adresse hat?

Falls es interessiert: Es geht um das, was ich unter http://test.szaktilla.de/notizen.pdf skizziert habe. Jeder der Arduinos am I²C-Bus soll jeden anderen Busteilnehmer adressieren können. Wenn der Master aber (angenommen) keine Adresse haben darf, kann ich diesem ja keine direkte Mitteilung schicken oder Daten abrufen, oder?

Für erhellende Hinweise dankt vorab

Gregor

Wie kann ich dann dem Master etwas mitteilen?

Indem du Daten vom Slave liest. Man kann auch anfragen ob Daten vorliegen.

Slaves können sich gegenüber anderen Slaves auch als Master verhalten

Wenn alle miteinander quatschen sollen ist RS-485 vielleicht besser.

Darauf eine einfache und schnelle Antwort.

Es ist immer so, der Master (ohne Adresse) fordert die Slave (mit der jeweiligen Adresse) auf, Daten zu liefern.

Na da war jemand schneller ;)

Vielen Dank für die schnellen Antworten!

Problem ist aber folgendes (s. meinen Notizzettel): Gordi ist derjenige, der zuerst eingeschaltet wird. Der meldet sich demnach auch zuerst am I²C-Bus an (als Master ohne Adresse). Später soll Gordi aber von Manni Befehle erhalten können, die von Manni initiiert werden. Das ist aber gar nicht möglich, wenn Gordi keine Adresse hat, oder doch? Könnte Gordi nachträglich eine Adresse bekommen und das „Master-Fähnchen“ an Manni abgeben?

BTW: Alles auf einen anderen Bus umzustricken wäre ein Heidenaufwand und käme nur in Frage, wenn es nicht anders geht.

Gruß

Gregor

Dann must du es per Interrupt lösen.

HotSystems: Dann must du es per Interrupt lösen.

Wenn ich Dich richtig verstehe, brauche ich also eine separate Leitung, über die Manni Gordi mitteilt, dass Gordi Daten/Befehle bei Manni abholen kann. Richtig?

Gruß

Gregor

gregorss: Wenn ich Dich richtig verstehe, brauche ich also eine separate Leitung, über die Manni Gordi mitteilt, dass Gordi Daten/Befehle bei Manni abholen kann. Richtig?

Ja, das ist richtig. Aber nur eine Leitung für alle, das reicht. Anders sehe ich keine Chance.

HotSystems: Ja, das ist richtig. Aber nur eine Leitung für alle, das reicht. Anders sehe ich keine Chance.

Danke!

Gruß

Gregor

gregorss: Danke!

Gruß

Gregor

Bitte, gerne.

Wie?

Der I2C Bus erlaubt ohne weiteres den Multimaster Betrieb.

Jedes Gerät kann eine Slave Adresse bekommen! Jedes Gerät darf Master spielen.

Bei einem Multimaster System ist nicht unbedingt eine Interruptleitung nötig. Nur dann, wenn man Slaves hat, welche NICHT Master sein können. Z.B. eine RTC. Und irgendwen benachrichtigen müssen.

Jeder der Arduinos am I²C-Bus soll jeden anderen Busteilnehmer adressieren können.

Machbar!!

Wenn der Master aber (angenommen) keine Adresse haben darf,

Der Master eine Adresse? Wozu? Der Arduino kann wechselweise Master und Slave spielen. Und natürlich braucht er als Master keine Adresse. Aber als Slave allerdings: Ja! "keine Adresse haben darf" ist also falsch. "eine Adresse haben muss" ist abgemessener

kann ich diesem ja keine direkte Mitteilung schicken oder Daten abrufen, oder?

Wer ist diesem? Diesem Arduino? Da er abwechselnd Master und Slave sein kann, kannst du ihm Daten von einem Master schicken.

Die Probleme sind ganz woanders! AVRs können bei einem hoch belasteten I2C Bus in Race Conditions fallen. und damit einen Deadlock auslösen.

Serenifly: Slaves können sich gegenüber anderen Slaves auch als Master verhalten

Nein, das gibt I2C nicht her! Die Rollen von Master und Slave sind fest gelegt. Immer: Der Master initiiert die Kommunikation Der Master legt fest, ob schreibender, oder lesender Zugriff. Niemals, kann sich ein Slave, wie ein Master verhalten.

Aber er kann die Rolle tauschen. Ein AVR kann wechselweise Master oder Slave sein. Aber nie gleichzeitig. (es sei denn, er hat 2 I2C Bus Systeme)

Aber dies könnte man doch auch mit Befehlen lösen ich gehe mal davon aus das Hugo und Klaus auch Master sein "könnten". Anton ist es zum beginn

Anton (wenn als Slave Betrieben Adresse 10) Hugo (Adresse 11) Klaus (Adresse 12)

Anton zum Hugo "Hey Hugo du wirst ab jetzt Master" Hugo sagt dem Anton okay in 100ms bin ich Chef du nix Nach 100ms start der Hugo Wire.begin() und Anton Wire.begin(10);

ist der Hugo fertig mit seinem Chef sein kann er das dem Klaus sagen:

Hugo zum Klaus"Hey Klaus du wirst ab jetzt Master" Klaus sagt dem Hugo okay in 100ms bin ich Chef du nix Nach 100ms start der Hugo Klaus.begin() und Hugo Wire.begin(11);

Damit könnte man das Master Fähnchen weitergeben. Aber auf die Rückmeldung warten sonst kann es blöde werden. Das ist dann alles ne Frage des Programmierens.

Gruß DerDani

Hallo Combie und Dani,

danke für Eure Antworten. Anstatt ein Gehampel um die Frage anzustellen, wer Master sein soll, werde ich es wohl so machen, dass Gordis Assistent, der gleichzeitig mit Gordi eingeschaltet wird, den Master macht (einfach nur, damit es irgendeinen Master gibt, denn ganz ohne geht wohl nicht) und Gordi mitteilt, wenn sich dieser am I²C-Bus anmelden kann (als Slave mit Adresse).

Wenn ich das richtig verstanden habe, ist ein I²C-Master nötig, damit dieser die Taktleitung bedient. Wenn sich dann irgendwann die anderen Arduinos angemeldet haben, haben alle Busteilnehmer, die miteinander kommunizieren können sollen, eigene Adressen.

Auf diese Weise gibt es einen Master (der am Bus nichts tut als den Takt für SCL zu liefern) und die anderen können einander adressieren.

Gruß

Gregor

und die anderen können einander adressieren.

Wie sollen sie das tun? Nur der Master spricht die Slaves mit ihrer Adresse an.

Jeder darf Master spielen. Der jeweilige Master startet nur die fallende Takt Flanke. Das steigen kann der Slave verzögern. "Clock Stretching"

Anstatt ein Gehampel um die Frage anzustellen, wer Master sein soll,

Das Gehampel machst du!

Wer den anderen was mitteilen will, macht sich zum Master. Das passiert automatisch. Du brauchst dich darum nicht zu kümmern! NICHT DRUM KÜMMERN!!! Kein Gehampel. Nirgendwo. (nur in deinem Kopf)

combie: ...Kein Gehampel. Nirgendwo. (nur in deinem Kopf)

Huh?! Da muss ich etwas gründlich missverstanden haben.

Wie dem auch sei, ich habe jetzt ein Minimal-Setup eingerichtet, mit dem ich das testen kann. Vielleicht wird der Nebel in meiner Birne dann etwas lichter.

Gruß

Gregor

Ja, das denke ich auch. Der Nebel wird sich lichten.

Und zur Not, reden wir nochmal darüber. Über manche Probleme muss man reden. Solange reden, bis sich das Problem verändert, oder die Sicht darauf. Wobei ich glaube, dass das beides aufs selbe raus kommt...