Archiv verlassen und diese Seite im Standarddesign anzeigen : Serielle Verbindung von mehreren AVR's - Datenkollision
Ich möchte mehrere AVR's über eine serielle Leitung verbinden.
Zunächst 3 Stück, später vielleicht bis zu 6 Stück.
Die Sendezeiten der Geräte sind unterschiedlich geplant.
Der eine sendet einmal täglich, ein anderer stündlich oder auch sofort wenn ein bestimmtes Ereignis eintritt.
Bisher gebe ich einer seriellen Ringleitung ohne Master den Vorzug, lasse mich aber auch gerne von anderen Varianten überzeugen.
Zur Verhinderung einer Datenkollision habe ich folgende Idee:
AVR 1 hat die Sendebrechtigung, sendet Daten und gibt die Berechtigung an AVR 2 weiter. Dann AVR 2 an AVR 3 …. u.s.w.
Wenn ein AVR nichts zu senden hat, gibt er die Berechtigung sofort weiter.
Ist das eine praktikable Lösung ?
Meiner Meinung haben die AVR's zu viel mit der Sendeberchtigung zu tun und für die eigentliche Aufgabe bleibt zu wenig Kapazität.
Eine andere Möglichkeit ist, die Sendeberechtigung an die Zeit zu koppeln:
eine Minute lang darf AVR 1 senden (wenn er was zusenden hat) danach eine Minute lang AVR 2 u.s.w.
Hat aber den Nachteil, dass bei eintretenden Ereignissen bis zu 6 Minuten vergehen (bei 6 angeschlossenen AVR's) bis die Übermittlung erfolgt. Außerdem muss auf jedem AVR die (gleiche) Uhrzeit laufen.
Gibt es eine Bessere Lösung ?
Ist es evtl. doch besser für die serielle Kommunikation einen Master einzusetzen und die Leitung sternförmig zu planen ?
Welche Entfernung kann seriell überbrückt werden ? Bei mir sind es bis zu 8 m.
Ich danke für jeden Hinweis!
Wer soll denn dann am ende die Daten erhalten?
Die AVR´s untereinander oder ein "wichtiger" Controller.
Es gibt z.B. die Möglichkeit, dass von jedem Controller, also Slave eine Leitung zum Master geführt wird, und dass ein Slave, wenn er was zu senden hat, diese Leitung kurz auf High setzt, der Master registriert dann, dass ein Slave senden will, und fragt alle Slaves ab.
Auch könnte man eine "Anfrageleitung "einplanen, die alle Slaves auf High setzen können.
Problem wäre natürlich, wenn zwei Slaves gleichzeigit diese Leitung betätigen, aber ich glaube, deine Anwendung ist ja nicht so besonders zeitkritisch, also zumindest im Millisekundenbereich und wenn der Master dann alle abfragt, dann wäre auch das kein Problem.
Wie willst du die Serielle Verbindung eigentlich gestalten, soll das UART sein oder I²C oder was anderes?
Wenns um Atmels geht, wäre I²C sicherlich eine Praktische sache, nur weiß ich nicht, wie gut bzw. ob übertragungen über 8m überhaupt funktionieren.
Mfg Thegon
Also bei einer Entfernung von 8m oder mehr würde ich eher sowas wie RS422 oder RS485 nehmen. I2C oder UART halte ich dafür nicht geeignet genug wegen Störungen etc. und vorallem da I2C eher ein Bus ist den man innerhalb eines geschlossenen Gerätes benutzt :D
Und für RS485 oder 422 gibt es ja genug günstige Wandler und ich glaube sogar einige die direkt UART in RS422 oder 485 wandeln, sodass du deine UART Schnittstelle wie gewohnt nutzen kannst.
Mit sowas haben sich schon eine Menge Leute befasst.
Für solche Netzwerke und die möglichen Konflikte gibt es eine Menge Methoden, guck mal unter "Local Area Network" (z.B. Wikipedia)
Dein Ansatz fällt z.B in das Bereich "Token-Ring"
Also bei einer Entfernung von 8m oder mehr würde ich eher sowas wie RS422 oder RS485 nehmen. I2C oder UART halte ich dafür nicht geeignet genug wegen Störungen etc. und vorallem da I2C eher ein Bus ist den man innerhalb eines geschlossenen Gerätes benutzt :D
.
Gemäss www.pci-card.com soll's auch bis 15 m gehen:
"Die erzielbare Entfernung zwischen zwei RS232-Geräten ist wie bei allen seriellen Übertragungsverfahren vom verwendeten Kabel und der Baudrate abhängig. Als Richtmaß sollte bei einer Übertragungsrate von 9600 Baud eine Distanz von 15 bis 30 Metern nicht überschritten werden."
Die Daten sollen zwischen allen AVR's ausgetauscht werden.
Das Projekt soll wenn es fertig ist aus folgenden Modulen bestehen:
- Eine Alarmanlage in einem Gartenhaus
- LED – Uhr auf der Terrasse
- Laderegler für die Solaranlage, Notladung im Winter vom Stromnetz
- SMS/Email-Versand
Zum Beispiel brauchen bei der Uhr die LED's nicht leuchten, wenn keiner da ist. Die Uhr wird dann über die serielle Leitung von der Alarmanlage informiert. Oder der Laderegler meldet einmal täglich die Gesamtladezeit vom Stromnetz zum Versand per SMS oder Email.
Ich habe noch einmal nachgedacht und folgende Lösung:
Die Ringleitung über UART soll so aussehen:
Tx von AVR1 zu Rx von AVR2
Tx von AVR2 zu Rx von AVR3
u.s.w.
bis Tx vom letzten AVR wieder an AVR1 ankommt.
Jeder AVR hat per Software eine Variable „Senderecht“ , die zunächst bei allen „0“ ist, d.h. keiner darf senden.
Nun möchte z.B. die Alarmanlage mit der Kennung „3“ der Uhr mitteilen, dass die Tür verschlossen, keiner anwesend und scharfgeschaltet ist .
Die Alarmanlage sendet ihre Kennung „3“. Die „3“ wird von jedem AVR nacheinander empfangen und in den Ring weitergeleitet. Jeder AVR erkennt, dass die „3“ senden möchte. Ist nun die „3“ wieder bei der Alarmanlage angekommen, erkennt diese dass alle anderen AVR informiert wurden. Sollte z.B. eine „2“ ankommen, dann war ein anderer AVR schneller und dieser erhält zunächst das Senderecht.
Jetzt kann die Alarmanlage die Daten, die für die Uhr bestimmt sind senden, die wiederum durch den gesamten Ring weitergeleitet werden.
Die Uhr erkennt, den Inhalt und schaltet die LED's aus, sendet aber die Daten auch weiter bis sie wieder bei der Alarmanlage als Bestätigung der erfolgreichen Übermittlung ankommen.
Nun sendet die Alarmanlage eine „0“ und andere AVR's können wiederum ein Senderecht „beantragen“.
Was sagt Ihr dazu ???
Nun, das Prinzip wird sicherlich funktionieren, das wird ja auch sonst angewandt.
Ich weiß nur nicht, ob das für dich die beste Lösung ist.
Wie ich das Verstanden habe, schickt ein AVR nach belieben daten in den ring, und wenn diese ihn wieder erreichen, dann sendet er das nächste, solange, bis er nichts mehr zu senden hat. Auch weiß der AVR nicht, ob seine Daten im Ring benötigt werden, und jeder, der sie eben braucht, speichert sie sic z.B. zwischen.
Für deinen Fall villeicht nicht so schlecht, nur wenn ein Teil (z.B. Laderegler) keine lust mehr hat, worum auch immer, dann wird das ganze system nicht mehr funktionieren...
Da hätte ein Master, der daten eben an die AVR´s weiterleitet, schon Vorteile. Wird z.B. die Uhr diese Woche nicht benötigt, so kann sie einfach abgeschaltet werden, ohne, dass die Daten nicht mehr weitergeleitet werden. Auch kann der Master daten nur an avr´s weiterleiten, die sie wirklich brauchen, und sie müssen nicht immer den Ring passieren.
Aber in Puncto erweiterungsfähigkeit wird die Ringschaltung wieder vorteile bringen, man kann ja einfach einen neune AVR in den Ring einbauen, beim Master sind irgentwann die Pins alle...
Na ich will dich keinesfalls von deiner Idee mit dem Ring abbringen, sie ist vermutlich in deinem Falle eine gute lösung, aber sollten doch auch die Vorteile eines Masters im hinblick auf Modularität und debugging bedacht werden.
Viel Erfolg bei deinem Vorhaben!
Mfg Thegon
Gibt es eine Bessere Lösung ?
Ist es evtl. doch besser für die serielle Kommunikation einen Master einzusetzen und die Leitung sternförmig zu planen ?
Welche Entfernung kann seriell überbrückt werden ? Bei mir sind es bis zu 8 m.
Ich danke für jeden Hinweis!
Lese einmal http://de.wikipedia.org/wiki/Controller_Area_Network durch, dort ist beschrieben wie es trotz Daten Kollision klappt und auch Reichweiten bis ca. 1200 m realisiert werden können. Ähnliches kann man etwas simpler auch selber "basteln", muss dann aber in Assembler für eine Bitweise Übertragung und Bitweise Kontrolle derselben sorgen.....Dabei wird einfach Eingang und Ausgang verbunden und beim Senden eines Bit's überprüft ob diese Überschrieben wird. Wenn ja stellt der Sender des überschriebenen Bit's die Arbeit ein und wiederholt sie später.Die Adresse des Empfängers und die Wertigkeit wird durch das erste Byte festgelegt. Es gibt aber auch spezielle CAN BUS Treiber Bausteine, damit klappt das etwas einfacher. :-)
Mit TTY = Strom Schnittstelle (wurde früher in Fernschreibern eingesetzt) und heute noch unter harten Industrie Bedingungen, können auch ca. 1200 m überwunden werden. Dort arbeitet üblicher Weise ein Master der auch gleich festlegt wer jetzt Antworten soll/darf (Polling).
http://de.wikipedia.org/wiki/IEC-625-Bus das ist auch interessant Plotter, Oszilloskope, Laborgeräte wurden (früher?) damit vom PC gesteuert, braucht aber viele Leitungen.
RS232 Ist unter Elektrisch sauberer Umgebung für bis zu 30 m gut, wobei das für PC rs232 +/- 15 V gilt.
RS 485 klappt laut Treiber Hersteller auch bin ca. 1000 m, dabei werden die Daten als Differenzsignal übertragen, für volldublex sind dann 4 Leitungen nötig.
Gruß Richard
021aet04
02.10.2011, 12:45
Der GPIB-Bus (=IEC-625) wird auch heute noch verwendet. Es wird aber nur (hauptsächlich) bei alten Anlagen (Laboren,...) genutzt die schon Geräte mit GPIB besitzen. Mein Präzisionsmultimeter (Fluke 8846A (http://www.fluke.com/fluke/dede/Tischinstrumente/Labor-Multimeter/8845A-8846A.htm?PID=55451)) hat auch so eine Schnittstelle (bezeichnet mit IEE-488 ). Weiter Schnittstellen sind Netzwerk und RS232 (mit USB/RS232 Adapter auch verwendbar). Man sollte auch im Hobbybereich auf aktuelle Schnittstellen achten (USB, Netzwerk, RS485,...) und nicht auf z.B. reine RS232, LPT,... da es in Zukunft immer weniger bis garkeine PC existieren die diese Schnittstellen unterstützen.
MfG Hannes
Powered by vBulletin® Version 4.2.5 Copyright ©2024 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.