chakokuのブログ(rev4)

テック・コミック・ごくまれにチャリ

RP2040のPIOを使ってモールス符号を出力する(その2)

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