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)?
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).
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
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.