¿Qué es un PIO en la Raspberry Pi Pico?

Anuncio
RaspberryPi

Las entradas/salidas programables (Programmable Input Output o PIO) son un periférico especial en la Raspberry Pi Pico que te permite controlar los puertos de entrada y salida de forma concurrente con el programa principal. Son de especial utilidad cuando queremos desarrollar protocolos de comunicación especiales, como el que usamos con los LEDs NeoPixel. Para comprender mejor cómo funciona, en esta entrada queremos entrar un poco más a detalle en el tema.

En la mayoría de los microcontroladores, para implementar un protocolo que no esté soportado por hardware (como el I2C o el SPI) se necesita programar el protocolo y procesar la información bit por bit (técnica conocida como bit-banging). Esta técnica tiene muchos inconvenientes, como problemas con la sincronización de los datos y el uso del procesador que se podría destinar para otra tarea.

Para solucionar esto, la Raspberry Pi Pico posee los PIO, que en si son procesadores muy elementales que ayudan al procesador principal a realizar ciertas tareas. En total, la pico tiene dos bloques PIO con cuatro máquinas de estado cada uno. De un modo más gráfico, los bloques PIO se ven de este modo:

Estructura de un bloque PIO. Vía CNX Software

Para emplear este recurso, en el programa le indicamos cómo se deben manejar los datos que queremos mover en los pines de forma explicita. Cada PIO tiene nueve instrucciones, que les permite realizar diversas tareas de forma simultánea al procesador principal

Anuncio
RaspberryPi
  • IN desplaza bits al registro de entrada
  • OUT desplaza bits desde el registro de salida a donde se necesite
  • PUSH envía datos al FIFO RX
  • PULL envía datos al FIFO TX
  • MOV mueve datos desde un origen a un destino especificado
  • IRQ activa o desactiva la bandera de interrupción
  • SET escribe datos a un destino
  • WAIT pausa hasta que una acción en particular ocurra
  • JMP se mueve a un punto diferente del código

Podemos aprender a usar PIO con un ejemplo sencillo. Haremos el programa blink de prueba que podemos descargar de la página de Raspberry Pi pero con los PIO. En este caso estamos definiendo dos funciones, una que apague el LED y otra que lo encienda. Luego definimos las máquinas de estados con las funciones y la frecuencia de trabajo. Por último activamos ambas máquinas de estado y eso hará que el LED encienda y apague a 20kHz, pero como la segunda maquina de estados tiene una frecuencia 2 Hz mayor, eso hará que interfieran entre si y el LED parpadeé a 2Hz. Para logarlo vamos a usar el siguiente código:

from rp2 import PIO, StateMachine, asm_pio
from machine import Pin
import time

@asm_pio(set_init=PIO.OUT_LOW)
def led_off():
    set(pins, 0)

@asm_pio(set_init=PIO.OUT_LOW)
def led_on():
    set(pins, 1)

sm1 = StateMachine(1, led_off, freq=20000, set_base=Pin(25))
sm2 = StateMachine(2, led_on, freq=20002, set_base=Pin(25))

sm1.active(1)
sm2.active(1)

Conclusiones:

Comprendiendo como funcionan los PIO podemos lograr cosas aún más interesantes que solo usando los puertos seriales que vienen por defecto en el microcontrolador RP2040. Por ejemplo, podemos implementar un salida VGA mientras mandamos la información desde el programa principal. Aquí te mostramos un ejemplo de como empezar a aprender a usar PIO, pero existen más ejemplos que puedes revisar aquí. Te invitamos a que sigas aprendiendo a usar esta sorprendente tarjeta.

Referencias:

What is Programmable I/O on Raspberry Pi Pico?

Flashing lights with MicroPython and Programmable I/O part 1

Flashing lights with MicroPython and Programmable I/O part 2

A closer look at Raspberry Pi RP2040 Programmable IOs (PIO)

Programmable I/O with Raspberry Pi Pico

Estructura de una entrada/salida programable. Vía: Seeedstudio