tunozemichanの日記 / tunozemichan's diary

SORD社のコンピューターM68やM68MXの解析についての備忘録です。This blog is a memorandum about the analysis of SORD's computers M68 and M68MX.

Raspberry Pi PiCOのPIOをMicroPythonから使う

Raspberry Pi PicoのPIOをMicroPythonから使った時の備忘録です。

 

例えば、GPIO0の立ち上がりによって、インプットピンがHIGHになるのを待って、ある波形をGPIO15ピンから出力する場合は、MicroPython用のPIOアセンブラの記法では以下のようになる。

 


@rp2.asm_pio(set_init=rp2.PIO.OUT_HIGH)
def base_signal(): // 適当な名前
    wait(1, pin, 0) // in_pinの0番目が1=HIGHになるのを待つ
    set(pins, 0) [10] // set_pinを上げ下げする
    set(pins, 0) [10]
    set(pins, 0) [10]
    set(pins, 0) [6]
    set(pins, 1) [10]
    set(pins, 0) [7]
    set(pins, 1) [3]
    set(pins, 0) [5]
    set(pins, 1) [11]
    wait(0, pin, 0) // in_pin0番目が0=LOWになるのを待つ
 
既に記憶が曖昧ですが、本家SDKでは、wait 0 gpio 1とか、gpioを露わに書く記法が許されていますが、MicroPythonでできるかどうか忘れました。試したときはできなかったと思いますが、単純に文法を間違っただけの気がします。
 
実際に起動する命令は以下のようになります。
pin0 = Pin(0,Pin.IN,Pin.PULL_UP)
pin15 = Pin(15,Pin.OUT)

sm = rp2.StateMachine(0, base_signal, freq=20000000, set_base=Pin(15),out_base=Pin(15),in_base=Pin(0))
 
# Start the StateMachine.
sm.active(1)
 
セットピンとアウトピンを同じGPIO15に割り当てていますが、これは本家SDKでも許された書き方です。しかし、何故かCircuitPythonでは許されず、重複しているというエラーが出ます。
セットピンとアウトピンが別々にしか許されない場合、かなり出来ることに制限がかかるので早急に治ることを願います。