Hallo Forum, ich würde gerne eure Ratschläge zur Lösung folgenden Problems wissen: Gesucht ist eine Busarchitektur für Netzwerk aus Mikrocontrollern, AVR 8 Bit. Die sieht so aus dass es einen Master gibt (ATmega64) welcher mit einer seriellen Verbindung gesteuert wird und bei dem an der zweiten Verbindung das Netzwerk angeschlossen ist. Dieses besteht aus vielen (ich sag mal ne Zahl: max. 254) Knoten angeschlossen sind. Diese bestehen aus unterschiedlichen Controllern, Tiny ... . Die Entfernung zu den Knoten ist nicht weiter als ca. 1 m um den Master herum. Wie ihr euch vorstellen könnt, wird das ganz schön voll, deshalb soll der Aufbau möglichst klein und einfach sein (und nix kosten, wie immer). - Ich haben noch einen Vorrat an 6-pol Micro-Match Steckern und Buchsen rumliegen, die würde ich gerne Verwenden. Auf der Master-Platine sollen eine Reihe (vllt so ca. 15) Steckverbinder vorhanden sein, die in alle Richtungen weggehen. Auf diesen Flachbandkabel können sich dann beliebige Knoten aufstecken. 2 Pole Gnd, 2 Pole +5V, Busleitung Rx/Tx, LED. - Einzelne Teile der Busses müssen einfach abtrennbar sein (herausnehmbar). - Die Architektur soll gemischt sein, also weder Stern noch linear. Das geht wegen des Platzbedarfs nicht. - Der Stromverbrauch der einzelnen Knoten hält sich Grenzen, max. 10 mA geschätzt. - Es werden auch nur geringe Mengen an Daten übertragen und auch nicht zeitkritisch. - Datenflussrichtung ist in der Anwendung nur vom Master zu den Knoten, währende der Konfiguration auch umgekehrt. - Das ganze ist ein Bastelprojekt, wird nicht verkauft und auch nicht in großen Stückzahlen hergestellt. - Die Knoten kann ich einzeln bei der Produktion mit unterschiedlichen Adressen versehen. Ich dachte so an RS458 ohne Treiber, RxTx-Umschaltung über das Protokoll geregt (die AVR können ja einigermaßen Last treiben) mit fester Adressierung über 8-Bit-Adressen 38400Bd 8N1. Kann das funktionieren? Oder muss ich Bustreiber verwenden? Wie gesagt ich möchte es möglicht einfach halten.
Rangi Jones schrieb: > Ich dachte so an RS458 ohne Treiber, RxTx-Umschaltung über das Protokoll > geregt (die AVR können ja einigermaßen Last treiben) mit fester > Adressierung über 8-Bit-Adressen 38400Bd 8N1. > Kann das funktionieren? Oder muss ich Bustreiber verwenden? Wie gesagt > ich möchte es möglicht einfach halten. Mal davon abgesehen das ein differenzieller Bus wie RS485 nicht mit Logigausgängen zu machen ist ... 254 Slaves an einem Sender ohne Treiber ? Brrr, stop, alles auf Anfang ! Es fehlt Dir sehr viel Grundlagenwissen über Bussysteme im allgemeinen und RS485 im speziellen. Da lauern 254 Fallstricke, mindestens. RS485 ist nicht schlecht wenn Du mit einfachen UARTs auskommen willst. Treiber müssen sein und max 32 Busteilnehmer. Bis zu 128 je nach Treiberbaustein. Eine klare Busstruktur mit Terminierung an den Enden, oder Probleme ohne Ende. Zur Not eine komplexe Terminierung (RC) und sehr niedrige Datenraten (2400 / 9600 Bps) wenn es denn eine chaotische Verkabelung sein soll. Fehlererkennung, Behandlung, Buszugriffssteuerung etc. pp ist nicht trivial. Der Kram soll doch auch irgendwann mal länger als 5min am Stück laufen. Du kannst Dir viel ersparen wenn Du auf CAN gehst, was die Sache aber relativ teuer macht. Les erstmal die Applikationsschriften der Hersteller (z.B. TI) und fange klein an. Für ernsthafte Ratschläge solltes Du dem Forum mitteilen was Du vorhast, wie lang Deine Verkabelung werden kann etc. pp.
Ueberleg dir ob RS-232 da die beste Loesung ist. Ich wuerde es mit I2C machen. Dann kannst du mittels I2C Multiplexer die bus einfach auf viele Slaves erweitern. Die I2C Multiplexer teilt deine bus damit du mehrere chips mit gleichem I2C adresse benutzen kannst. Auch gibt es dann die moeglichkeit zu 'scannen' welche Slaves anwesend sind. Zufaelligerweise verkauft man bei www.i2cchip.com I2C Multiplexer die schon mit deine 6-Polige Micromatch Konnektoren funktionieren. Wenn du dann auch noch die slaves 2 Micromatch connectors gibt kannst du die naechte Modul einfach dran anschliessen. Und einen tip : mach dir die Adressierung mittels schlater/jumpers, das macht die debugging viel einfacher. Wenn man mit die Multiplexer arbeitet bracht man nicht soviele moegliche adressen pro slave Patrick
Okay, das Schlagwort RS485 war wohl zu viel. Das nehme ich zurück. Eine
Leitung auf der entweder der Master redet oder einer der Slaves. Und
dann werden ja stromtechnisch auch nicht alle getrieben, sondern nur ein
abgang vom Master. Da sollen ja so ca. 15 Stecker drauf sein. Logisch
ein Bus, aber physisch schon einzelnen Treiber die aber alle das gleiche
senden. Auf den Knoten, da sieht es anders aus, hier soll der Ausgang
die Busleitung auf GND ziehen, also alle an diesem "Subbus". Wenn du so
willst 30 Stk. und den Master.
> Für ernsthafte Ratschläge solltes Du dem Forum mitteilen was Du vorhast,
wie lang Deine Verkabelung werden kann etc. pp.
Steht doch da! Maximal 1m.
Mit CAN hab das schon umgesetzt. Seriell über CAN-Transceiver.
Funktioniert super, aber zu viel Hardware und zu viel Strom für diese
anwendung.
@ Patrick C
kein Platz für Jumper oder Mäuseklavier auf den Knoten, keine freien
Portpins.
@ Patrick C ATtinys habe keine I2C Hardware an board. Dann muss ich die I2C in Software machen. Das macht keinen Spass bei 100kHz. Ausserdem brauche eine Leitung mehr. Bei der UART ist es schon was anders, die Tinys haben zwar auch diesen nicht an Board, aber ein Timer genügt, da kein Duplex verwendet wird.
Wenn du keine hohen Datenraten hast: mach dich nicht verrückt. - Du brauchst (gerade bei den genannten Leitungslängen) keine Terminierung (wenn es nicht gerade MBit/s sein sollen) - Du sendest nur in eine Richtung, deswegen brauchst du keine Arbitrierung I2C oder UART auf TTL-Pegel wären meine Wahl. I2C ist mit 7-bit-Adressen für 128 Knoten ausgelegt, mit 13-bit-Adressen reicht es dir in jedem Fall. Vorteil: der Slave kann dir die Adressverarbeitung in Hardware abnehmen. Nachteil: zwei Leitungen. UART (seriell) ist eine Leitung weniger, du musst aber mehr vom Protokoll selbst implementieren (z.B.: erstes Wort Adresse, zweites Wort Befehl). Sollte aber auch ohne Probleme funktionieren, so lange du keinen Rückkanal brauchst. Was die Treiber angeht: entweder rechnen oder experimentieren. Die Leitungen und die IC-Eingänge haben eine gewisse Kapazität (siehe Datenblatt), die IC-Eingänge ziehen außerdem noch einen kleinen Strom (siehe ebenfalls Datenblatt). Wenn du weißt, was dein Ausgang treiben kann (siehe...), rechne aus, nach welcher Zeit der Spannungspegel über bzw. unter der Schaltschwelle der Empfänger (siehe...) ist. Da noch ein Sicherheitsfaktor drauf, und du kennst deine maximale Datenrate. Wenn die nicht reicht, muss eben noch ein Treiber dazu. CAN ist für die beschriebene Anwendung vermutlich ziemlich übertrieben. Im Auto würde wohl (du schreibst leider wenig über die genaue Anwendung - blinkender Weihnachtsbaum?) LIN verwendet. Max
Ist es evtl sinnvoll einen Pull-Up-Widerstand auf dem Master zu setzen und dann einen FET, der die Busleitung auf GND zieht? Jeder Slave bekommt dann ebenfalls einen FET, aber keinen (oder nur sehr großen Pull-Up)? Master Knoten 5V ----+-----------~ ~------------------------- | R | Data in ---+-----------~ ~-------------------+--- Data in | | |- -| Dataout -| |- Data out |- -| | | GND -------+-----------~ ~-------------------+-- Vorteil: keine Buskurzschluß möglich Nachteil: zwei PortPins auf den Knoten werden benötigt ist der Pull-Up klein genug? Was sollte man da wählen?
Achso ja, vergessen, die Anwendung: Modellbau Lichtersteuerung für allgemeine Anwendung, z.B. ein Häuserblock Ampel oder ein Rummelplatz, bei dem einzelne Elemente von jeweils einen Knoten erledigt werden. z.B. ganz einfach eine Ampelkreuzung: eine Ampel bekommt einen Knoten mit 3 LEDs Der Master kennt dann 4 Ampeln pro Kreuzung mit je 3 LEDs die z.B. an einem "Subbus" hängen. Der Knoten ist als Ampel programmiert und hat einen logischen Eingang: Stop oder Fahrt. Der Master sendet dann nur den Befehl "Fahrt" und das Lichterspiel macht der Knoten alleine. So eine Kreutzung ist dann prinzipiell abtrennbar und austauschbar über nur einen kleinen Stecker.
Rangi Jones schrieb: > Ist es evtl sinnvoll einen Pull-Up-Widerstand auf dem Master zu setzen > und dann einen FET, der die Busleitung auf GND zieht? Jeder Slave > bekommt dann ebenfalls einen FET, aber keinen (oder nur sehr großen > Pull-Up)? ??? I2C funktioniert so, wie du es beschrieben hast. Zum Thema Pullup hatte ich schon was geschrieben (ersetze dabei "Treiber" durch "Pullup"). Wozu brauchst du am Slave einen FET, wenn der nur empfangen soll? Max
Rangi Jones schrieb: > @ Patrick C > ATtinys habe keine I2C Hardware an board. Dann muss ich die I2C in > Software machen. Das macht keinen Spass bei 100kHz. Ausserdem brauche > eine Leitung mehr. > Bei der UART ist es schon was anders, die Tinys haben zwar auch diesen > nicht an Board, aber ein Timer genügt, da kein Duplex verwendet wird. Dann nimm doch andere Controller. Ganz nett sind zB PIC24F04KL100. Kleine 16 Bitter mit 14 Pins, haben I2C, SPI, UART mit LIN-Hardware-Support. LIN wäre genau so ein 1-Draht-seriell Bus, wie er Dir vorschwebt. Wird im Automobilbereich gerne verwendet. Du brauchst ihn ja nicht mit 12V zu implementieren, sondern nur mit 5V. Und als Master dann einen PIC24FJ256GA106 beispielsweise. fchk
Rangi Jones schrieb: > ATtinys habe keine I2C Hardware an board. Dann muss ich die I2C in > Software machen. Das macht keinen Spass bei 100kHz. Ausserdem brauche > eine Leitung mehr. Aber doch nur die ganz,ganz kleinen. Die ATtiny 25,45,85 haben doch schon Hardwareunterstützung: http://www.mikrocontroller.net/articles/USI Ausserdem ist 100khz nur die default-Maximalgeschwindigkeit. Du kannst deinen Bus auch mit 10khz fahren wenn du willst.
Ich habe gerade im Datenblatt des Atmega16 von einem Multi-processor Communication Mode des UART gelesen. Vieleicht könnte Dir das auch was nutzen? zu Rangi Jones Pull up: auch der LIN Bus bzw. K-Line (Automotiv) sind so aufgebaut; (wired AND) ca. 20kBaud
Ja, das mit dem LIN ist so wie ich mir das vorgestellt habe. Was hat der LIN für einen Pull-Up-Widerstand? Ich habs auf die schnelle nicht gefunden. Der Multi-Processor Mode würde u.u. schon helfen, jedoch löst dieser das Bus-Problem nicht. Das ist dann schon Protokollebene. Dann werde ich das wohl mal ausprobieren müssen, wieviele Eingänge ein Ausgang in welcher Geschwindigkeit treiben kann.
Rangi Jones schrieb: > Ja, das mit dem LIN ist so wie ich mir das vorgestellt habe. Was hat der > LIN für einen Pull-Up-Widerstand? Ich habs auf die schnelle nicht > gefunden. 1k laut Standard. > Der Multi-Processor Mode würde u.u. schon helfen, jedoch löst dieser das > Bus-Problem nicht. Das ist dann schon Protokollebene. Außerdem kann der AVR UART nicht alle Details des LIN-Busses. Nicht ohne Grund hatte ich Dir PIC24 nahegelegt. Ist im Prinzip ein AVR mit doppelt so viel Bits und dreimal soviel Speed und deutlich besseren UARTS mit mehr Fähigkeiten. > Dann werde ich das wohl mal ausprobieren müssen, wieviele Eingänge ein > Ausgang in welcher Geschwindigkeit treiben kann. Denke dran, dass Du einen Open Collector Ausgang brauchst. Lade Dir auf www.lin-subbus.org den Standard herunter und schau in Abschnitt 6.5 "LINE DRIVER/RECEIVER" nach. Oder schau Dir einen kompletten LIN-Transceiver wie den Microchip MCP2021A (mit eingebautem VREG) oder MCP2003A (ohne VREG) an. fchk
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.