PIN Interrupt Problem



  • Re: IRQ Code causes LoPy reset every time - any ideas please?

    I Have a similar problem. This is my simple code:

    def button_handler(pin):
    print('button pressed')

    p_in = Pin('P10', mode=Pin.IN, pull=Pin.PULL_UP)
    p_in.irq(trigger=Pin.IRQ_RISING, handler=button_handler)

    This is the shell (USB) message:
    MicroPython 333b92c on 2016-10-26; LoPy with ESP32
    Type "help()" for more information.

    button pressed
    Guru Meditation Error of type StoreProhibited occurred on core 0. Exception was unhandled.
    Register dump:
    PC : 4012668c PS : 00060830 A0 : 8011f4ea A1 : 3ffdc420
    A2 : 00000002 A3 : 00000002 A4 : 3ffd24f4 A5 : 3ffd24dc
    A6 : 3ffd24dc A7 : 3ffd24dc A8 : 00000000 A9 : 00000000
    A10 : 3ffd24dc A11 : 3ffd24dc A12 : 00000004 A13 : 00000002
    A14 : 3ffdbd1c A15 : 3ffdbce4 SAR : 00000014 EXCCAUSE: 0000001d
    EXCVADDR: 00000023 LBEG : 00000000 LEND : 00000000 LCOUNT : 00000000
    Rebooting...
    ets Jun 8 2016 00:22:57

    rst:0x3 (SW_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT)
    configsip: 0, SPIWP:0x00

    I think about some problem about stack handler.
    Maybe do I have to define a memory space? I haven't found nothing in the documentation.

    Thank you

    Alessio



  • Here is some example code that worked for me working with the expansion board. If this causes an error for you I would try the latest firmware. I am on 9.2.b2.

    Another trap for young players is that you cannot reference a variable in the global space directly from an interrupt callback so you need to create a class. The second example is how to get that working.

    Example 1
    from machine import Pin
    import time

    led = Pin('G16', mode=Pin.OUT)

    def drip(p):
    led.toggle()
    print('pin change', p)

    button = Pin('G17', mode=Pin.IN, pull=Pin.PULL_UP)
    button.irq(trigger=Pin.IRQ_RISING, handler=drip)

    Example 2
    from machine import Pin
    import time

    class Drips:
    pass

    drips = Drips()
    drips.count = 0

    def drip(p):
    drips.count+=1

    button = Pin('G17', mode=Pin.IN, pull=Pin.PULL_UP)
    button.irq(trigger=Pin.IRQ_RISING, handler=drip)



  • As indicated in the MicroPython rules for interrupt handlers, printing from interrupt handlers is generally unsafe.


Log in to reply
 

Looks like your connection to Pycom Forum was lost, please wait while we try to reconnect.