Acciones

Max7219

De CoffeeBrain-Wiki

07-09-14-max7219.jpg

Descripción:

Este documento presenta las consideraciones generales que deben ser tenidas en cuenta para el manejo de la tarjeta de expansión Max7219.

Autores:


1 Principio de operación

1.1 Visualización dinámica

El funcionamiento básico de la tarjeta de expansión Max7219 se basa en al concepto de visualización dinámica. Esta técnica de manejo óptico consiste en la visualización parcial de la información a través de segmentos activados a diferentes instantes de tiempo. Gracias al efecto de retención de retina, los segmentos de información parcial a diferentes instantes de tiempo son procesados por el cerebro humano para dar lugar a la impresión de una imagen con la información completa [1]. El uso de la visualización dinámica es empleada en muchos sistemas electrónicos debido a que reduce notablemente el consumo de potencia en dispositivos de visualización. Además, reduce drásticamente la necesidad de disponer pines de entrada y salida en dispositivos de visualización y control. Sin embargo, la implicación de manejar tiempos de visualización parcial impone cierta dificultad en los algoritmos empleados para mostrar la información de una forma adecuada.

En particular, el funcionamiento del manejador descrito en este artículo aplica el concepto de visualización dinámica al mostrar la información correspondiente a cada fila de la matriz, una por una, en una secuencia de refresco con una frecuencia lo suficientemente alta para generar el efecto de retención de retina. El proceso es descrito gráficamente a continuación.

Información que debe ser presentada en la matriz.

El proceso para visualizar la información presentada en la imagen anterior se realiza por medio de un barrido sobre cada una de las filas de la matriz, activando en cada caso la información parcial correspondiente. El resultado de realizar este proceso a una frecuencia lo suficientemente alta da como resultado la visualización de la información completa.

Proceso de visualización

1.2 Manejador (Driver) 7219

Con la finalidad de reducir los pines necesarios para el control de matrices de LEDs y realizar el proceso de visualización dinámica de una forma más óptima y con mayor calidad se emplea el circuito integrado con referencia MAX7219. Este componente es empleado para controlar elementos de visualización como matrices y displays. En particular se aplica a elementos de cátodo común. La facilidad de manejo de este dispositivo radica en que la comunicación con el elemento de control (uC o FPGA) se realiza de manera serial. La lógica interna del dispositivo adquiere los datos enviados y realiza el proceso de visualización dinámica correspondiente. En particular, la tarjeta de desarrollo que se trabaja a lo largo de este documento cuenta con dos pines dispuestos para la alimentación (VCC y GND), una señal de reloj (CLK) para el proceso de manejo interno, un pin de entrada (DIN) en el cual se ingresan los datos de manera serial y in pin de selección (CS) para determinar en qué momento se deben almacenar los datos de entrada en los registros dispuestos para este propósito. Para hallar más información de este componente, remitirse a: Datasheet MAX7219

Tarjeta con CI MAX7219. Pines de alimentación(VCC y GND) y pines de control(CLK,CS,DIN)

2 Acople FPGA

A continuación se presentan algunas consideraciones necesarias para realizar el acople del manejador Max7219 con un dispositivo basado en FPGA.

2.1 Módulo Verilog

Para realizar la comunicación serial con el CI MAX7219 se cuenta con un módulo descrito en Verilog para este propósito en particular. El módulo max7219_ctrl.v tiene la función específica de realizar la comunicación y puede ser accedido a través del repositorio del proyecto:

git clone http://git.code.sf.net/p/sharkboard/code sharkboard-code

En el directorio /rtl-generic/max7219_ctrl/

La función del módulo descrita a grandes rasgos será presentada a continuación:

Diagrama de caja negra - Módulo max7219_ctrl.v

El módulo presenta las siguientes entradas y salidas:

(in)clk: señal de reloj general.
(in)reset: señal de reset del sistema.
(in)disp_data[7:0]: dato de entrada. Este corresponde al valor que se muestra en la fila activa.
(out)max7219_din: corresponde a la salida del flujo serial de datos, esta debe ser conectada al pin din de la tarjeta.
(out)max7219_ncs: corresponde a la señal de chip select. Esta debe ser conectada al pin cs de la tarjeta.
(out)max7219_clk: corresponde a la señal de reloj generada para el manejo interno del CI Max7219. Esta debe ser conectada al pin clk de la tarjeta.
(out)disp_adrr[2:0]: este valor corresponde al número de la fila que se encuentra actualmente activo.

El módulo de control descrito anteriormente realiza un barrido constante sobre cada una de las filas de la matriz. El valor de salida del pin disp_adrr indica cuál es la fila que se encuentra activa en un momento particular. La algorítmica diseñada por el usuario se debe centrar en la selección de los datos que se deben mostrar en cada fila.

2.2 Ejemplo 1 - Imagen simple (sharkboard)

Codigo Fuente: Archivo:Max7219E1vq.tar

A continuación se muestra un breve ejemplo de la utilización del módulo max7219_ctrl.v descrito anteriormente. En particular, se plantea la siguiente arquitectura hardware:

Arquitectura ejemplo 1

En esta arquitectura se dispone de un bloque combinacional llamado imagen.v, el cual consta de un simple multiplexor que determina el dato de entrada al módulo max7219_ctrl.v que finalmente será mostrado en la fila actual del barrido dinámico. El selector del multiplexor es asociado al indicador de la fila actual entregado por el módulo max7219_ctrl.v con la finalidad de efectuar una sincronización adecuada de la información mostrada y la fila activa. El resultado obtenido es presentado a continuación:

Código

Resultado

module imagen(
    input wire [2:0] act_add,
    output wire [7:0] max_in
    );
 
assign max_in =(act_add==3'b000)?8'b00111100:
	       (act_add==3'b001)?8'b01000010:
	       (act_add==3'b010)?8'b10001001:
	       (act_add==3'b011)?8'b10000010:
	       (act_add==3'b100)?8'b10000100:
	       (act_add==3'b101)?8'b10000010:
	       (act_add==3'b110)?8'b01000001:
			     	 8'b00111110;
endmodule

070914-MAX-E1.jpg



2.3 Ejemplo 2 - Tarjeta de prueba (sharkboard)

Con la finalidad de facilitar el desarrollo de prototipos rápidos se diseñó la siguiente tarjeta de prueba. Esta plataforma electrónica cuenta con un acople para la tarjeta SharkBOARD-FPGA, cuatro pulsadores para permitir la interacción con el usuario y un acople para la conexión de la matriz max7219 con sus respectivos pines de alimentación y datos.

Tarjeta de expansión

Con la finalidad de probar los componentes físicos de la tarjeta de prueba se desarrolló el siguiente código en Verilog para realizar validaciones de la conexión, el funcionamiento de la matriz, de los pulsadores y de la tarjeta SharkBoard. El proyecto es presentado a continuación:

Código fuente: Archivo:Test1MAX7219v1.zip


Finalmente, se presenta el siguiente video en el cual se describe el funcionamiento del programa de prueba.



El programa de prueba es constituido por una máquina de dos estados que se intercalan al recibir un pulso de cualquiera de los cuatro pulsadores dispuestos en la tarjeta. Adicionalomente, la descripción hardware también cuenta módulos antirebote para garantizar el correcto funcionamiento de la interacción con el usuario y el respectivo módulo de visualización de la matriz, con una estructura similar al descrito en la sección anterior. El archivo de pines ya ha sido configurado para corresponder a las conexiones de la tarjeta. ​

2.4 Ejemplo 3 - Imagen Simple (DE0-nano)

A continuación, se presentan los pasos a seguir para utilizar la matriz de leds en la tarjeta DE0-nano, con el software Quartus en sistema operativo Ubuntu. Los bloques a utilizar serán los vistos con anterioridad en el ejemplo 1, (imagen.v y max7219_ctrl.v).

1. Abrir un terminal y ejecutar DE0-Nano-SystemBuilder

  wine ~/Downloads/DE0_Nano_SystemBuilder/DE0_Nano_SystemBuilder.exe

2. Asigne nombre a su proyecto y selecciones los siguientes módulos:

2.PNG

3. Click en Generate y ubique el archivo en la ruta que desee.

4. Ejecute Quartus, Click en Open Projecty luego ubique y selecciones el archivo .qpf que se genero en el punto anterior.

5. Escriba las siguientes lineas en el archivo principal:

En REG/WIRE declarations :

 wire [7:0] data_max;
 wire [2:0] add;
En Structural coding: 
matrix_ctrl matrix_ctrl_unit_0( 
.max7219_din(GPIO[0]),//max7219_din 
.max7219_ncs(GPIO[1]),//max7219_ncs 
.max7219_clk(GPIO[2]),//max7219_clk
.disp_data(data_max), 
.disp_addr(add),
.intensity(4'hA),
.clk(CLOCK_50),
.reset(~KEY[0]) //~lowRst_System
 ); 
 
imagen img1(
.act_add(add), 
.max_in(data_max) );

De esta manera, se conectan los bloques imagen.v y max7219_ctrl.v y se asignan los pines de salida, seleccionando los primeros 3 bits de todo el vector de salidas GPIO

6. Luego en la parte superior izquierda ( Project Navigator ), seleccionar Files

7. En "Files" , Click Derecho "Add/Remove Files in Project..." y seleccionar los 3 archivos que se encuentran en el siguiente enlace (Descomprima y ubique los archivos en su carpeta de trabajo) :


8. Ahora se procede a compilar el código elaborado: Processing -> Star Compilation

9. Si no han aparecido errores, se procede a programar la tarjeta: Tools-> Programmer


10. Click en "Hardware Setup..." (La tarjeta debe estar conectada al Computador).

Diagrama de Conexiones:

4.png


11. Seleccionar en "Currently Selected hardware" la opción "USB-Blaster" y por utlimo "Close"

12. Para finalizar, click en "Start" y esperamos a ver un progreso del 100%

Demostración:

5.png

3 Referencias

[1]Arthur C. Hardy, A Study of the Persistence of Vision. Department of Physics, Massachusetts Institute of Technology, February, 1920.