Clear PIO FIFOs when updating Tone and Servos #206

Merged
earlephilhower merged 2 commits from fifoclr into master 2021-06-11 22:27:48 +03:00
earlephilhower commented 2021-06-11 22:17:37 +03:00 (Migrated from github.com)

The PIO programs that generate tone() and Servo() use the TX FIFO to
receive updates to the period/duty cycle.

The original code would push into the FIFO (potentially blocking the
app if the FIFO was full) and generate at least one cycle of every
value written into the control. Basically, the output would
lag the changes by 1 cycle or more (which could be 20ms+ on Servo).

Fix this by clearing any old, ungrabbed values from the FIFO before
sending a new one to the program. Instead of a FIFO, there is
effectively now just a control register and updates will be immediate.

Update the Siren.ino example with delays because now the tone() calls
will not block and run 10x+ faster.

The PIO programs that generate tone() and Servo() use the TX FIFO to receive updates to the period/duty cycle. The original code would push into the FIFO (potentially blocking the app if the FIFO was full) and generate at least one cycle of every value written into the control. Basically, the output would lag the changes by 1 cycle or more (which could be 20ms+ on Servo). Fix this by clearing any old, ungrabbed values from the FIFO before sending a new one to the program. Instead of a FIFO, there is effectively now just a control register and updates will be immediate. Update the Siren.ino example with delays because now the tone() calls will not block and run 10x+ faster.
Sign in to join this conversation.