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