rp2: asm_pio_encode() sideset/delay faulty logic
Port, board and/or hardware
RP2040
MicroPython version
MicroPython v1.24.1 on 2024-11-29; Raspberry Pi Pico with RP2040
Reproduction
In a PIO instruction, 5 bits are reserved for sideset/delay. Using one or more sideset pins reduces the amount of bits left for delay. However, the asm_pio_encode() complains about delay too large with the following invocation:
rp2.asm_pio_encode('mov(x,y).side(1) [7]', 2, sideset_opt=True)
The second argument to the function is sideset count and is inclusive of the sideset enable bit which is required when sideset is optional. In this example two bits are reserved for sideset purposes and three are left for delay allowing a maximum of 7.
Expected behaviour
The function is expected to return 48930 equivalent to 0b1011111100100010.
Note the sideset/delay in bits 8-12 (counting up from 0), 11111, with the two most significant bits being the sideset enable and the actual sideset bit and the rest of the bits signifying a delay value of 7.
Observed behaviour
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "rp2.py", line 298, in asm_pio_encode
File "<string>", line 1, in <module>
File "rp2.py", line 79, in getitem
File "rp2.py", line 84, in delay
PIOASMError: delay too large
Additional Information
I came across this bug when figuring out why the asm_pio_encode() function would not seem to work correctly with sideset count equal to 1 while sideset_opt=True.
The documentation did not mention about sideset count being inclusive of sideset enable bit. That information was found in the codebase as a comment. It follows from the SIDESET_COUNT count in SM#_PINCTRL register of RP2040 where the sideset enable bit is included in the count.
Code of Conduct
Yes, I agree
TypeError: unexpected keyword argument 'sideset_count'
Port, board and/or hardware
rp2
MicroPython version
MicroPython v1.24.1 on 2024-11-29; Pi Pico Board
Reproduction
`import rp2
Define the PIO program
@rp2.asm_pio(sideset_init=rp2.PIO.OUT_HIGH, autopush=True, push_thresh=32, sideset_count=3)
def pio_program():
wait(0,gpio,5).side(7)
print("Hello World")
`
Expected behaviour
Expected to print "Hello World"
Observed behaviour
This unexpected error occurs: -
TypeError: unexpected keyword argument 'sideset_count'
Additional Information
No, I've provided everything above.
Code of Conduct
Yes, I agree