lunes, 7 de mayo de 2012

Manejo de matrices de puntos con microcontroladores

En esta entrada de blog se mostrará cómo controlar 2 displays de matrices de puntos de 5x7, usando un microcontrolador PIC16F1937, drivers de corriente ULN 2803 y resistencias.

Los displays de matrices de puntos siempre necesitan de un controlador para poder funcionar adecuadamente. Los pines de las matrices de puntos permiten controlar las filas y las columnas. Para poder efectuar una correcta visualización, siempre es necesario realizar un barrido ya sea por filas o por columnas. Por ejemplo, si es un barrido por filas, en cada instante de tiempo solo habrá una fila encendida, con los correspondientes píxeles, luego se enciende la siguiente fila, y luego la siguiente. Este barrido se realiza de forma muy rápida, y gracias al efecto de retención del ojo, pareciera que todas las filas se encuentran encendidas al mismo tiempo.

Cuando se usan displays de matrices de puntos, generalmente es recomendable diseñar el circuito con transistores o drivers de corriente, para que el microcontrolador no tenga que entregar mucha corriente. Para el ejemplo que se mostrará a continuación, se hace uso de 3 drivers ULN2803 (1 para filas y 2 para las columnas). El barrido se efectúa por filas.

Adicionamente, en el ejemplo que se muestra, se configuró el microcontrolador para que reciba a través del módulo UART los siguientes números en hexadecimal, los cuales se visualizarán en las dos matrices de puntos: 0x30, 0x31, 0x32 y 0x33, correspondientes a los caracteres '0', '1', '2' y '3'.

A continuación se muestra el diagrama esquemático del circuito:

En el anterior diagrama esquemático, se hace uso de la red de resistencias RN1 para que la simulación funcione de forma adecuada, ya que el modelo del ULN2803 se encuentra con algunos fallos.

Por su parte, el programa con el cual se debe realizar el control del sistema, debe estar constantemente en un ciclo de actualización y barrido por filas. Además, el programa debe contar con una tabla, en la cual exista el mapeo, píxel por píxel, de los caracteres que se visualizarán en las matrices.

A continuación se muestra el código en C para el compilador CCS para el circuito mostrado anteriormente.

El programa principal es el siguiente:

#include <pruebaleds.h>

int8 dato=48;

#INT_RDA
void inputSerial()  
{  
      dato=fgetc(PORT1);
}

void main()
{
   setup_oscillator( OSC_4MHZ );

   int8 i;
   byte const da[10][7]={14,17,17,17,17,17,14,4,6,5,4,4,4,31,15,16,16,15,1,1,31,15,16,16,15,16,16,15};
 
   enable_interrupts(GLOBAL);
   enable_interrupts(INT_RDA);
   
   while(True)
   {
      for(i=0;i<7;i++)
      {
         output_a(~da[dato & 0x0F][i]);
         output_b(~da[(dato & 0xF0)>>4][i]);
         output_d(0x01 << i);
         delay_ms(1);
         output_d(0x00);
      }
   }   
}

El encabezado:

#include <16F1937.h>

#FUSES NOWDT                    //No Watch Dog Timer  
#FUSES INTRC_IO                 //Internal RC Osc, no CLKOU
#FUSES NOMCLR                   //Master Clear pin used for I/O
#FUSES NOBROWNOUT               //No brownout reset
#FUSES NOIESO                   //Internal External Switch Over mode disabled
#FUSES NOFCMEN                  //Fail-safe clock monitor disabled
#FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O

#use delay(clock=4000000)
#use rs232(baud=9600, xmit=PIN_C6,rcv=PIN_C7,stream=PORT1)

Existe en el mercado un driver especializado para controlar matrices de puntos, su referencia es MAX6952. Lastimosamente es muy costoso (aprox 25 USD), pero puede llegar a ahorrar mucho tiempo y espacio, y si se tiene presupuesto, es completamente recomendable usarlo.