Forum: Mikrocontroller und Digitale Elektronik Mehrere Sensoren über eine UART Leitung kommunizieren lassen


von André R. (andr_r23)


Lesenswert?

Hallo,

ich habe eine Frage, ich habe 6 Sensoren selber gebaut, jeweils mit 
einem Atmega1284P. Die Kommunikation eines einzelnen Sensors mit einem 
Computer wurde mit UART realisiert und klappt hervorragend in beide 
Richtungen.

Nun brauche ich 6 Sensoren die mir, wenn angefragt ein bestimmtes 
Messergebnis bereitstellen. Das ganze soll über eine einzige Leitung 
funktionierten (1xTxD, 1xRxD) alle Sensoren sind dann an der gleichen 
Leitung. Macht das Probleme, entstehen dann zu viele Fehler?

Ich würde dann einen bestimmten Befehl losschicken den nur ein 
bestimmter Sensor versteht, so das auch nur dieser danach Antwortet.

Das ganze ist halt nicht so einfach, da ich demnächst keine neue Platine 
entwerfen kann. Die weitere Option wäre in meinen Augen halt noch, einen 
weiteren µC zu verwenden der 6 verschiedene UART hat und dann die Daten 
sammelt und dann einzeln weitergibt. Ist das vielleicht besser? Mir ist 
klar, dass es Intelligentere Lösungen gibt (Bussysteme wie SPI und Co) 
Aber die Hardware ist nunmal fest und an der Software will ich nicht 
viel ändern. Eine weitere kleine Platine als Datensammelstelle sollte 
aber machbar sein, ist ja nicht viel bei.

Vielen Dank

von spontan (Gast)


Lesenswert?

Alle TX der Sensoren auf eine leitung ist nur dann eine gute Idee, wenn 
die Übertragungshardware busfähig ist.

Darüber hast Du nix geschrieben.

Verwendest Du RS232? Dann gehts nicht so einfach.

von Karl H. (kbuchegg)


Lesenswert?

Kannst du nicht alle 6 Sensoren an einen µC anschliessen?
Du hast doch da ein halbes Rechenzentrum zur Verfügung.

Ansonsten: Wenn du das elektrisch richtig machst, kann man schon mehrere 
UART Teilnehmer an einen 'gemeinsamen Bus' hängen.
Aus Sicht der Sensorrechner: Die Rx Leitung kannst du zusammenfassen. 
Bei den Tx Leitungen musst du eben sicherstellen, dass einer die Leitung 
auf negativen Pegel ziehen kann, während die anderen dagegen halten. Du 
brauchst also im Prinzip eine UND-Schaltung, bei der die 6 µC nur 
gemeinsam die Leitung zum µC 'hochhalten' können. (Bei einer TTL Uart, 
bei einer richtigen RS232 natürlich andersrum und du brauchst ein OR)

von H.Joachim S. (crazyhorse)


Lesenswert?

Geht schon, insbesonders als single-master.
Allerdings kannst du eben nicht alle Tx der slaves ohne weiteres auf 
eine Leitung packen, das funktioniert nicht. Muss dann so eine Art 
wired-OR sein und verringert die Störfestigkeit.
Was du ohne Hardware-Änderung machen kannst: eine Kette aufbauen.
D.h.
-Tx Master an Rx 1.slave.
-Tx 1.slave an Rx 2. slave usw.

Dann musst du nur noch dafür sorgen, dass die Pakete durchgereicht 
werden.
Ansonsten: eben was busfähiges nehmen (RS485-Treiber).

von André R. (andr_r23)


Lesenswert?

Ja benutze RS232.

Hmm ist dann wohl doch nicht so einfach .... dann werd ich wohl die 
Daten einfach sammeln. Die Idee mit der Kette finde ich auch nicht 
schlecht. Ist aber vielleicht etwas umständlich wenn ich nur einen 
bestimmten Sensor abfragen will.

Ich überleg mir mal sowas wie ne Datensammelstelle dann kann ich bei 
RS232 bleiben.

Danke :-)

von Karl H. (kbuchegg)


Lesenswert?

André R. schrieb:
> Ja benutze RS232.
>
> Hmm ist dann wohl doch nicht so einfach .... dann werd ich wohl die
> Daten einfach sammeln. Die Idee mit der Kette finde ich auch nicht
> schlecht. Ist aber vielleicht etwas umständlich wenn ich nur einen
> bestimmten Sensor abfragen will.

Für deinen PC ändert sich nichts.
Der schickt weiter seine Abfragen raus.

Jeder Sensorrechner empfängt auf der einen UART die Abfrage, sieht nach 
ob sie für ihn ist und wenn nicht, schickt er sie auf der anderen UART 
wieder raus.
genauso in der umgekehrten Richtung: empfängt er was an der anderen 
UART, gibt er es auf er ersten wieder aus.

Wie beim Stille-Post Spiel. Nur dass keine Information verloren geht.

von André R. (andr_r23)


Lesenswert?

In der Tat, so schlau war ich nicht ;-). Das ist dann ja wohl das 
einfachste immer schön weiterreichen bis jemand damit was anfangen kann.

Top. Danke :-)

von Achim M. (minifloat)


Lesenswert?

Es gibt da noch eine Möglichkeit:
Beitrag "Re: Arduino RX und TX über einen Draht"
mfg mf

PS: Die einzelnen Busteilnehmer brauchen dann natürlich Adressen. Ein 
Protokoll scheinst du ja sowieso zu haben.

von R. M. (rmax)


Lesenswert?

@crazyhorse: Genau genommen beschreibst Du einen Ring, denn Tx vom 
letzten Slave geht ja wieder zurück zum Master.

Da der ATmega1284P zwei USARTs hat, wäre aber auch eine echte Kette 
möglich.

Beide Varianten haben Vor- und Nachteile:

Beim Ring ist die Latenz konstant, egal welcher Sensor abgefragt wird 
(nimmt aber natürlich mit der Anzahl der Sensoren zu), bei der Kette 
hängt die Latenz davon ab, wie viele Sensoren sich zwischen dem PC und 
dem angefragten Sensor befinden.

Wenn beim Ring ein Sensor ausfällt, können auch alle anderen nicht mehr 
abgefragt werden, während bei einer Kette nur die Sensoren wegfallen, 
die aus Sicht des Masters "hinter" dem defekten liegen.

von André R. (andr_r23)


Lesenswert?

Latenz ist mir egal, da ich keine Probeleme bekomme, selbst wenn das 
Signal ein paar Sekunden brauchen sollte.

von Stefan W. (dl6dx)


Lesenswert?

André R. schrieb:
> Das ganze soll über eine einzige Leitung
> funktionierten (1xTxD, 1xRxD) alle Sensoren sind dann an der gleichen
> Leitung. Macht das Probleme, entstehen dann zu viele Fehler?

Du könntest, wie schon genannt, die Busleitung als "wired or" ausführen. 
(Die Sender sind über eine open collector-Stufe angekoppelt.)

Nachteil: Die Flankensteilheit L->H wird nur über den oder die 
Pullup-Widerstände an den Stationen bestimmt. Je nach Leitungskapazität 
wirst du nicht über wenige kBit/s herauskommen.

Oder du verwendest RS485-Treiber, die sind busfähig. Allerdings muss 
jede Baugruppe vor dem Senden den Transceiver auf "Senden" umschalten 
(und das nach dem letzten gesendeten Byte wieder zurück nehmen).

Generell gilt: "Spontanes Senden" geht nicht. Entweder machst du eine 
Station zum Master, die die Slaves pollt, oder du implementierst ein 
"Token passing"-System.

Vor gut 20 Jahren hatte ich so was mal für die Vernetzung von mehreren 
Kartentelefonen in einem Krankenhauszimmer implementiert. Damals hatte 
ich ein Master-Slave-System verwendet. Neue Slaves konnten sich anmelden 
und für Wartungszwecke war es sogar möglich, einen speziellen Slave zum 
neuen Master und den alten Master temporär zum Slave zu machen.

Ich müsste mal die alten Sourcen durchsehen. So fürchterlich viel Code 
war das gar nicht.

Grüße

Stefan

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
Noch kein Account? Hier anmelden.