Forum: Mikrocontroller und Digitale Elektronik Kommunikation mehrerer AVRs


von sebezahn (Gast)


Lesenswert?

Hi,

eigentlich dachte ich, die AVRs langsam aber sicher zu verstehen, doch
nun habe ich ein Problem und weiss einfach nicht, wo ich überhaupt
ansetzen soll. Vielleicht kann mir einer helfen:

Ich möchte ein "größeres" Projekt realisieren, das nicht nur einen,
sondern ungefähr 5 AVRs verbraten wird. Die müssen untereinander
kommunizieren, allerdings nicht jeder mit jedem, sondern die vier mit
der "Hauptplatine" und dem dortigen AVR. Wenn man so will, also
Sternförmig. Ich programmiere den ganzen Kram in BASCOM und möchte auch
erst mal nicht davon weg.

Die AVRs sind alle auf einer Platine, es müssen also nicht größere
Entfernungen überbrückt werden. Was ich aber brauche, ist eine Routine,
mit der ich einfach einen Buchstaben oder eine Zahl an einen anderen
Prozessor schicken kann oder von dem empfangen kann. Das ganze muss
nicht über einen Interrupt laufen, sondern kann gepollt werden.

Was würdet Ihr mir raten, wie ich das realisiere? Hat jemand vielleicht
ein verständliches Beispiel in Bascom? Ich kenne inzwischen die
Begriffe I2C, CanBus etc., habe sogar darüber nachgedacht, den Kram per
RS232 zu verschicken... Aber ich habe leider nichts richtig zum laufen
gekommen.

Als Basis sollen übrigens 2313er dienen, der "Hauptprozessor"
vielleicht ein größerer...

Vielen Dank!
Sebezahn

von Oryx (Gast)


Lesenswert?

Hi Sebezahn,
da hast Du Dir ja was vorgenommen.

Das mit dem Master und den 4 Slave ist schon mal gut. Dadurch ist der
Ablauf schon mal klar. Der Master ist Chef im "Ring". Er steuert die
Datensendungen und Anfragen.

Nun muß noch jeder Slave wissen, wer er ist. Entweder über Adressjumper
oder fest im Programmcode.

Bei mir verwende ich RS485 Treiber für den Datenbus. RS232 ist
ungeeignet, da Du damit nicht mehrere Teilnehmer auf eine Leitung
bekommst. Zwei Ausgänge trieben gegeneinander.

Softwareansatz:
Master sendet:
"M","1","D","x"   Master an Adresse 1 "D" Daten und x als
Wert. Auf das "M" kannst Du deine Empfänger triggern lassen. Die
eigentlichen Daten sollten kein "M" enthalten

"M","3","A","x"   Master erwartet Daten von Adresse 3 "A" wie
Anfrage


Slave antwortet:
"S","3","A","v"   Slave 3 Antwortet und sendet das "v"
Die anderen Slaves reagieren nicht, da sie auf das "M" warten.

Eine klare Trennung von Steuerzeichen und Datenzeichen vereinfacht die
ganze Sache. Wenn Du in den Datenzeichen auch M, A, oder Ziffern
zulässt, wird die Sache schnell aufwendig.

Ein viel infacheres Konzept fällt mir nicht ein. Ich habe so etwas auf
einem 2313 realisiert. Mit dem AVRGCC. Er ist dann aber schon recht
voll. Noch ein bisschen Anwendung, dann ist er voll. Wie effektiv Dein
BASCOM ist, weiss ich nicht.

Oryx

von flinkflash (Gast)


Lesenswert?

Servus,

ich empfehl dir dafür den TWI(I2C) Bus. Bei mir läuft ein PC als Master
und 6 AVR's als Slaves. Fertige Bibliotheken gibt es dafür auch.
Verwenden tu ich allerdings nur C Code.

cu
flinkflash
http://www.krabbelbot.de

von sebezahn (Gast)


Lesenswert?

Hi,

vielen Dank, ich versuche mich mal, durch dieses RS485 durchzufressen.

Gruß
Sebezahn

von Peter D. (peda)


Lesenswert?

Wenns 2313 sein sollen, scheidet I2C aus, ist zu aufwendig als Slave in
Software.


RS-485-Treiber sind Perlen vor die Säue, wenn alles auf einer Platine
sitzt. Da ist 5V-Pegel sicher genug.

Am einfachsten, TXD aller Slaves gehen an RXD des Masters und alle RXD
der Slaves gehen an TXD des Masters.


Der Master sendet, wie er lustig ist. Die Slaves erst, wenn sie vom
Master dazu aufgefordert wurden und dann auch nur einer zur Zeit.

Wichtig !
Erst wenn ein Slave senden soll, setzt er sein TX enable, damit nur ein
TXD-Pin als Ausgang arbeitet. Alle anderen schalten den Pull-Up ein,
damit der Pin nicht floatet wenn keiner sendet.


Bist Du sicher, daß Du mit einer besseren Programmiersprache (C mit
WINAVR) nicht doch alles mit einem AVR erschlagen kannst ?


Peter

von crazy horse (Gast)


Lesenswert?

sehe ich ähnlich, habe aber auch schon Anwendungen gehabt, wo es 3
Prozessoren sein mussten.
Ich habs mit SPI gelöst, der master war ein 8535, 3 slaves 2313 (mit
Software-SPI).
Kommunikation ging nur vom Master aus, dementsprechend waren
Buskonflikte kein Thema.
SCK und MOSI vom master zu den slaves, dazu 3 /CS-Signale. MISO wurde
bei allen slaves einfach parallel geschaltet, und vom slave nur bei
aktiviertem /CS aktiviert.
Habe ich aber hauptsächlich deshalb benutzt, da im Gerät sowieso schon
einiges über SPI lief und die UART auch schon anderweitig benutzt
wurde.
Alternativ könnte man auch einen Ring bilden, immer MOSI an MISO, Takt
an alle gemeinsam.

von sebezahn (Gast)


Lesenswert?

hmm... beide Lösungen finde ich sehr gut, ich habe mich jetzt mal mit
der Ring-Alternative beschäftigt und einen RS232-Ring gebaut. Das
Protokoll dafür habe ich fertig geschrieben, und im Emulator
funktioniert auch alles so, wie es soll...

Oder geht das gar nicht und ich habe einen denkfehler? Normalerweise
müsste man doch die Txds und Rxds in einem Ring aufbauen können, oder
nicht?

Aber die sache mit allen TXds am Master RXd und umgekehrt gefällt mir
auch... Zumal das "Ring"-Programm, das ich geschrieben habe, auch
damit funktionieren würde. Wenn also irgendetwas gegen den Ring
spricht, dann bitte ich um Aufklärung ;-)


@peter dannegger
Ja, auf dauer möchte ich auch auf C umsteigen, zumal ich beruflich am
PC damit arbeite und somit nicht wirklich Probleme bei der Syntax habe.
Aber bevor ich jetzt wieder etwas neues anfange, will ich erst mal ein
Projekt mit bereits erworbenem Wissen durchbekommen.

Vielen Dank für Eure Antworten,
Sebezahn

von Gerd Vergin (Gast)


Lesenswert?

Hallo,

ich steuere über eine Funkstrecke bis zu 999 Slave's, hierzu benutze
ich die serielle Schnittstelle mit den beiden Signalen TXD und RXD.

Der Master überträgt einen "Befehlsbuchstaben" gefolgt von einer
Geräteadresse und einem Code zur Befehlausführung.
Die Slave-Geräteadresse ist in jedem Slave im EEPROM hinterlegt.

Bei Bedarf meldelt sich nur der wirklich angesprochene Slave, alle
anderen Slave's ignorieren den Befehl weil für sie nicht die
Geräteadresse passt.

Manche Befehle gelten für alle Slaves, so zum Beispiel SLEEP oder
RESET, hier entfällt natürlich die Adresse zur Selektion.

Ich habe das in ASM programmiert und läuft auf 4433 hervorragend.

Gruss

Gerd

von Peter D. (peda)


Lesenswert?

"Wenn also irgendetwas gegen den Ring
spricht, dann bitte ich um Aufklärung ;-)"

Der Ring hat den Nachteil der höheren CPU-Last, da alle Slaves auch die
nicht für sie bestimmten Daten durchreichen müssen.

Auch ergeben sich dadurch größere Durchlaufzeiten, jeder Slave sendet
ja um mindestens 10 Bitzeiten verzögert weiter.

Und wenn ein Slave abschmiert, sind auch alle anderen tot.

Sind alle Slaves parallel, kann man den 9-Bit Modus mit Adreßerkennung
nehmen. Dann kriegen die nichtadressierten Slaves nicht mal mehr einen
Interrupt bei nicht für sie bestimmte Daten.


Für den Master kann man auch einen AVR mit 2 UARTs nehmen (ATMega162),
dann ist die eine z.B. für Verbindung mit dem PC übrig.


Peter

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.