
RP Pico: Interrupciones de GPIO
- Dacadev
- Electronica
- April 28, 2024
Tabla de Contenido
Note
En este artículo aprenderás a manejar las interrupciones GPIO de la Raspberry Pi Pico usando MicroPython. Al final entenderás cómo configurarlas y qué tener en cuenta al diseñar el comportamiento de las interrupciones.
¿Qué son las interrupciones?
Las interrupciones son acciones, normalmente una serie de tareas que se ejecutan cuando cierta condición o evento se genera durante la ejecución del programa. Haciendo que el programa se detenga en ese punto y proceda a ejecutar las acciones que se han definido para ese evento.
Manejo de interrupciones en el RP2040
Antes de configurar el código para nuestra RP2040, es importante entender cómo maneja las interrupciones. Cada núcleo está equipado con un controlador de interrupciones propio, conocido como Controlador de Interrupciones Vectorizadas Anidadas (o NVIC por sus siglas en inglés, Nested Vectored Interrupt Controller). Cada NVIC puede gestionar 32 tipos de interrupciones. Esto proporciona al RP2040 flexibilidad para manejar múltiples interrupciones de manera eficiente, permitiendo que cada núcleo responda de forma independiente a los eventos de interrupción específicos. En relación con los GPIO, cada controlador de interrupciones gestiona una única interrupción de GPIO por banco, y no una interrupción por cada pin, lo que significa que las interrupciones por pines dentro de un mismo banco son compartidas entre los pines del mismo.
Note
Para más información de como se manejan las interrupciones en el RP2040, puedes revisar la sección 2.3.2 del datasheet
Interrupciones con Micropython
Info
A partir de este punto es necesario que el usuario tenga entendimiento de como operan la clase Pin en Micropython, si ese no es el caso en el siguiente artículo
te explico más del tema.
Para configurar las interrupciones en Micropython debemos de tener una instancia de la clase Pin que encontramos en la librería machine. Una vez tengas la instancia de Pin el siguiente paso es asociar una interrupción al mismo, para ello haremos uso del método irq
.
Este método tiene las siguientes configuraciones:
| parámetro | valor por defecto | descripción |
|---|---|---|
| handler | None | Es la función que se ejecutará cuando se dispare la interrupción, esta función secibe como parámetro una instancia del Pin que lo activo, si el valor es None la interrupción esta desactivada |
| trigger | IRQ_FALLING | Pin.IRQ_RISING | Es el comportamiento que se tendrá encuenta para activar la interrupción, mirá el gráfico mas adelante, es posible mezclar mas de un tipo de activador |
| priority | 1 | Es el nivel de prioridad que le asignarás a la interrupción, entre mayor el numero, mayor prioridad |
| wake | None | Te permite controlar si la interrupción tiene la capacidad de “despertar” al procesador si esta en estado de reposo/suspención |
| hard | False | Este parámetro permite definir si la interrupción será manejada por hardware o no, esto permite disminuir el delay entre la activación y la ejecución de la función de la interrupción, sin embargo tiene implicación de performance que debe considerar el desarrollador y no Micropython |
Veamos un ejemplo de como se crean interrupción con Micropython:
from machine import Pin
from utime import sleep
# setup
led = Pin(25, Pin.OUT, value=False)
btn = Pin(1, Pin.IN)
# Función para manejar la interrupción
# recibe solo un parámetro de tipo Pin
def interrupt_callback(pin):
print(pin)
led.toggle()
btn.irq(handler=interrupt_callback, trigger=Pin.IRQ_FALLING)
Tipo de activadores de interrupciones
Micropython define los siguientes activadores de interrupciones:
Pin.IRQ_FALLINGinterrupción en flanco de bajada (falling edge)Pin.IRQ_RISINGinterrupción en flanco de subida (rising edge)Pin.IRQ_LOW_LEVELinterrupción en nivel bajo (low level)Pin.IRQ_HIGH_LEVELinterrupción en nivel alto (high level)
Recuerda que una señal digital oscila entre 1 y 0, lo cual podemos ver en el tiempo como una señal cuadrada, y en base a ella es que se tienen definidas los activadores de interrupciones, como se muestra en el siguiente gráfico.
