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.