前回の試作では、ドット(・)とダッシュ(ー)のみPIOで出力して、スペースはtimerで待たせていた。このため、FIFOに先読みされてしまって、Pythonによるスペースの待ち時間のタイミングと、PIOによる・ーの発生タイミングがずれる問題があった。これを解消するには、スペースの待ち時間もPIOで処理させる必要があった。その問題を解決したサンプルが以下。ステートマシン内で、ドット(・)、ダッシュ(ー)、スペースを生成させることで、タイミングのずれを解消している。ステートマシンのコードは実質アセンブラなのでどうしてもスパゲッティになってしまう。
from machine import Pin
from rp2 import PIO, StateMachine, asm_pio
import utime
@asm_pio(set_init=PIO.OUT_LOW,out_shiftdir=PIO.SHIFT_RIGHT)
def cond_test():
set(y, 0x00)
pull()
out(x, 4) # mov 4bit
jmp(x_not_y,"space")
#
label("cw_start")
out(x,4) # mov next 4bit to x
label("dash")
set(pins, 1)
label("dashloop")
set(y, 0xf)
label("waitloop0")
nop() [0x1f] # wait
jmp(y_dec, "waitloop0")
jmp(x_dec, "dashloop")
set(x,0x1)
jmp("space")
#
label("space_asit")
out(x,4) # mov next 4bit to x
# space
label("space")
set(pins, 0)
label("spaceloop")
set(y, 0x14)
label("waitloop1")
nop() [0x1f] # wait
jmp(y_dec, "waitloop1")
jmp(x_dec, "spaceloop")
sm = StateMachine(0, cond_test, freq = 7000, set_base=Pin(25))
sm.active(1)
while True:
sm.put(0x10) # dot
sm.put(0x10) # dot
sm.put(0x10) # dot
sm.put(0x03) # space
sm.put(0x50) # dash
sm.put(0x50) # dash
sm.put(0x50) # dash
sm.put(0x03) # space