Forum: Mikrocontroller und Digitale Elektronik Mehrere µcs miteinander kommunizieren lassen


von Dirk (Gast)


Lesenswert?

Hallo,

ich habe folgendes Problem: Mehrere µcs sollen miteinander verbunden 
werden und Daten austauschen. Siehe Bild:
    |        |        |        |
 +----+   +----+   +----+   +----+
 |    | - |    | - |    | - |    |-
 |µC1 |   |µC2 |   |µC3 |   |µC4 |
 +----+   +----+   +----+   +----+
    |        |        |        |
                   +----+
                 - |    | -
                   |µC5 |
                   +----+
             |        |        |
          +----+   +----+   +----+
        - |    | - |    | - |    |_
          |µC6 |   |µC7 |   |µC8 |
          +----+   +----+   +----+
             |        |        |
                   +----+
                 - |    | -
                   |µC9 |
                   +----+
                      |

Ein µC soll also immer mit seinen direkten Nachbarn kommunizieren. Es 
ist auch wichtig wo sich die Nachbarn befinden 
(vor/hinter/links/rechts). Beispiel: 7 muss mit 5,6, 8 und 9 reden 
können, 6 allerdings nur mit 7. Es sollen also flexible µCs mit 4 
Kommunikationsschnittstellen entstehen, die man beliebig zusammen 
koppeln kann. Man soll es nach belieben um weitere µCs erweitern können.
Wir dachten zuerst an UART, aber wir brauchen an jedem µC eine UART für 
eine andere Anwendung.
Wie könnte man dies lösen? Vielleicht einen weiteren UART an jedem µC 
dazu, aber wie geht das?
Vielen Dank schon mal für Eure Hilfe.

von Matthias L. (Gast)


Lesenswert?

Es gibt µC mit zwei UARTs zB dem mega162.

von Ralf (Gast)


Lesenswert?

Ich denke, I2C oder ähnliches ist da besser geeignet. Oder evtl. SPI? 
Ist nur so ne Idee. Wie schnell muss das ganze denn sein?

Ralf

von Andreas K. (a-k)


Lesenswert?

Wenn die Topologie nicht zwingend vorgeschrieben ist: Hausbus-Technik, 
d.h. jeder kann technisch mit jedem über shared media. Ist auf jeden 
Fall flexibler als solch ein mesh.

von Maxx (Gast)


Lesenswert?

Hi,

wieviele Daten werden denn ausgetauscht und wie zeitkritisch ist der 
Vorgang?

Wenn beides in ertraeglichen Bereichen liegt waere ein simples Bussystem 
doch auch gut, oder? Jeder uC bekommt seine eigene ID. ist die 
kommunikation immer zielgerichtet wars das schon, ist sie "variabel" 
koennte jeder uC ausserdem eine kurze tabelle (max 4 bytes gesamt) mit 
den ids der kommunikationsberechtigten nachbarn.

der rest ist ein relativ einfacher softwarebus...z.b. I2C.
der ist relativ einfach aufgebaut, braucht nur 2 portpins und 
entsprechende softwareimplementierungen finden sich fuer alle gaengigen 
controller zuhauf.

von Dirk (Gast)


Lesenswert?

Hallo,

@ lippy: Jeder µc soll vier Kommunikationsaus/eingänge haben. Da reichen 
dann zwei UART wohl nicht und wir brauchen auch jeweils noch eine freie 
UART. Meiner Rechnung bräuchte ich fünf.
                      |
                   +----+
                 - |    | -
                   |µC5 |
                   +----+
                      |
@ all: Datenmenge fällt an ist aber nicht so wichtig. Hauptprobleme 
sind:
1. alle µcs sollen wie der hier abgebildete 5 sein, d.h. man kann sie 
beliebig an andere µcs koppeln.
2. Es können auch Stern/Linien/Schleifen-Anordnungen entstehen. Deshalb 
soll jeder µc auch nur wissen wer seine direkten Nachbarn sind und auch 
mit diesen maximal vier kommunizieren. Da es nicht eine reine 
Linienschaltung wird denke ich, dass Bus Systeme auch nichts werden. 
Dachte erst an CAN.

von Dirk S. (tomcat)


Lesenswert?

Erinnert stark an das Konzept der Transputer aus den Anfang 90'.
Parallelprocessing mit vier Highspeed-Kommunikationskanälen zu den 
Nachbarn...

von Ulrich (Gast)


Lesenswert?

hey,
als ich das gelesen habe, habe ich erstmal das autor fld gesucht und 
wollte nachschauen ob ich das geschrieben habe!
Das ist exakt gleich zu dem was ich auch will.

Ich nehme zwei atmega162 welche ich über eine parallele Schnittstelle 
verbunden habe. Somit habe ich allerdings nur 4Schnittstellen.

Zurzeit suche ich noch Material für Layer1 und L2. Für L3 habe ich 
eventuell schon eine Idee aber ich weiß selber noch nicht genau wie 
sauber ich das alles für meinen zweck implementieren muss

Planst du auch so dinge das dann Verbindungen über dieses Netzwerk 
getunnelt werden können?

von AVRFan (Gast)


Lesenswert?

>2. Es können auch Stern/Linien/Schleifen-Anordnungen entstehen.

Was soll das denn werden?  Reicht es nicht, wenn jeder µC mit jedem 
anderen über ***einen gemeinsamen Bus*** ("Keep it simple, stupid!") 
kommunizieren kann (*)?  Wenn ein weiterer C dazukommen soll, wird er an 
den Bus gesteckt, mit einer eindeutigen ID versehen - fertig.  Im 
Fünfeck oder herzförmig oder baumstrukturiert auf den Tisch legen kannst 
Du Deine 28 Controller dann ja immer noch.

Just my 2 cents...

(*) Ja, es gibt Fälle, wo das nicht reicht, z. B. wenn die Zeit bei 
großen Datenmengen eine Rolle spielt.  Du hast aber geschrieben, dass 
das kein kritischer Punkt bei Dir ist.

von Dirk (Gast)


Lesenswert?

Also es könnten durchaus mehrere Hundert µcs werden. Und die sind auch 
nicht alle in Reihe. Könnte z.B so aussehen:


               ******
                   *
                   *
                   **********
                          *
                   *    *****
                       
                   ******
                    
                    
                    
                   ***
Jeder Stern ein µc. Man könnte es beliebig fortsetzten. Und dann geht es 
mit einem Bus in Linienstrukutur einfach nicht.

von Bernd R. (Firma: Promaxx.net) (bigwumpus)


Lesenswert?

Ich habe soetwas auch mal durchdacht...

Jeder uC hat 1 UART. Die TX-Pin geht an die RX-Anschlüsse der 4 
Nachbarn. Dazu wird jeder RX-Pin mit einem Widerstand gegen High gezogen 
und die 4 TX-Pins der Nachbarn werden über eine Diode entkoppelt.

Werden Daten gesendet, wird jeweils ein Adreßbyte vorangestellt (da gibt 
es auch Hardware-Möglichkeiten mit dem 9. Bit), daß den Nachbarn 
adressiert.
z.B. 1=links, 2=oben, 3=rechts, 4=unten

Beim Empfang kann man dann anhand der verwendeten Adresse erkennen, von 
wo die Nachricht kommt:
1=rechts, 2=unten, 3=links, 4=oben !

Jetzt können sich die Nachrichten noch überlagern, also stören.
Also, numerierte Pakete, Prüfsumme und ACK-Pakete, oder so !

von AVRFan (Gast)


Lesenswert?

>Und dann geht es mit einem Bus in Linienstrukutur einfach nicht.

Ich sehe keinen Grund, warum es mit einem einzigen gemeinsamen Bus nicht 
gehen sollte.  Der Bus darf ja beliebig Abzweigungen haben, 
vorausgesetzt, Du fährst ihn mit genügend niedrigen Taktraten.

>Also es könnten durchaus mehrere Hundert µcs werden.

Mehrere HUNDERT?? lach Ohne Dir zu nahe treten zu wollen: Ich glaube, 
wenn Du diesem Projekt gewachsen wärst, würdest Du hier nicht solche 
Fragen stellen...

von Andreas K. (a-k)


Lesenswert?

Technisch einfach: Ein Controller mit 2 UARTs (z.B. Mega162) verwenden, 
und die Links in eine Richtung betrieben, d.h. links rein rechts raus, 
und dann am Ende ganz zurück nach links. Dann entstehen horizontale und 
vertikale Ringe.

Bei niedriger Datenrate sind auch in Software gestrickte Schnittstellen 
möglich. Ansonsten musst du dann Controller suchen, die 4 gleiche 
Schnittstellen haben, was nicht allgemein üblich ist. 4x UART wird's 
sicher irgendwo geben, aber nicht bei AVRs. Der LPC2294 hat 4x CAN (aber 
144 Pins), was man auf kurze Distanz auch ohne Transceiver nur mit Diode 
bewaffnet verwenden kann.

von Andreas K. (a-k)


Lesenswert?

Alternative bei Bussen: Je Node 2 Busse, einer vertikal, einer 
horizontal. Solange die Anzahl Nodes nicht in die Tausende geht ist das 
kein Problem. Und Controller mit 2 gleichen Schnittstellen sind leichter 
zu finden als mit 4. Bleibt dann die Frage, ob du in der Lage bist, 
jedem Bus einen dedizierten Master zuzuordnen, oder ob die alle 
gleichberechtigt sein müssen.

von Dirk (Gast)


Lesenswert?

@AVRFAn: Danke für deine Hilfe, aber bitte halte dich von nun an zurück!

Zu deinem Bus: Mit zuvielen Stichleitungen funktioniert der nicht 
mehr...

Vielleicht sollte ich meine Frage umstellen:
Wie bekomme ich FÜNF UART-Schnittstellen an ein µC? Dies ist für uns im 
Moment die richtige Lösung dafür. Eine andere Idee wäre auch klasse.

Vielen Dank für Eure Antworten.

von Andreas K. (a-k)


Lesenswert?

> Wie bekomme ich FÜNF UART-Schnittstellen an ein µC? Dies ist für uns im
> Moment die richtige Lösung dafür. Eine andere Idee wäre auch klasse.

TL16C554 extern anschliessen. Gibt 1x intern 4x extern. Oder die 
internen durch beliebig viele DS2480 1-Wire/UART Bridges ergänzen.

von opacer (Gast)


Lesenswert?

Software SPI .. pro Kanal werden 3 Leitungen benötigt (wenn man 
SlaveSelect fest auf Masse legt). Ist einfach zu implementieren und 
recht schnell. Für 4 Kanäle braucht man 12 Pins. Evtl. pro Kanal noch 
einen slaveselect leitung, dann sinds 16 leitungen.

Im Softwareprotokoll könnte man ja die Master/Slave zuweisung im Betrieb 
umschalten

von Andreas K. (a-k)


Lesenswert?

Ach ja: Warum eigentlich 5? Weil du irgendwo einen Herrn und Meister 
sitzen hast? Den kannst du auch über einen der 4 anderen Links 
einkoppeln, irgendwie addressieren muss du sowieso.

von Dirk (Gast)


Lesenswert?

@ A-K: Das klingt alles interessant. Jeder µC muss nur mit den vier µCs 
links,rechts,vor und hinter ihm kommunizieren.
Die vertikalen und horizontalen Ringe könnten eine Lösung sein, könntst 
du mir das noch etwas genauer erläutern. Was passiert, wenn nur 3 µCs um 
ein µC herum sind? Geht das dann auch noch.
Das Ziel ist, nicht jedes µC einzeln zu programmieren (außer einer 
individuellen Erkennungsnummer).

von Andreas K. (a-k)


Lesenswert?

> Die vertikalen und horizontalen Ringe könnten eine Lösung sein, könntst
> du mir das noch etwas genauer erläutern. Was passiert, wenn nur 3 µCs um
> ein µC herum sind? Geht das dann auch noch.

Solange du in der Fläche bleibst (also nicht in die dritte Dimension), 
geht alles, egal wieviele Nodes. Dass dabei Ringe entstehen, die nur aus 
einer Node bestehen, stört nicht.

von Dirk (Gast)


Lesenswert?

@ WARUM FÜNF? Wir brauchen an jedem µC einen freien UART an dem wir 
etwas anschließen.

von Andreas K. (a-k)


Lesenswert?

> Jeder µC muss nur mit den vier µCs
> links,rechts,vor und hinter ihm kommunizieren.

Über die unidirektionale Ringstruktur kann eine Node Information nur an 
den rechten und unteren Nachbarn direkt weitergeben und nur von den 
linken und oberen Nachbarn direkt erhalten. An die linken und oberen 
Nachbarn kann er Information nur senden, in dem er in die andere 
Richtung sendet und alle Zwischennodes die Information weiterreichen.

Um Unterschied zu Bussen jedweder Art hat man mit Punkt-zu-Punkt 
Verbindungen wie dieser die Möglichkeit einer automatischen 
Topologieerkennung.

von Andreas K. (a-k)


Lesenswert?

> @ WARUM FÜNF? Wir brauchen an jedem µC einen freien UART an dem wir
> etwas anschließen.

Und das muss unbedingt ein UART sein?

von Dirk (Gast)


Lesenswert?

Ja, wurde mir so gesagt. An dem UART sollen Daten eingelesen werden.

Zur "unidirektionale Ringstruktur" - kann man dann beliebig weitere µCs 
anschließen ohne diese überall von Hand einzuprogrammieren - wenn ja, 
dann könnte das ein Lösungsweg sein.

von Ulrich (Gast)


Lesenswert?

kannst du nicht z.B. anstatt 5 einfach 4 machen und dort wo noch ein 
port frei ist einfach den 5. anschließen?

von Ulrich (Gast)


Lesenswert?

willst du auch noch redudanz erreichen? das wäre nämlich der einzigste 
Grund der gegen Ceien z.B. Can-Bus spricht

von Dirk (Gast)


Lesenswert?

@ Ulrich: Wenn ich durch ein einen Zusatzbaustein noch ein 
UART-Schnittstelle bekomme, dann sollte das gehen. Herr Kaiser hat ja so 
etwas angedeutet, da lese ich mich gerade ein.

von Dirk (Gast)


Lesenswert?

@ Ulrich: Ich weiß ja noch nicht genau wie es gelöst werden soll. Es kam 
bei uns die Idee mit UART auf, da jeder µC nur mit den vier umgebenden 
µCs reden muss.
An CAN hab ich auch gedacht, aber laut Wiki spricht da einiges dagegen, 
viele Stichleitungen zum Beispiel, oder die Kabellänge die durchaus über 
100 m gehen könnte.

von Andreas K. (a-k)


Lesenswert?

> Zur "unidirektionale Ringstruktur" - kann man dann beliebig weitere µCs
> anschließen ohne diese überall von Hand einzuprogrammieren

Klar. Nur sollte jede Node eine eindeutige ID haben, damit sie 
adressiert werden kann. Beim Start läuft in jedem Ring eine 
Topologieerkennung und jede Node kennt danach die IDs ihrer 
unmittelbaren Nachbarn.

von Ulrich (Gast)


Lesenswert?

melde dich mal bei mir per email:
fitBwyXEHfqqQArTsoRx <@>
1337group.de

von Dirk (Gast)


Lesenswert?

@ A-K: Eine eindeutige ID wird jeder bekommen.
Und dies würde auch bei folgender beispielhafter Topologie 
funktionieren?

                ****
                   *
                   **********
                          *
                   *    *****
                       
                   ******
                    
                    
                    
                   ***
Jeder * ein µC. Und beliebig erweiterbar in alle Richtungen (in zwei D 
natürlich)

von Andreas K. (a-k)


Lesenswert?

Wie oft muss ich mich wiederholen?

von Dirk (Gast)


Lesenswert?

@ A-K: Ich wollte nur sicher gehen, dass ich es richtig verstanden habe. 
Vielen Dank für Ihre Mühe.
Könnten Sie mir das nun erläutern, wie wir das ausführen müssen. Oder 
gibt es vielleicht eine Seite im Netz auf der das erklärt wird?

von Michael (Gast)


Lesenswert?


von Tobias P. (hubertus)


Lesenswert?

Naja, was auch gelegentlich gemacht wird ist ein Ring.
Dabei braucht's pro Microcontroller nur einen UART. Tx des ersten 
Controllers geht auf Rx des zweiten, Tx des Zweiten geht auf Rx des 
Dritten ... und vom letzten Controller führt die Leitung wieder zu Rx 
vom ersten Controller.
So kannst du mit jedem Controller kommunizieren (es braucht halt eine 
Adresse dazu).

von Andreas K. (a-k)


Lesenswert?

Benötigt aber einen Master, der die Tolopogie definiert, d.h. den Nodes 
die ID der jeweiligen Nachbarn mitteilt.

von Ulrich (Gast)


Lesenswert?

wie funktionieren die freifunktnetze? Da gibts auch keinen Master und 
trotzdem gehts.....

von Andreas K. (a-k)


Lesenswert?

> wie funktionieren die freifunktnetze? Da gibts auch keinen Master und
> trotzdem gehts.....

Weil dich bei solchen Netzen üblicherweise die Topologie garnicht oder 
nur mittelbar interessiert. Du willst den Kollegen 12345 erreichen, wo 
immer er sitzt, nicht aber den 2 Schritte nach Norden und dann einen gen 
Westen. Wenn jedoch die Anordnung bildhaft relevant ist, muss die auch 
jemand kennen. Oder steckt in der Kommunikationstruktur bereits drin.

von Ulrich (Gast)


Lesenswert?

ok, das wissen wir ja nicht

von Tobias P. (hubertus)


Lesenswert?

@Andreas:
ja, theoretisch schon. Aber das Problem lässt sich einfach lösen:
Die uCs haben (mal angenommen) an allen Portpins integrierte Pullups. 
Nun - du machst eine Software, die über diesen Ring kommunizieren kann, 
und gleich nach dem Reset überprüft die Software erst mal einen 
festgelegten Pin. Ist er unbeschaltet (also High) so "konfiguriert" sich 
die Software auf Slave; ist er Low (Weil man beim Master z.B. einen 
Jumper gegen Masse installiert hat), so wird der uC Master. Und jetzt 
sendet der Master nacheinander Telegramme, die jeweils eine neue Adresse 
enthalten. Der erste Slave leitet das Telegramm nicht weiter, 
stattdessen nimmt er die Adresse und behält sie für sich. Aber alle 
anderen Telegramme leitet er weiter, und immer der nächste Slave, der 
noch keine Adresse hat, nimmt sich die Adresse. Und wenn ein Telegramm 
mit der letzten gesendeten Adresse wieder beim Master ankommt, weiss 
der, dass alle Slaves nun adressiert sind - fertig ist der Ring.
Also ich finde das eine unheimlich intelligente Architektur... Verwende 
ich zwar nicht, weil ich ja eh nur mit einzelnen uCs bastle, aber wenn 
man sowas macht... Einziger Nachteil des Rings:

- Slaves, für die die aktuelle Nachricht nicht bestimmt ist, müssen sie 
weiterleiten  -> belastung der CPU

- Wenn irgendwo im Ring eine Leitung unterbrochen ist, funktioniert der 
ganze Ring nicht mehr....

von Christoph H. (Gast)


Lesenswert?

Hallo Dirk,

Du könntest Dir auch selbst eine 1-Anschluß Schnittstellte basteln. Ich 
habe das mal für die Atmegas experimenthalber gemacht:

http://www.roboterclub-freiburg.de/AtmelAVR/Software/chEinAnschlussKom_V1.0.c.zip

Man könnte die Kommunikation mit den 4 Nachbarprozessoren dann mit 
getrennten Pins realisieren.

Gruß,
Christoph

von markus (Gast)


Lesenswert?

Dürft ich Fragen, was das Projekt für einen Sinn hat bzw. was du 
überhaupt baust?

Ich glaube wenn das geklärt lässt sich vllt. das Problem besser 
analysieren bzw. lösen.

von bas_ratte (Gast)


Lesenswert?

Ich würde Can-Bus oder 1Wire nehmem.

von Horst Gschwandtner (Gast)


Lesenswert?

> Mehrere HUNDERT?? lach Ohne Dir zu nahe treten zu wollen: Ich glaube,
> wenn Du diesem Projekt gewachsen wärst, würdest Du hier nicht solche
> Fragen stellen...

Ich lese erst seit kurzer Zeit mit und wundere mich immer wieder über 
einige Newbies, die verstehen nicht wie ein Pin umgeschaltet wird und 
wollen allerhand entwickeln, oder fragen wie ein Befehl in VB aussehen 
muss um den uP auszulesen. Ich habe mir (noch vor der Internetzeit) 
eigentlich fast alles selbst angeeignet durch Lesen von Büchern, 
Programmierung in meiner Freizeit,...). Vorher ein Elektrotechnik 
Studium, war nützlich für die Grundlagen. Dann habe ich eine Firma 
gegründet und bin jetzt 7 Jahre selbständig und noch nicht Pleite - es 
funktioniert also. Manche glauben hier, alles sei simpel und für jede 
Aufgabe gäbe es einen fertigen Code in der Codesammlung oder im Netz. 
Ohne Know How (wie fließt Strom, HF, uP, Stromteiler, Spannungsteiler) 
ist es schwierig.

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.