Forum: Mikrocontroller und Digitale Elektronik TWI I2C Problem, mehrere mikrokontroller verbinden


von René R. (rene)


Lesenswert?

Hallo alle zusammen,

ich möchte mehrere ATmegas miteinander kommunizieren lassen. Problem, 
sie sollen sich selbst automatisch addressieren. Sie sind in 
verschiedenen Geräten die ich mit einem Gerät ansteuer und sie sollen 
automatisch z.B.  die addressen 1-... bekommen. Hat jemand sowas schon 
gemacht? Oder ne Ahnung ob das überhaupt funktioniert?

Vielen Dank schonmal an alle

von Bernhard S. (bernhard)


Lesenswert?

Hallo René,

Du kannst problemlos während des Betriebes die Slave-Adresse eines 
ATmegas ändern.

Ich hab's bei mir so gelöst:

Nach dem programmieren, bzw. Reset auf "Werkseinstellung" befindet sich 
der SLAVE auf einer definierten Adresse Bsp: 127.

Ich spreche ihn an und ändere seine Adresse nach meinen Wünschen.

Gruß

Bernhard

von Metaller (Gast)


Lesenswert?

Grundsätzlich ist das fast möglich ;) Einer muß schon eine fixe Adresse 
haben, der aus einem Pool die anderen Adressen verteilt. Und noch eins 
ist wichtig. Die uC's, die noch keine Adresse bezogen haben, dürfen nur 
nacheinander eingesetzt, bzw. eingeschltet werden, da die Neuen per 
General Call angesprochen werden. Sobald einer eine Adresse bekommen 
hat, kann er diese im EEProm abspeichern und muß nicht immer neu 
beziehen.

So könnte es gehen. Aber mal abwarten was die anderen dazu sagen, die 
ein bischen mehr Ahnung davon haben als ich.

von Feadi (Gast)


Lesenswert?

Kann man den µC nicht in den Master-Mode schalten und auf eine Adresse 
zugreifen, wenn keine Antwort kommt ist diese frei. Müsste doch gehen, 
oder?

Gruß, Feadi

von FirePhoenix (Gast)


Lesenswert?

Hallo René
ich arbeite zur Zeit an einem Projektseminar, und darin werde ich auch 
eine TWI Verbindung aufbauen, könntest du mir evt. deinen Quellcode zur 
Verfügung stellen um mir das einarbeiten zu erleichtern?

Danke

von Bernhard S. (bernhard)


Lesenswert?

>Kann man den µC nicht in den Master-Mode schalten und auf eine Adresse
>zugreifen, wenn keine Antwort kommt ist diese frei. Müsste doch gehen,
>oder?

Das funktioniert auch.

Musst nur anschließend die alle Adressen scannen, um zu erfahren, wo 
sich welcher Slave herum tummelt ;)

Bernhard


von René R. (rene)


Lesenswert?

Vielen vielen Dank an alle, bin schon viel schlauer als vorher, nur das 
einzige Problem was ich jetzt noch habe ist, dass die Addressierung der 
Geräte an der Leitung so aussehen sollte:
1 - 2 - 3 - 4 - 5 - 6 -.....

das tut sie auch, wenn ich, wie Metaller schon gesagt hat, alle 
nacheinander einschalte. Das ist schon super, dank Euch. Wenn der Source 
fertig ist poste ich ihn, dauert aber noch ein bisschen.

Nun zu meinem Problem, wenn ich alle gleichzeitig einschalte siehts so 
aus (was auch logisch ist):

3 - 1 - 6 - 5 - 2 - 4 - ......

Gibt es eine möglichkeit die Adressen w2irklich der Reihe nach zu 
vergeben ohne sie nacheinander einschalten zu müssen? Ich dachte an 
sowas wie die antwortzeit zu messen und dem schnellsten die eins,.... zu 
geben. ist das überhaupt möglich? Oder ist die Zeitverzögerung zu 
gering? (liegen immer ca. 40cm Kabel dazwischen)

Vielen Dank schonmal

von Reinhard P. (carnival)


Lesenswert?

Wird das ein Multimaster System oder werden die µC's als Slave 
betrieben?

Mein Vorschlag wäre, ähnlich wie bei TCP/IP, einen µC als "DHCP-Server" 
arbeiten zu lassen. Um gleichzeitiges Einschalten zu ermöglichen 
bräuchte man dann nur noch eine Kollisionserkennung.
Der µC der dann für die Adressvergabe zuständig ist hat halt dann eine 
fixe Adresse.

Ablauf:

Einschalten

->Alle wollen Senden ->Kollision erkannt
->jeder angeschlossenen µC generiert eine Zufallszahl die er dann
   als Wartezeit bis zum nächsten Sendeversuch nimmt

Nach der µC mit der niedrigsten Zufallszahl beginnt mit der 
Adressanfrage.
(voreingestellt ist eine bei allen µC's die gleiche Adresse)
Der "DHCP" µC sendet nun auf die Voreingestellte Adresse die neue
Adresse. Alle anderen µC's können diesen Datentransfer ignorieren.

Nun hat der erste mal seine Adresse und das Spiel beginnt von neuem.
Alle erkenne dass der Bus fei ist und beginnen zu Senden ...


Dieses Spiel wiederholt sich solange bis alle zugewiesen sind.
zum Abschluß kann man den "DHCP" nochmal eine Anfrage an die allgemeine
Adresse senden lassen. Wenn nichts mehr retour kommt dann sind alle 
angeschlossenen µC's konfiguriert.

Auf diese Weise kann man auch ein "HotPlugging" zusätzlich relativ 
leicht
realisieren. Wenn ein neuer µC angeschlossen wird wartet dieser zuerst 
mal bis der Bus frei ist und sendet nun seinerseits eine Anforderung an 
den "DHCP"

Die Reihenfolge der Adressen läßt sich hier natürlich nicht 
vorherbestimmen.

Mit einem Zusatz ginge es allerdings: wenn du jedem angeschlossenen µC 
noch eine "MAC Adresse" gibst.
Der "DHCP" speichert die MAC und die von ihm zugewiesene Adresse ab. 
Jedes mal wenn nun eine Anforderung kommt schaut dieser in seiner 
Tabelle nach ob er die MAC schon kennt und gibt demensprechend was 
zurück. Wenn nun ein "neuer" angeschlossen wird, bekommt der halt eine 
Adresse die noch nicht vergeben ist.

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.