Forum: Mikrocontroller und Digitale Elektronik Padauk UARTs


von Dennis B. (dcfoto)


Lesenswert?

Ich habe mir nun auch einen Satz dieser grandiosen Padauk chips zugelegt 
und möchte diese über asynchrone serielle Schnitstellen (UART) 
kaskadieren. Ich beziehe mich hier nur auf die Single-FPPA-Chips und die 
Padauk IDE.

Größte Herausforderung dabei ist das Timing, zumal es keinen 
Hardware-UART gibt. Der von der IDE erzeugte Code funktioniert auf 
Anhieb, allerdings nur dann, wenn er nicht unterbrochen wird. Die delays 
während einer Übertragung kann man also nicht ohne weiteres für andere 
parallele Aufgaben nutzen, es sei denn man führt ganz genau Buch, 
wieviele Prozessorzyklen man verbraucht, was ziemlich mühsam ist und 
spätestens unpraktikabel wird, wenn man ein paar If-else-Zweige hat.

Wichtig ist auch, dass keine Übertragung reinkommen darf, während der 
Empfänger selbst gerade eine sendet, denn sonst geht das vom Timing her 
in die Hose. Na gut: man könnte die TX-Leitung auf low setzen und zum 
Empfangen übergehen. Damit provoziert man einen Fehler im Stop-Bit (das 
ja high sein müsste), so dass der nachfolgende Empfänger das Byte 
verwirft. Nach dem Verarbeiten des eigenen Inputs kann man es dann 
nochmal senden. Ist natürlich nicht sehr schick und kann schnell zu 
Verstopfung führen.

Ich habe mir stattdessen eine Funktion geschrieben, die gleichzeitig 
empfängt und sendet. Ein ausgehendes Byte wird solange zurückgehalten, 
bis ein Byte reinkommt - dann laufen beide Transfers synchron mit dem 
gleichen Timing, wobei die gesendete Übertragung immer genau ein halbes 
Bit plus 9 Takte verzögert ist. Das funktioniert nun auch schon prima. 
Hierbei muss man natürlich dafür sorgen, dass der erste Chip in der 
Kette regelmäßig irgendwas sendet (im Zweifelsfall ein Byte das "leere 
Nachricht" bedeutet), da die anderen sonst nicht zum Senden kommen.

Eine Alternative wäre noch, mit Timer-Interrupts zu arbeiten. Solange 
die Baudrate niedrig genug ist, sollte das eigentlich gut funktionieren 
und man müsste dann gar keine Takte mehr zählen, sondern könnte 
tatsächlich anderen Code ausführen, der dann pro Bit jeweils einmal kurz 
unterbrochen wird. Hat das schon jemand probiert?

von Achim M. (minifloat)


Lesenswert?

Dennis B. schrieb:
> Eine Alternative wäre noch, mit Timer-Interrupts zu arbeiten. Solange
> die Baudrate niedrig genug ist, sollte das eigentlich gut funktionieren

Das ist die Standard-Implementierung eines Interruptgetriebenen 
Software-UART. Timer-Interrupt und je eine Statemachine für RX und TX.

Da RX irgendwann kommen kann, muss entweder der Timer-Interrupt mit mehr 
als doppelter Baudrate kommen oder du machst den RX in einen 
Timer-Compare-Interrupt, der Compare-Wert wird dann entsprechend der 
ersten Flanke (Startbit) auf optimalen Samplezeitpunkt gestellt.

Oder noch anderster...
mfg mf

von Dennis B. (dcfoto)


Lesenswert?

Ja, ich denke man muss auf jeden Fall einen Interrupt auf den RX Pin 
setzen, um den Zeitpunnkt des Startbits zu erkennen. Während einer 
eingehenden Transaktion kann man den abschalten und stattdessen einen 
Timer-Interrupt für die Datenbits und das Stop-Bit verwenden.

Ohne Synchronisierung auf das Startbit (doppelte Frequenz etc.) wird das 
sicherlich ein Glücksspiel, denn der Takt der Chips ist ohne Quartz eh 
schon ungenau... und wenn die Taktfrequenz des Empfängers schon 
abweicht, dann sollte man wenigstens zum theoretisch richtigen Zeitpunkt 
in der Mitte der Bits samplen.

Wie das vom Prinzip her ungefähr gemacht werden müsste, ist mir schon 
klar. Die Frage war eher, ob das schon jemand erfolgreich auf einem 
Padauk uC implementiert hat.

Im Datenblatt steht z.B. nicht klar, wie lange der Sprung in eine ISR 
und zurück dauert und noch ein paar andere Dinge.

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.