chakokuのブログ(rev4)

日々のごった煮ブログです

RP2040のPIOで2bitバスで入力を受け付ける

ロータリエンコーダのドライバを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