Hallo,
ich arbeite gerade an einem System, bei dem mehrere Boards mit RS232
(5V-Pegel) angesprochen werden sollen. Hierfür will ich die
RS232-Verbindung unter bestimmten Zuständen für manche Boards
ausschalten.
Ist es möglich, mit dem RS232-Signal über ein AND-Gatter (z.B. 74HCT08)
zu gehen und mit dem zweiten Eingang einen ENABLE-Eingang zu haben?
hi
Mit Und_Gattern wird das nix, weil das Ausgangspotential gebunden ist.
Nimm einen Buffer mit Tristate-Ausgang und CS-Eingang. Bspw. 74LS244
Vielleicht findest du welche, die nicht 8-Bit breit sind.
Alternative.... du machst eine Ringleitng. RxD auf TxD des nächsten µC
usw bis du wieder am Anfang bist. Dann sendest du vor den Nutzdaten eine
Kennung mit, sowas wie µC-Nummer. Im Programm prüfst du, ob die
empfangenen Daten für den µC bestimmt sind, wenn nicht, sendest du die
Daten einfach wieder weiter. Der nächste empfängt usw.
Gruß oldmax
Für sowas ist RS485 gedacht. Deren SendeTreiber lassen sich direkt mit
nem Pin abschalten. Somit belegt immer nur den Bus, der gerade was
erzählen will.
Es gibt viele Möglichkeiten das zu realisieren.
Bastellösungen mit Dioden, Gattern, Widerständen, Optokopplern;
bewährte Lösungen wie RS485, I2C (gut ist nicht RS232ähnlich-seriell)
Wie ist denn die Aufgabenstellung? Welche Umgebung? Leitungslängen?
Störfestigkeiten? Schon vorhandene Installationen?
Halbe Spezifikationen ergeben halt auch nur halbe Sachen (Antworten).
Danke für die Tipps bisher.
Bislang ist noch nichts aufgebaut. Das System ist bisher nur in der
Planung.
Bei dem System handelt es sich um ein Messsystem. Es soll eine
Hauptplatine geben, die von den einzelnen Messboards die Informationen
sammelt und verarbeitet. Das ganze soll ein modularer Aufbau sein. Ich
dachte nun, ich fahre von der Hauptplatine zum ersten Messboard. Von dem
wird zum zweiten weitergefahren, usw. . Das heisst die Messboards haben
(neben den Sensoranschlüssen) zwei Anschlüsse (Input & Output). Über
Input wird die Spannungsvergung und das RS232-Signal eingespeisst. Über
Output wird die Spannungsversorgung und das (abschaltbare) RS232-Signal
an das nächste Messboard geleitet.
Nun zur Aufgabe:
Da es ein modulares System sein soll und die Anzahl der verwendeten
Messboards unterschiedlich sein wird, muss es eine Art
Initialisierunglauf geben.
Da ich die einzelnen Messboards nicht selbst codieren will, würde ich
die Kodierung gerne dynamisch machen. Und zwar wie folgt:
- Gerät wird eingeschaltet
- Alle Messboards schalten das RS232-Singal am Output aus
- Hauptplatine sendet Initialisierungsbefehl mit Adresse 1 auf den Bus
- erstes Messboard erhält diesen Befehl, kodiert sich auf Adresse 1,
schickt Bestätigung an Hauptplatine und schaltet RS232-Signal an Output
ein
- Hauptplatine sendet Initialisierungsbefehl mit Adresse 2 auf den Bus
- ...
- Hauptplatine sendet Initialisierungsbefehl mit Adresse X auf den Bus
- keine Antwort: Hauptplatine beendet Initialisierungslauf
Da ich zusätzlich noch eine galvanische Trennung des RS232-Signals haben
möchte (wegen Masseschleifen) würde ich es nun am liebsten mit
Optokopplern machen. Ich habe mal eine Schaltung angehängt. Vielleicht
kann jemand einen Blick darauf werfen und seine Meinung dazu äußern.
>Bei dem System handelt es sich um ein Messsystem. Es soll...
Nimm RS485. Immer eine Verbindung von Teilnehmer zu Teilnehmer. So
kaskadiert und adressiert sich das selbst.
Wenn ich RS485 nehme, heisst das aber auch, dass alle Informationen der
Teilnehmer über den Teilnehmer direkt nach dem Hauptboard gehen.
Pro Messwertabfrage und Messboard sind das vorraussichtlich um die 60
Byte.
Am liebsten wäre es mir, wenn das Hauptboard gezielt jedes Messboard
anspricht und dieses ohne Umwege direkt dem Hauptboard antwortet.
Dann bau mit RS485 den klassischen Bus auf. Allerdings musst du dir da
Gedanken über eine Adressierung machen. Aber so hast Du direktverbindung
zum Master.
Alternativ könntest du auch, wenn alle in Reihe sind, einfach einen
AnfrageFrame durch alle durchlaufen lassen und jeder trägt seine Daten
einfach dazu. So geht eine Nachricht einmal im Kreis, und wenn sie
wieder den Sender (Master) erreicht, hast du Daten zu den Messgeräten
gesendet und gleichzeitig Daten von den Messgeräten empfangen...
Hi!
> - Hauptplatine sendet Initialisierungsbefehl mit Adresse 1 auf den Bus> - erstes Messboard erhält diesen Befehl, kodiert sich auf Adresse 1,
Was ist wenn einer die Busverkabelung ändert und Wert2 auf Adr.1
ankommt?
Es sei denn die Module melden sich mit einer ganz bestimmten Kennung
zurück. Dann kannste aber auch gleich fest codieren(Schalter/Jumper)
Viel Erfolg, Uwe
matthias schrieb:> Wenn ich RS485 nehme, heisst das aber auch, dass alle Informationen der> Teilnehmer über den Teilnehmer direkt nach dem Hauptboard gehen.
Wie?
Genau das willst du doch:
> Am liebsten wäre es mir, wenn das Hauptboard gezielt jedes Messboard> anspricht und dieses ohne Umwege direkt dem Hauptboard antwortet.
Und genau dafür ist RS485 gedacht. Deine Murkslösung mit der
vergewaltigten RS232-Schnitte wird dir nur Probleme bescheren. BTW: CAN
wäre auch eine Möglichkeit.
>Da ich zusätzlich noch eine galvanische Trennung des RS232-Signals haben>möchte (wegen Masseschleifen) würde ich es nun am liebsten mit>Optokopplern machen. Ich habe mal eine Schaltung angehängt. Vielleicht>kann jemand einen Blick darauf werfen und seine Meinung dazu äußern.
Schau Dir dazu mal bei analog.com die Sparte "Iso Coupler" an. Die Teile
sind nicht schlecht.
Wenn Du dynamisch Adressieren willst, dann könnte das interessant
werden.
Mit RS485 wird das wohl eher nichts. Aber wenn man RS422 macht, dann
sollte
das gehen. Pro Gerät am Bus jeweils 2 RS422 Treiber (je 1x RX / 1x TX).
Mit den Enable Leitungen kann man das dann ganz gut "durchschalten".
Mach Dir aber auch mal Gedanken zum Thema Reinitialisierung. Falls ein
Teilnehmer in der Kette mal nicht mehr funktioniert, ....
So was hab ich schonmal gebaut. Darf aber keine weiteren Details nenen.
Je nach Länge der Eimerkette, dauert die Initialisierung eine Weile.
Höngt man am Ende einen Loop rein, dann kann man die Kette auch schön
überwachen (falls es mal dazwischen eine Unterbrechung gibt).
Ich frage mich, warum es mit RS485 einfacher sein soll so etwas zu
implementieren!? RS485 besitzt doch nur ein anderes Übertragungsprinzip.
Protokoll-mäßig gibt es keine Definition. Daher sollte es doch egal
sein, ob ich die Software für RS232 oder RS485 schreibe.
Ich sehe auch bei dem Bus-Aufbau von RS485 keinen Vorteil. Um eine
automatische Initialisierung durchführen zu können, muss ich meines
Erachtens einzelne Busabschnitte weg- bzw. dazuschalten können. Das ist
bei RS485 auch nicht vorgesehen.
Zum Thema Reinitialisierung:
Bei der Übertragung der Messwerte sendet jedes Messboard seine Kennung
mit. Das Hauptboard überwacht ob alle Messwerte ankommen. Sollte das
nicht der Fall sein, wird nach und nach (mit dem letzen beginnend) jedem
Teilnehmer den Befehl zugeschickt, seinen Ausgang auszuschalten. Nachdem
alle Messboards ihren Ausgang ausgeschaltet haben wird eine neue
Initialisierung durchgeführt.
Dass das etwas Zeit in Anspruch nimmt ist mir klar, ist aber auch kein
Problem.
Hallo,
ich betreibe seit vielen Jahren solche Systeme, aber da wird ein
Multiplexer für die RS232C-Signale verwendet, der TxD vom PC auf n
Schnittstellen weitersendet und das antwortende RxD (es antwortet immer
nur die angesprochene Station) an den PC durchschaltet. Der arbeitet mit
originalen V24-Schnittstellen oder mit entsprechenden Lichtleitern.
Anders als mit dem Multiplexer geht es auch nicht, da RS232C nicht
abschaltbar ist, man kann nur eben die Mux-Mimik in die Messgeräte
direkt einbauen (wie bei RS485), aber das kommt letzlich auf das gleiche
heraus.
Der PC fragt ringsum alle Stationen ab, die Online sind, und fragt
zwischendurch auch alle anderen möglichen Adressen ab - antwortet eine,
wird sie Online gesetzt. Die Adressen werden im Gerät eingestellt.
Funktioniert völlig problemlos seit rund 20 Jahren. Bei ganz wenigen
Geräten kann man auch TxD parallel anschliessen und RxD mit Dioden
verknüpfen, das war früher üblich für NC-Maschinen.
Gruss Reinhard
Nimm Busfähige Treiber und verwende das 9 Bit Protokoll,
das fast alle MCs beherschen.
Sobald der Master eine "Adresse" auf dem Bus legt ( 9. Bit gesetzt)
wachen alle Slaves via Interrupt auf und schauen nach, ob sie gemeint
sind. Wenn nicht ist die Sache erledigt.
Stimmt die Adresse des Slaves überein bleibt er wach und hört oder
antwortet auf daten ( 9. Bit nicht gesetzt).
Die Adressen der Slaves kannst du fix in die Firmware schreiben oder
über I/O Ports einstellbar machen.
HG
Hans-georg Lehnard schrieb
> Nimm Busfähige Treiber und verwende das 9 Bit Protokoll,> das fast alle MCs beherschen....
Das ist noch besser. Das Ganze mit RS485 Treibern. Perfekt.
Also, ich werde wohl wirklich auf RS485 umsteigen. Als Treiber würde ich
den 75176 nehmen.
Aber wie sieht es mit der automatischen Initialisierung aus? Wie wäre es
denn, wenn ich auf dem Messboard nicht den Bus vom Output ausschalten,
sondern die gesamte Spannungsversorgung? Somit wären immer nur die
Boards aktiv, die schon initialisiert sind (und das eine, das gerade
initialisiert wird).
>75176
Sind der letzte Schrott. die lassen 40mA runter und haben noch nichts
gemacht. Nimm was Neueres. zB einen ADM483 oder so.
Optokoppler sind unnoetig, denn die Treiber haben einen grossen
gleichtaktbereich.
Bei der galvanischen Trennung geht es mir hauptsächlich um die
Vermeidung von Masseschleifen. Wenn ein System aus einer Hauptplatine
und sagen wir mal 10 Messboards besteht, kann da schon was
zusammenkommen.