Está en la página 1de 4

Curso de Microprocesadores

Laboratorio 6 – Trabajo Final


Cronómetro en display LED RGB de 32×32

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:

La matriz de 32 lineas se barre de a 2 líneas a la vez; la 0 y la 16, la 1 y la 17, y así sucesivamente


hasta la línea 15 y la 31. ¿Qué significa que se ‘barre’? lo mismo que cualquier monitor o TV, la
pantalla no se ilumina toda a la misma vez para evitar un consumo de energía excesivo y un
hardware complicado. En cambio, se ilumina renglón a renglón; si el proceso es rápido el ojo
humano percibe una imagen completa en la pantalla. En el caso de nuestro panel de 32×32 se
ilumina de a 2 renglones a la vez, de modo que la pantalla completa se cubre en 16 pasos.

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.

Los pines que controlan el display acorde a [1] son:

R1G1B1 , R0G0B0 – Indican para dos pixeles el valor de la componente RGB correspondiente.

Clk – Con el flanco de Clk se transfieren R1G1B1 R0G0B0 al panel LED.

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.

Los pines se deben conectar al ATmega328P Xplained Mini de la siguiente forma:

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.

Programas ejemplo y librería para controlar el panel LED.


Para manejar el panel LED, un programa en el ATmega deberá rápidamente ir enviando de a 192
bits con el código RGB de 64 pixeles y alternando el valor de ABCD, en principio con /OE siempre
activado. El procedimiento parece complicado, aunque no lo es, y afortunadamente para la
práctica se brinda algunas rutinas en Assembler que ya realizan la tarea. En una versión simple
de este Trabajo Final, Usted no debería tener que cambiar las mismas, aunque sí podría realizar
modificaciones para lograr mejores efectos visuales que son opcionales (por ejemplo,
desarrollar un nuevo controlador del panel que maneje también intensidad de cada color).

El controlador del panel que se brinda realiza la siguiente tarea:

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

Además de la rutina de atención a la interrupción, en el programa ejemplo se brindan otras


rutinas que permiten manejar la pantalla tales como: borrar pantalla, escribir un carácter por
pantalla, copiar una imagen a la pantalla.

Rutinas incluidas en los programas ejemplo:


_tmr0_int:

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:

Escribe todos valores 0x00 en los 1024 bytes de la memoria de pantalla.


copia_img:

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.

Parámetros: Al llamar a la rutina debo indicar el número a imprimir, posición y color


r18 = número a imprimir del 0 al 9 (por ahora solo 0 y 1 disponibles)
r16 y r17 = fila y columna del pixel superior izquierdo del caracter.
r20 = color del caracter.

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:

Como en el Laboratorio 3 debe implementar un cronómetro que ahora se desplegará por el


panel LED. El cronómetro debe empezar una cuenta regresiva a partir de un valor dado
cualquiera (en principio un valor fijo que se configura en el programa principal (main)). El
cronómetro se irá mostrando en el panel LED. Al llegar a 0 debe desplegar un efecto visual
Curso de Microprocesadores

cualquiera en el panel. Observar el video ejemplo. Para la tarea puede programar el


microcontrolador en lenguaje C, Assembler o utilizar las herramientas que desee.

Se considera importante:

 Que el cronómetro genere dentro de la precisión del ATmega (16MHz) un reloj de


exactamente 1 segundo. Para facilitar la tarea ya se le da en el programa ejemplo, el
timer1 configurado para generar una interrupción por segundo.
 ¡Los mejores efectos visuales posibles!

Para la tarea se sugiere proceder de la siguiente manera:

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.

3 – Modifique la rutina de atención a la interrupción del timer0(recomendado) o utilice otro


timer, para mantener el cronómetro en cuenta regresiva. Verifique que puede sacar el
cronómetro por el display.

4 – Controle cuando el cronómetro llega a 0 y despliegue una pantalla de fin de cuenta


utilizando la rutina copia_img:

5 – Modifique el programa para lograr ¡mejores efectos visuales!.

También podría gustarte