Digamos que tengo un Arduino conectado a un 8x8 LED matrix
.
En mi caso, la matriz de LED se controla utilizando dos registros de desplazamiento 74HC595
(uno para las filas y otro para las columnas).
Dado que solo puede establecer el estado de 8 LED a la vez (una fila), la idea es actualizar las filas lo suficientemente rápido para que el ojo humano no note el parpadeo.
Esto generalmente se hace en el método loop()
:
int led_status[8]; //contains LED status (which is on/off) for each row
void loop() {
process_otherstuff(); //eg: key inputs,...
display(); //shift led_status[] to shift register and latch result.
}
Aquí hay un problema potencial: ¿qué pasa si la CPU tiene que hacer un proceso que consume mucho tiempo en el método de bucle (por ejemplo: matemáticas pesadas)? Se llamará al método display () con algún retraso que podría ser perceptible (el led comenzará a parpadear o, lo que es peor, se detendrá en una fila).
Una posible solución que se me ocurre es actualizar la matriz de LED en un controlador de interrupciones:
void setup()
{
analogWrite(3, 100);
attachInterrupt(1, refreshdisplay, RISING);
}
int row = 0;
void refreshdisplay()
{
//refresh one single row
refreshrow(row++);
if(row > 7) row = 0;
}
¿Es esta una buena idea? De esa manera, no importa cuánto tiempo se invierta en el método loop (), la pantalla se actualizará tan rápido como sea necesario. El problema potencial que puedo ver es que ahora se pasa mucho tiempo en la interrupción, lo que generalmente es algo malo (el controlador de interrupciones debe ser lo más corto posible).
Otra solución es usar un controlador de controlador LED separado (por ejemplo: conectado a Arduino mediante el bus I2C) pero esto requiere cambiar la lista de componentes.