Trabajo Final 2022
Trabajo Final 2022
Trabajo Final 2022
Objetivo general: Manejar un display LED de 32x32 pixeles. Revisar varios conceptos del curso
en un proyecto transversal.
Materiales: Placa de desarrollo ATmega328P Xplained Mini, módulo multifunción para Arduino,
cable micro usb. Display de 32×32 LEDs RGB.
Introducción
Para esta propuesta, se trabajará sobre un display de matriz de LEDs RGB de 32×32 pixeles. Cada
pixel contiene un LED tricolor (Red Green Blue) donde cada color se puede encender o apagar,
en una primer instancia la matriz LED no maneja intensidad de los colores(1) tan solo si está
prendido o apagado (on/off). 32×32 son en total 1024 pixeles. En la dirección [1]
https://www.adafruit.com/product/607 se presenta información técnica del dispositivo, pero
de todos modos haremos un resumen:
Para dibujar dos líneas en la pantalla, se envía en forma serie (de manera parecida al caso del
display de 7-segmentos de las prácticas anteriores) los 192 bits correspondientes al RGB de las
dos líneas a desplegar. En realidad, los datos se envían de a 6 bits, R1G1B1 y R0G0B0 para
aprovechar los puertos de 8bits del ATmega. Los datos una vez enviados se memorizan en
Latches internos del panel, activando el pin LE del display. Una vez que los 192 bits fueron
transferidos al panel, se da la orden al mismo que ilumine las dos líneas correspondiente. Esta
orden se envía neas a través de los pines ABCD del que indican qué líneas están activas. Una
característica del display es que, para limitar el consumo de energía, los LEDS no están
encendidos en forma permanente, sino que ante un cambio en ABCD, el panel ilumina las nuevas
líneas activas con un breve destello y luego se vuelve a apagar.
(1)
Esto se podría hacer a través de un control PWM de los LEDs.
R1G1B1 , R0G0B0 – Indican para dos pixeles el valor de la componente RGB correspondiente.
LE – Una vez que se transfirieron los valores RGB para los 64 pixeles correspondientes a 2 lineas,
total = 192bits, mediante LE se memoriza los 192 bits en los Latches de salida que controlan los
LEDs. LE es activa por nivel alto.
Curso de Microprocesadores
/OE – Output Enable, enciende el display. Si /OE = 1 entonces el display está apagado no importa
el valor de ABCD.
ABCD – Indica la línea activa ABCD = 0000 → líneas activas 0 y 16; ABCD = 0000 → líneas activas
1 y 17; ········· ; ABCD = 1110 → líneas activas 14 y 30; ABCD = 1111 → líneas activas 15 y 31.
Cuando el vector ABCD toma un nuevo valor, se ilumina por algunas milisegundos la nueva línea
activa.
R1G1B1:R0G0B0 - PB5:PB0
ABCD - PD3:PD0
/OE - PD4
Clk - PD5
LE - PD6
En el lab junto con el display LED se le brindará un conector que ya está armado en orden. El
docente le explicará como conectar el display a la placa del curso. También se le brindará un
cable para conectar el display a 5V para proveer energía.
Pruebe conectar el display luego de recibir las instrucciones, y ejecutar el programa ejemplo,
debería ver cuadrados de colores y otras figuras en la pantalla.
Se define una memoria RAM de pantalla de 1024 bytes, donde asignamos 1 byte para cada pixel.
Por ahora en los 3 LSBs de cada byte dejamos el código RGB del pixel correspondiente (los
restantes 5 bits no se utilizan por ahora para nada).
Luego se configuran los puertos del ATmega, y se hablita la interrupción del timer0, de manera
que interrumpa 1250 veces por segundo. La interrupción de este timer escribe e ilumina 2 líneas
cada vez (una línea de la mitad de arriba, otra de la mitad de abajo).
Para desplegar imágenes o caracteres por pantalla, Ud solo debe escribir la RAM de pantalla
pixel a pixel indicando el color. Pixel = 0-apagado; 1-Verde; 2-Rojo; 3-Amarillo; 4-Azul; 5-cyan; 6-
lila; 7-blanco.
Curso de Microprocesadores
Rutina de atención a la interrupción del timer 0; cada vez que entra despliega un nuevo par de
lineas en el display; envía los 192 bits RGB, controla LE y luego actualiza ABCD. Es decir envía e
ilumina de a dos nuevas líneas por vez.
Uso algunos registros exclusivos que por tanto no puedo usar en otras rutinas:
- Y(YH:YL) memoriza la dirección de pantalla que estoy recorriendo
- R25 memoriza la linea siguiente a iluminar
borra_panel:
Copia una imagen fija completa de 1024 Bytes, predefinida en la memoria de programa, a la
memoria de pantalla. Al llamar a la rutina, el registro Z debe apuntar a la imagen fija de 1024
Bytes.
copia_char:
Copia un carácter de tamaño 8x10 pixeles definido en el mapa de caracteres, a la memoria de
pantalla. Por ahora pensado solo para los números del 0 al 9 de tamaño fijo 8x10 pixeles. Incluso
solo se dibujó los caracterers correspondientes al ‘0’ y al ‘1’. Ud debe completar el mapa. Los
carateres son de 8x10 puntos por tanto ocupan solo 10 Bytes; esta rutina toma los 10 Bytes y
bit a bit va programando la memoria de pantalla.
La Tarea a Realizar:
Después de toda esta introducción y descripción de rutinas, la tarea mínima a realizar es la
siguiente:
Se considera importante:
1 – Modifique la definición del ‘mapa de caracteres’ del programa ejemplo para cubrir los
números del 0 al 9; verifique que puede sacar por el display los nuevos dígitos utilizando la rutina
copia_char.
2 – Verifique que puede sacar por pantalla un número de 4 dígitos, modificando la posición en
pantalla de cada uno de los caracteres.