Hallo,
eine kurze Frage zu einem seriellen BUS.
Darf man mehrere Controller an denselben RXD bzw. TXD-Pin hängen, so
dass diese alle hardwareseitig verbunden sind, oder stören die sich dann
gegenseitig bzw. machen eine Kommunikation unmöglich.
Es sollen alle an und auf derselben TXD Leitung senden und alle an und
auf der selben RXD-Leitung empfangen.
Das macht man mit 485 Treibern.
Es gibt aber auch spezielle 232 Treiber bei denen man den Sender
abschalten kann. Es darf immer nur ein Sender zur Zeit aktiv sein.
Ich habe auch mal eine Installation mit OC Transistoren an den Sendern
gesehen. Das war dann quasi ein 1-Wire System.
-Alle Empfänger direkt an die Leitung
-Tx über eine Diode an die Leitung
-pullup-Widerstand
So eine einfache Lösung ist natürlich nur in Grenzen nutzbar.
TX_Idle ist normalerweise H. Man kann TX über eine Schottky (K an TX)
mit RX zusammenschalten, das ganze über einen PullUp auf H legen und
mehrere Teilnehmer zusammenschalten. Es braucht dann aber wie bei RS485
ein gutes Protokoll sonst gibts Bitsalat.
Torben Kuhn schrieb:> Alle TX über Diode zusammen, alle RX direkt zusammen. Wo ist das> Problem? Sie können dann halt nicht miteinander kommunizieren.
was dann den Sinn des Busses doch empfindlich stoert.
wendelsberg
Bei vielen Mikrocontrollern kann den Sender deaktivieren. Bei AVR
Mikrocontrollern heisst das ensprechende Bit TXEN.
Du kannst die TxD Ausgänge mehrerer Mikrocontroller direkt parallel
schalten, sofern du sicherstellt, dass immer nur maximal einer davon
seinen Ausgang aktiviert.
Zusätzlich sollte ein Pull-Up Widerstand für einen definierten Pegel
sorgen, wenn kein Mikrocontroller seinen TxD Ausgang aktiviert hat.
Hinzu kommt: AVR Mikrocontroller gehen nicht kaputt, wenn man einen
einzelnen I/O Pin kurzschließt. Sie ziehen in dieser Zeit aber ca.
40-50mA mehr Strom als normal, die Stromversorgung sollte dan also
vertragen können.
> Moment, ich möchte nicht RX mit TX verbinden, sondern mehrere TX> Leitungen zusammenführen. Und ebenso für mehrere RX-Leitungen.
Wie jetzt, so?:
1
Bus RxD ---+-------+-------+---------[===]---o VCC
2
| | | 2x 4,7k
3
Bus TxD ---|--+----|--+----|--+------[===]---o VCC
4
| | | | | |
5
Rx Tx Rx Tx Rx Tx
6
µC 1 µC 2 µC 3
So geht das nicht, denn dann ist niemand da, der auf die TxD Signale
hört und es ist niemand da, der auf RxD was sendet.
Wenn schon, musst du alles parallel auf eine Leitung legen:
1
Bus Bidirektional ---+--+----+--+----+--+---------[===]---o VCC
Stefan U. schrieb:> So geht das nicht, denn dann ist niemand da, der auf die TxD Signale> hört und es ist niemand da, der auf RxD was sendet.
Das meinte ich mit:
wendelsberg schrieb:>> Problem? Sie können dann halt nicht miteinander kommunizieren.>> was dann den Sinn des Busses doch empfindlich stoert.
wendelsberg
> Würde es also so wie im Anhang gezeigt funktionieren?
Nein.
Du brauchst einen Pull-Up Widerstand und die Dioden müssen anders herum
gepolt werden.
Aber wenn du die Transmitter deaktivieren kannst, sind die Dioden nicht
nötig. Das brächte "bessere" (niedrigere) Low Pegel, steilere Flanken,
niedrigere Impedanzen und damit letzendlich weniger Störanfälligkeit.
Könntest sowas machen:
http://www.gfai.de/~heinz/publications/papers/2014_swart.pdfwendelsberg schrieb:> Torben Kuhn schrieb:>> Alle TX über Diode zusammen, alle RX direkt zusammen. Wo ist das>> Problem? Sie können dann halt nicht miteinander kommunizieren.>> was dann den Sinn des Busses doch empfindlich stoert.>> wendelsberg
Naja. Oft gibt es ja ohnehin einen Busmaster, der der Reihe nach alle
Slaves anspricht, da wäre das dann also egal. Ist halt die Frage, ob man
es so will oder ob die Slaves untereinander kommunizieren können sollen.
Dann muss man sich aber darum kümmern, dass Kollisionen irgendwie
gehandhabt werden...
scheint mir so, als ob eine Softwarelösung am günstigsten ist.
Wichtig ist also, dass die von mir gewählten Controller einen
abschaltbaren TX-Pin besitzen.
Wenn ich also einen schnellen Überblick bekommen möchte, genügt es dann
zu gucken, ob der TX-Pin als altenrnate Function mit einem normalen
I/O-Pin belegtbar ist?
Wiviele Teilnehmer?
Soll jeder mit jedem reden können oder alle minus 1 mit einem? So
interpretiere ich das jedenfalls, wenn ich mir Deine Zeichnung anschaue.
Hier ein Beispiel für 3 Teilnehmer. Die Zahlen beziehen sich auf die
normale DB25 Buchse. Die Handshake Leitungen kann man weglassen. Bei
mehr als 3 Teilnehmern entsprechend ergänzen.
(Stammt aus dem Handbuch zu TheNet 1.19)
BUS schrieb:> scheint mir so, als ob eine Softwarelösung am günstigsten ist.
Software muss auf jeden Fall im Spiel sein, von alleine geht
normalerweise garnix.
> Wichtig ist also, dass die von mir gewählten Controller einen> abschaltbaren TX-Pin besitzen.
Entweder das oder eben die Entkopplung per Dioden + PullUp. Die Software
wird geringfügig einfacher bei der Entkopplung per Dioden, weil sie sich
dann eben nicht um die Pinsteuerung kümmern muss. Besser ist aber
natürlich, diesen Aufwand auch noch zu implementieren, wenn die
Fähigkeiten des Controllers es zulassen.
> Wenn ich also einen schnellen Überblick bekommen möchte, genügt es dann> zu gucken, ob der TX-Pin als altenrnate Function mit einem normalen> I/O-Pin belegtbar ist?
Nein. Du brauchst ja auf jeden Fall den Empfänger der UART. Der zweite
springende Punkt ist also, dass sich TX- und RX-Pins unabhängig
voneinander als GPIO nutzen lassen.
Das ist manchmal garnicht so einfach heraus zu bekommen, da es durchaus
verschiedene Mechanismen dafür geben kann. Neben dedizierten Steuerbits
wie z.B. TXEN und RXEN bei den AVR8 kann die gleiche Sache u.U. auch
durch variable Pin-Mappings realisiert werden.