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?