前回の試作では、ドット(・)とダッシュ(ー)のみ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