Forum: Mikrocontroller und Digitale Elektronik UART Signale multiplexen


von Marcel (Gast)


Lesenswert?

Gibt es eine einfache Möglichkeit, mehrere (3-4) Software- UARTS auf 
einem ATMega zu betreiben, z.B. mit 9600 Baud und die Daten über den 
Hardware- UART gemutiplext auszugeben, z.B. mit 115kBaud (bzw. 
bidirektional)?

von nein. (Gast)


Lesenswert?

nein.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Naja, wenn man den Begriff "Software-UART" sehr weit auslegt, dann 
schon.

Und zwar muss dazu ein serielles Protokoll implementiert werden, bei dem 
anstelle eines einzelnen Bytes immer zwei Byte paarweise übertragen 
werden, eines enthält die Nutzdaten, das andere die "Kanalnummer".

Der Interrupthandler fürs Senden muss sich nicht im Detail darum 
kümmern, sehr wohl aber die Funktionen zum Einfüllen zu sendender Daten 
in das Sendefifo (die zusätzlich zu den Nutzdaten noch ihre 
"Kanalnummer" mitschreiben).

Im Empfangsinterrupt werden entweder alle empfangenen Daten in einen 
Empfangspuffer gesteckt, und erst in der Hauptschleife inhaltlich 
analysiert, oder aber der Empfangsinterrupttreiber entscheidet anhand 
jedes zweiten Bytes, wo das jeweils vorangehende bzw. nachfolgende 
hingehört und stopft es in einen zum "Kanal" gehörenden Puffer.

Probleme:

- Belegt mehr Platz für Sende- und Empfangspuffer. Die zweite Variante 
verbraucht für separate Empfangspuffer natürlich noch mehr Platz.

- Synchronisation beim Empfang?

Wenn nur Textdaten versendet werden, ließen sich die Kanalkennungsbytes 
von ihnen durch das gesetzte Bit 7 unterscheiden. Ist dann halt nur 
7-Bit-ASCII in den Nutzdaten (also keine Umlaute).

von Dennis (Gast)


Lesenswert?

Du kannst auch alle Daten in Halbbytes unterteilen dann  sind die ersten 
4 bit für das halbyte, von denen du ja insgesamt 8 hast, und der zweite 
teil ist die nummer des jeweilig übertragenen halbbytes. der Treiber 
wäre damit Datentransparent ohne weitere Bytes zu verschwenden.

ansonsten stimme ich Rufus zu.

Dennis

von Ralf Kellerbauer Whm (Gast)


Lesenswert?

Interessantes Problem ...

Bei 115 kBit zu 9,6 kBit passen sogar theoretisch 11 Kanäle zusammen.

Folgender Vorschlag (für 8 Software-Kanäle auf 1* physikalisch)
- Jeder langsame Kanal erhält je einen FIFO Puffer für RXD und TXD
- Jeweils zu implemetieren ist ein Logik für Xon/ Xoff (s. unten)
- Die Adressierung der Software FIFO erfolgt per Bits in einem Startbyte
- Hardware -UART ATmega = 'HUART'
- Jeder Cyclus wir per Steuer-Byte gestarten, wobei jedes Bit einen 
sendebereiten bzw. angesprochenen Sort-UART entspricht.
  (%1 = Soft-UART '0', %101 = Soft-UART '0' + "2", $FF = alle UARTs)

Ablauf senden (Kanäle 0-7):
- Byte für Kanal 2 geht ein > FIFO_S2
- Byte für Kanal 3 geht gleichzeitig ein > FIFO_S3
- Senderoutine für HUART wird aktiviert
- Steuer-Byte %00001100 wird per HUART gesendet
- Byte aus FIFO_S2 wird gesendet
- Byte aus FIFO_S3 wird gesendet
- warten, außer FIFO mit neuen Daten gefüllt oder noch mit Restdaten 
gefüllt.
(Diese UARTs können aus 2 Byte bestehen, falls die Empfänger auf der 
Gegenseite nicht per Xon/Xoff manchmal ihren Empfang einstellen)

Ablauf empfangen (Kanäle 0-7):
- Steuer-Byte %00001100 wird per HUART empfangen
- Byte für Kanal 2 geht ein > FIFO_E2
- Byte für Kanal 3 geht danach ein > FIFO_E3
- warten, außer HUART liefert neue Daten.

Problem Xon/Xoff:
Diese Steuerzeichen werden genauso durchgeleitet wie Daten.
Man muss aber einige Byte Puffer reservieren, damit die Verzögerung 
durch den Multiplex ausgeglichen wird.

Zeitverhalten:
Am schlechtesten funktioniert die Lösung, wenn nur ein Software Kanal 
sie nutzt.
Allerdings ist der HUART immer noch 5-fach schneller als die Daten 
angeliefert werden.
Der Datentransport selbst wird max. um 6-7 Bit bzgl. 9600 Soft-UARTs 
verschoben, also keine praxisrelevante Verschlechterung.


Die Soft-UARTs nach außen = ATmega8 Pins beschalten könnte 
folgendermaßen gehen:
- FIFO-Verwaltung in einem Hauptprogramm, im Interupt des HUART nur 
vorbereitete Daten bzw. das gerade empfangene Byte übernehmen
- Interrupt-Routine empfangen = 4-fache Baudrate, also 38.400 Baud
- Ab erster fallender Flanke einen Byte-Zähler auf '1' setzen
- in jedem Interupt weiter zählen außer High-Pegel
- Dann nächsten Zähler verwenden, bis 38 Takte abgelaufen sind (ca. 
Hälfte des Stop-Bits)
- Im ersten Byte könnte dann 4,5,6 (Bit 0=high) oder 8,9,10 (Bit0=low) 
u.s.w. stehen
- Damit und weiteren Bytes läßt sich das empfangene Byte isolieren
- Ebenso werden die weiteren Pins abgefragt und später ausgewertet.
- Byte-Zähler je Pin wieder auf '0' setzen
- Sendebetrieb ähnlich, allerdings kann man synchron zur Baudrate die 
FIFO leeren, in max. 8 Registern rotieren lassen und ausgeben.


Sonstiges:
Das ganze könnte man sogar noch weiter treiben.
Segmentiert man jenes Steuer-Byte, also nicht 8 Bit = 8 Soft-UART, 
sondern Bit 6-7 = Bank (1 aus 4) und Bit 0-3 der Zustand von je 6 
Soft-UART ergeben sich 24 Soft-UART. Die per ATMega8 zu verwalten dürfte 
aber schwer sein.
Auf der anderen Seite (=PC !?) müssen dann ebenso FIFO-Pufer und die 
Auswertung der Steuer-Bytes erfolgen.

Selbst getestet habe ich sowas bzw. die oben beschrieben Routine aber 
noch nicht.
Sollte aber im Prinzip funktionieren.

von A.K. (Gast)


Lesenswert?

Kernfrage: Nur ausgeben, oder auch einlesen? Bei einer Software-UART ist 
es nämlich fast egal, mit wievielen man gleichzeitig sendet, wenn's nur 
die gleiche Bitrate ist. Nur mit dem Empfang hapert es etwas.

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.