Hardware utilizado:
Mi matriz modelo dispone de 8 Filas y 80 Columnas. Esto significa que tengo un total de 640 LEDs a comandar.
Debido a la gran cantidad de pines que requeriría comandar uno por uno, se opta por multiplexar los mísmos.
La multiplexación implica que cada LED compartirá,en mi caso, su pin positivo(ánodo) con los otros 79 LEDs ubicados en la mísma fila y su pin negativo(cátodo) con los otros 7 LEDs ubicados en su mísma columna. Esto permitirá que sea posible comandar cada LED individualmente. Pero todo tiene su precio. El precio que debemos pagar por la multiplexación es que también multiplexamos el tiempo que estos LEDs permanecerán encendidos. Al igual que una TV CRT, se hará un refresco, fila a fila, que irá formando la imágen completa ayudado por una velocidad de refresco suficiente como para engañar al ojo humano y que el mísmo la vea en su totalidad debido al efecto de
persistencia de la visión.
Si queremos ver más de cerca cómo se va produciendo el refresco fila a fila, podemos ir al archivo de simulación y haciendo click derecho en las propiedades del uC(que en mi caso es el 18F2550) bajar la velocidad del clock a 100Khz. Esto permitirá poder visualizar mejor el refresco.
Aún multiplexando, la matriz modelo lograda posee 8 lineas de control de filas y 80 de columnas. Por lo que necesita un total de 88 líneas individuales de control. Si bien existen uCs que tienen esta o más capacidad, podemos apoyarnos en registros de desplazamiento(shift registers) para dotar de más salidas a un uC que no posea las suficientes. La teoría de los registros de desplazamiento ha sido explicada de manera vasta y abundante aquí y en otros sitios por lo que será prácticamente obviada y quedará de tarea para quien todavía no está familarizado con su funcionamiento.
El control lógico de las filas también es comandado por un registro de desplazamiento por lo que utilizando registros de desplazamiento lograremos reducir la cantidad inicial de 88 líneas a sólo 3: una línea de DATOS, una de CLOCK y una de STROBE.
Ahora, necesitamos analizar cómo se realiza el refresco algorítmicamente. Este creo que es un tema que ha provocado dolores de cabeza a más de uno. Vamos con el código entonces.
Básicamente disponemos de
1) Un buffer, que será un arreglo que se contiene la información a mostrar. Un bit por LED en este caso de matriz monocromática y sin niveles de grises. El tamaño del búffer estará determinado por dos constantes configurables en tiempo de compilación: FILAS y COLUMNAS. Ellas son las que generarán el buffer adecuado según los valores que les otorgue a estas dos constantes.
buffer[0].0 | buffer[1].0 | buffer[2].0 | buffer[3].0 | buffer[4].0 | buffer[5].0 | buffer[6].0 | buffer[7].0 | buffer[8].0 | buffer[...].0 | buffer[...].0 | buffer[COLUMNAS-1].0 |
buffer[0].1 | buffer[1].1 | buffer[2].1 | buffer[3].1 | buffer[4].1 | buffer[5].1 | buffer[6].1 | buffer[7].1 | buffer[8].1 | buffer[...].1 | buffer[...].1 | buffer[COLUMNAS-1].1 |
buffer[0].2 | buffer[1].2 | buffer[2].2 | buffer[3].2 | buffer[4].2 | buffer[5].2 | buffer[6].2 | buffer[7].2 | buffer[8].2 | buffer[...].2 | buffer[...].2 | buffer[COLUMNAS-1].2 |
buffer[0].3 | buffer[1].3 | buffer[2].3 | buffer[3].3 | buffer[4].3 | buffer[5].3 | buffer[6].3 | buffer[7].3 | buffer[8].3 | buffer[...].3 | buffer[...].3 | buffer[COLUMNAS-1].3 |
buffer[0].4 | buffer[1].4 | buffer[2].4 | buffer[3].4 | buffer[4].4 | buffer[5].4 | buffer[6].4 | buffer[7].4 | buffer[8].4 | buffer[...].4 | buffer[...].4 | buffer[COLUMNAS-1].4 |
buffer[0].5 | buffer[1].5 | buffer[2].5 | buffer[3].5 | buffer[4].5 | buffer[5].5 | buffer[6].5 | buffer[7].5 | buffer[8].5 | buffer[...].5 | buffer[...].5 | buffer[COLUMNAS-1].5 |
buffer[0].6 | buffer[1].6 | buffer[2].6 | buffer[3].6 | buffer[4].6 | buffer[5].6 | buffer[6].6 | buffer[7].6 | buffer[8].6 | buffer[...].6 | buffer[...].6 | buffer[COLUMNAS-1].6 |
buffer[0].7 | buffer[1].7 | buffer[2].7 | buffer[3].7 | buffer[4].7 | buffer[5].7 | buffer[6].7 | buffer[7].7 | buffer[8].7 | buffer[...].7 | buffer[...].7 | buffer[COLUMNAS-1].7 |
Tómese 2,10 y más minutos para analizar esta tabla. Fíjese como cada LED de la matriz se asocia según su posición a un determinado bit del arreglo "buffer". Es imprescindible que usted logre asociar esto para poder comprender el funcionamiento de la matriz. Un bit puede poseer dos estados: 0 o 1. El LED también puede tener dos estados: Apagado o Encendido.
Entonces he generado una relación entre cada LED y un bit del arreglo, según su ubicación dentro de ella.
Pausa hasta continuación...