Archiv verlassen und diese Seite im Standarddesign anzeigen : RS232 Master/Slave
Hi,
hatte die Idee 2 oder mehr MAX3232 auf der TTL Seite parallel zusammenzuschließen, um damit eine Master/Slave Kommunikation aufzubauen. Aber aus irgendeinem Grund, geht das bei mehr als 2 MAX3232 (3xRX an einem TX bzw 3xTX an einem RX) nicht mehr.
Kann mir vielleicht jemand auf die Sprünge helfen, was da schief läuft.
Danke sast
Der gerade nicht sendende Controller hält seine Leitung auf einem festen Pegel, sodass die Ausgangstreiber gegeneinader arbeiten, wenn der zweite auf der selben Leitung senden will.
ok.
Gibts da eine Lösung, wie ich die Schaltung trotzdem parallel aufbauen kann.
Sonst müsste ich das gesamte Protokoll ändern.
Die Zusammengeschalteten TX-Leitungen mit je einer Diode entkoppeln &
mittels Pull-Up (oder Pull Down) vorspannen.
Das 'zeitmultiplexen' & Protokoll ist Aufgabe der SW.
Danke.
Was für einen Pull-Up nimmt man denn da bei 3,3V Versorgungsspannung.
Wieviel Eingänge kann ich denn an einen RX_OUT hängen, ohne auch da Probleme zu kriegen, da hängen auch noch ein paar Controller dran.
sast
Vom Gefuehl her wuerde ich einen 500 Ohm ... 1 KOhm nehmen - sind ca. 6 ... 3 mA. Das sollten alle Ausgaenge gegen Low treiben koennen. Die
Groesse ist von den beteiligten Ein & Ausgaengen sowie von der Frequenz
abhaengig.
Heinz
gut, jetzt hab ich die einzelnen TX über Dioden N4148 ausgekoppelt. Dadurch entsteht aber ein neues Problem. Der Low-Pegel liegt jetzt um die Diodenspannung über Null und das interessiert den RX vom MAX3232 nicht mehr. Gibts da auch wieder eine einfache Lösung, den Pegel weiter runter zu bekommen. Der Pull-Up ist 560Ohm.
Danke sast
Shottky Dioden hast Du nicht bei der Hand ? Da reduziert sich
der Spannungsabfall < 0,3V (Ge-Spitzendioden gehen auch).
Danke erst mal für die schnellen Antworten.
Und für die Si Dioden Variante gibts wohl keine Lösung?
Wäre mir eigentlich am Liebsten, wenn mir da jemand weiterhelfen könnte. Irgendwie muss man doch den Pegel verarbeiten können. Muss ich ja nur einmal machen, am RX zum Master.
sast
kalledom
20.06.2006, 17:46
Warum nimmst Du für die RxD-Leitungen keine 74HC... (N)AND- / (N)OR-Gatter ? 74HC... funktioniert zwischen 2,0...6,0 V.
Leider ist mir nicht bekannt, ob im 'Ruhezustand' Low- oder High-Pegel an den RxD-Ausgängen der MAX232 anliegt. Das kannst Du aber nachmessen und entsprechend (N)OR oder (N)AND einsetzen.
Hatte ich auch schon überlegt, als ich mir so die Dioden nebeneinander gemalt hatte. Aber leider hab ich keinen Platz für einen weiteren IC. Maximal noch was acht-beiniges.
sast
Was für Geräte hängen denn an den einzelnen Leitungen? Wenns Microcontroller etc. sind, könntest du ihre Sendeleitungen vorübergehend deaktivieren, wenn ein anderer gerade senden will. Ansonsten könntest du nen MAX3222 mit Shutdown-Eingang nehmen, der sich deaktivieren und hochohmig schalten lässt.
Das Problem ist, dass alles schon soweit aufgebaut ist und auch schon durch einfaches Zusammenschalten funktioniert hat. Jetzt ist ein neuer MAX3232 dazugekommen und da geht es nicht mehr. Der Grund ist mir schon klar, aber ich möchte nicht alles nochmal umbauen. Die Sache mit den Dioden als Entkopplung leuchtet mir ein, bringt aber als Nebeneffekt die Spannungsanhebung um die Diodenflussspannung mit sich, so dass ich keinen ordentlichen Low-Pegel mehr habe. Die Lösung sollte also eine Pegelverschiebung sein.
Leider bin ich mit Platz nicht sonderlich gesegnet, so dass der Vorschlag von Karl-Heinz nicht geht.
Auf der anderen Seite wird es auch schwierig eine separate Zuschaltung der TX Pins zu bewerkstelligen, da die MAX3232 dezentral platziert sind. Die Slaves sind zum Teil selbstprogrammierte MCs aber auch Motormodule mit einer RS232 Schnittstelle.
Kann man da vielleicht was mit einem Transistor machen, oder mit einem OPV. Die Baudrate beträgt 9600.
sast
Nein, das Problem ist, dass RS232 ein Quasi-Standard ist, der eine Schnittstelle zwischen genau ZWEI Geräten definiert. Für Deine Anwendung kommt wohl nur ein Halbduplex-Übertragungsverfahren, wie es die RS485 nahe legt, in Frage. Solange Du an jedem Gerät eine dedizierte Sende- wie Empfangsleitung hast (RS232, RS422), wirst Du nie ohne abenteuerliche Tricksereien eine bidirektionale Kommunikation in jedem Kanal zustande bringen. Andere Systeme, die klar definierte Sende- und Empfangskanäle haben, sind zB Ethernet über Twisted-Pair Leitung (xBase-T), nur braucht man da bei mehr als zwei Teilnehmern einen Hub, der die gesendeten Daten den Empfängern zukommen lässt.
Also eine Kommunikation mit einem PC als Master und mehreren MC-Slaves auf der anderen Seite des MAX3232 hab ich bereits funktionstüchtig in Betrieb.
Was jetzt neu ist, ist dass ich mehrere Pegelwandlungen brauche, um die Motoren in die Kommunikation einzubeziehen. Man könnte sich anstelle der Motoren auch PCs vorstellen.
Die Kommunikation ist so aufgebaut, dass immer nur der Slave reden kann der auch vom Master gefragt wurde. So dass Kollisionen ausgeschlossen sind. Es werden nie mehrere Slaves mit einmal angesprochen.
Ziel ist es nun, in die Slavekette auch einige MAX3232 einzubauen und somit die Motoren einzubinden.
sast
Hallo sast!
Es müsste mit einem Transistor als Emitterfolger gehen. Es wird aber wieder der high Pegel um ca. 0.7 V niedriger. Es ist aber vielleicht zulässig. Der Rd (pull down) muss auf dem Eigang low Pegel garantieren, wenn der Transistor nicht leitet. Bei so niedriger Baudrate kann der Ru (pull up) auch grösser werden (4,7...10 kOhm). Ganz "saubere" Lösung gibt es (wegen invertierenden Wirkung eines Transistors) nur mit zwei Transistoren.
MfG
Hallo PICture,
kannst du dass bitte mit einer kurzen Skizze verdeutlichen, wo die R's hängen.
Danke sast
Sorry! Ich habe das schon geskizzed, aber nicht mitgepostet... :)
VCC VCC
+ +
| |
.-. |
Ru | | |
| | |
'-' |
D | |/
>-----|<--+-|
| |>
D | |
>-----|<--+ +----->
| |
D | .-.
>-----|<--+ | |Rd
| |
'-'
|
===
GND
Hallo PICture,
danke erst mal. Soweit ist das klar. Kann ich nun zum invertieren einfach noch einen Transistor dahinter hängen?
sast
Edit: Sorry, aber hab gerade gemerkt, dass da doch gar keine Invertierung vorliegt. Frage ist somit sinnlos.
Diese Schaltung invertiert nicht, da der Transistor als Emitterfolger arbeitet. Das heisst, dass auf dem Emitter eine Spannung=Basisspannung - 0.7V ist. Deswegen wird bei 0V auf einem der Eingänge auf der Basis +0,7V und auf dem Emitter wieder 0V. Bei z.B. +3,3V auf der Basis wird auf dem Emitter aber nur +2,6V. Wenn das nicht als high Pegel angenommen wird, muss man das mit zwei Transistoren realisieren, das ist aber ganz andere Schaltung. Probiere, bitte, ob das so funktioniert, sonst skizze ich das mit zwei Transistoren.
Danke PICture,
hatte es auch gerade gemerkt. Ich muss mir sowas immer aufmalen, um dahinter zu steigen. Hab mich da halt von deiner vorhergehenden Antwort leiten lassen. Werds mal ausprobieren.
sast
Hallo sast!
Ich habe die "saubere" Lösung auch schon geskizzed. Die Beiden Transistoren arbeiten hier als Inverter. Bei dem T1 ist seriell mit Basis noch eine Diode Db geschaltet, um die Schwellenspannung auf ca. 1,4V zu erhöhen. Auf dem Kollektor von T2 ist dann 0V (wenn er leitet) oder volle Vcc (wenn er gesperrt ist). Die Resistoren R sind nicht kritisch.
Viel Erfolg! :)
MfG
VCC VCC VCC
+ + +
| | |
.-. .-. .-.
R| | R| | R| |
| | | | | |
'-' '-' '-'
D | | |
>-----|<--+ +--+ +----->
| | | |
D | Db |/ | |/
>-----|<--+-->|--| T1 +--| T2
| |> |>
D | | |
>-----|<--+ === ===
GND GND
Eine saubere Lösung wäre eine Schnittstelle, die für Multidrop-Betrieb gedacht ist. Solange die Slaves nur empfangen geht das mit RS232, aber wenn sie auch mal was sagen wollen, gibt es nicht bloß Kollisionen, sondern satte Kurzschlüsse. Das kann man natürlich mit Dioden und Pullup umgehen und in der Software dafür sorgen, wie bereits erwähnt wurde, dass nur der gefragte Slave spricht, anders geht es bei anderen Systemen (RS485 zB) ja auch nicht. Wenn die Leitungen nicht zu lang werden und die Geschwindigkeit im Rahmen bleibt, sollte es ausreichen, jedem Slave-Tx eine Diode in Reihe zu schalten (Kathode zum Slave) und am Master-Rx die Busleitung auf +12V zu ziehen, da vielleicht so 4,7k nehmen. Die Transistorschaltung dahinter ist einigermassen unnötig, es sei denn, die Leitungen werden wirklich lang, dann kann es Sinn machen, die Slave-Ausgänge erst am Empfänger zusammenzufassen. Und schön drauf achten, dass die UARTs der Slaves ihr Tx auch brav auf log.0 halten, sonst ist der Bus blockiert.
Hallo PICture,
habe deine "saubere Lösung" aufgebaut, und siehe da es funktioniert.
Nochmal vielen Dank.
Hallo shaun,
Du hast natürlich recht, dass das nicht die schönste Lösung ist. Aber irgendwie musste ich eine Lösung finden, wie ich alt und neu (die Motoren) zusammenbringe. Wie gesagt wenn ich nur Controller nehme und einen Pegelwandler zum PC, dann gibt es keine Probleme solange ich ordentlich nach dem Master/Slave Prinzip arbeite und die Abarbeitung synchron lasse.
Die Motoren kommunizieren normalerweise über Daisy Chain. Das hat nur leider nicht in mein Konzept gepasst. Sonst hätte ich alle Controller ändern müssen, und außerdem muss der Letzte im Bus warten bis die Daten durchgereicht sind.
Übrigens sind alle Schaltungsteile auf der 3,3V Seite angeordnet. Als Widerstände hab ich einfach immer 4k7 eingesetzt. Und die Transistoren sind 2 BC547C. Es kommen 3,3V für H-Pegel und 0V für den L-Pegel raus.
sast
Na dann ist doch alles klar. Ich habe auch irgendwie übersehen, dass Du den Bus auf der CMOS-Seite verbinden willst, ich war von RS232-Transceivern auf den Modulen ausgegangen. Da die MAX IMHO Pullups an den Eingängen haben, wäre eine reine Diodenlösung dann mit Pulldown etwas blöd gewesen.
Hallo sast!
Gerne geschiehen! Ich frohe mich immer wenn ich helfen kann, Du hast mit Deiner detalierten Beschreibung der funktionierenden Schaltung wachrscheinlich auch vielen geholfen. :)
MfG
Powered by vBulletin® Version 4.2.5 Copyright ©2024 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.