disable_irq for inline assembler has time limits.
Posted: Tue May 29, 2018 9:27 pm
I have been playing with Roberthh's inline assembler code sample viewtopic.php?f=18&t=4238&start=10 to blink the onboard blue led on GPIO2.
I can have more blinks or longer flashes, but not both: disable_irq() helped increase the duration but too many loops and the board crashes. The code below blinks 10 times: if I increase loop count to 12, the program will crash. Any ideas?
def loop():
import machine
machine.Pin(2, machine.Pin.OUT, value=1)
isr = machine.disable_irq() # Disable interrupt requests
do_loop()
machine.enable_irq(isr)
print("loop done")
@micropython.asm_xtensa
def do_loop():
movi(a2, 0x60000330) # GPIO Pin2 address
movi(a5, 0) # p2 off
movi(a3, 10) # loop count
movi(a4, 1) # loop decrement also p2 on
label(loop_start)
s8i(a5, a2, 0) # turn off led
movi(a6, 0x4fffff) # delay loop
label(delay1)
sub(a6,a6,a4)
bnez(a6,delay1)
s8i(a4, a2, 0) # turn on led
movi(a6,0x8fffff) # delay loop
label(delay2)
sub(a6,a6,a4)
bnez(a6,delay2)
s8i(a5, a2, 0) # turn off led
sub(a3, a3, a4) # dec loop count
bnez(a3, loop_start)
I can have more blinks or longer flashes, but not both: disable_irq() helped increase the duration but too many loops and the board crashes. The code below blinks 10 times: if I increase loop count to 12, the program will crash. Any ideas?
def loop():
import machine
machine.Pin(2, machine.Pin.OUT, value=1)
isr = machine.disable_irq() # Disable interrupt requests
do_loop()
machine.enable_irq(isr)
print("loop done")
@micropython.asm_xtensa
def do_loop():
movi(a2, 0x60000330) # GPIO Pin2 address
movi(a5, 0) # p2 off
movi(a3, 10) # loop count
movi(a4, 1) # loop decrement also p2 on
label(loop_start)
s8i(a5, a2, 0) # turn off led
movi(a6, 0x4fffff) # delay loop
label(delay1)
sub(a6,a6,a4)
bnez(a6,delay1)
s8i(a4, a2, 0) # turn on led
movi(a6,0x8fffff) # delay loop
label(delay2)
sub(a6,a6,a4)
bnez(a6,delay2)
s8i(a5, a2, 0) # turn off led
sub(a3, a3, a4) # dec loop count
bnez(a3, loop_start)