www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik UART Signale multiplexen


Autor: Marcel (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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)?

Autor: nein. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
nein.

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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).

Autor: Dennis (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Ralf Kellerbauer Whm (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: A.K. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.