ロータリエンコーダのドライバをPIOで作ってみようと思い、まずは、2bitバスを入力できるように設定してみる。
IN命令により2bit分をPin6,Pin7から入力してISRに格納、PUSH命令でISRからRX FIFOにPUSHする。while文でgetメソッドでFIFOから読み取る。
PUSH IN 2bitバス [RX FIFO]<---[ISR]<-------(Pin6, Pin7) <-------/---- [ロータリエンコーダ]
以下がテストプログラム。
#
# PIO IN test
#
from machine import Pin
from rp2 import PIO, StateMachine, asm_pio
PIO_IN_PIN0 = Pin(6, Pin.IN, Pin.PULL_UP)
PIO_IN_PIN1 = Pin(7, Pin.IN, Pin.PULL_UP)
@asm_pio(in_shiftdir=PIO.SHIFT_LEFT)
def ingo():
in_(pins, 2)
push()
sm = StateMachine(0, ingo, freq = 2000, in_base=PIO_IN_PIN0)
sm.active(1)
while True:
print(hex(sm.get()),end="")実行結果は以下。GP6,GP7はPULL UPしているのでIOに何も接続していない時はHとなり、0x3が続く。ジャンパでGNDに接続するとLになり、0x2,0x1,0x0等に変化する。
0x30x30x30x30x30x30x30x30x30x30x30x30x30x30x30x30x30x30x20x20x20x20x20x20x20x20x20x20x20x20x20x20x20x20x20x20x20x20x20x20x20x20x20x20x20x20x20x00x00x0