Electrónica•Ingenia

Electrónica•Ingenia
lunes, 28 de enero de 2013

Tema 2.- Gestión de los puertos (V)

Controlando más de un display.


En ocasiones nos encontramos con la necesidad de controlar o mostrar más de un dígito mediante 2 o más displays. Para ello nos tendremos que valer de una serie de técnicas o truquitos para mostrar dicha información sin tener que conectar todos los pines del PIC a los dos o mas displays.
Para ello nos aprovecharemos de un defecto o característica de nuestros ojos. Este defecto se le conoce como persistencia de la visión. Se trata de que una imagen permanece en la retina humana una décima de segundo después de que esta ya haya desaparecido por completo. Nuestro ojo ve con una cadencia de 10 imágenes por segundo y después nuestro celebro las enlaza como una sola imagen visual, móvil y continua. El cine aprovecha este efecto y provoca ese "enlace" proyectando a más de 10 imágenes por segundo (generalmente 24), lo que genera en nuestro cerebro la ilusión de movimiento. Nosotros también haremos uso de esta característica para mostrar los dígitos en varios displays.
Conectaremos a nuestro Pic un 74LS47 como en el ejercicio 9, de la anterior entrada, pero en vez de conectar un display conectaremos dos. Los ánodos de los dos displays los habilitaremos y los deshabilitaremos con dos transistores conectados a RA2 y RA3 del Pic, tal y como muestra el siguiente esquema: 
Ejercicio 11. Contador de 00-99 automático.

Y el funcionamiento será el siguiente: Mostraremos primero un dígito habilitando un transistor y deshabilitando el otro. Esperaremos unos  45 milisegundos y repetiremos con el otro display durante el mismo tiempo pero mostrando otro numero o dígito distinto. Haciendo esto conseguiremos no apreciar ningún parpadeo en los displays mostrando los dos dígitos muy claramente.

Vamos a aplicarlo en un ejercicio para ver su funcionamiento implementado en C.

Ejercicio 11. En este ejercicio realizaremos un contador automático de 00-99. Cuando éste llegue a 99 volverá 00 y así indefinidamente.
//////////////////////////////////////////////////////////////////////
//   _____               _   _     _ ____          _                //
//  |   __|___ _____ ___| |_|_|___| |    \ ___ ___|_|___ ___ ___    //
//  |__   | .'|     |_ -|   | | -_| |  |  | -_|_ -| | . |   |_ -|   //
//  |_____|__,|_|_|_|___|_|_|_|___|_|____/|___|___|_|_  |_|_|___|   //
//                                                  |___|           //
//                                                                  //
//  FIRMWARE:    Ejemplo 11           MICROCONTROLADOR: PIC16F88    //
//                                                                  //
//  WEB:  www.samshieldesigns.blogspot.com                          //
//  COMPILADOR:  CCS C Compiler v4.140                              //
//  IDE:   MPLAB IDE v.8.84                                         //
//  DESCRIPCION: 7seg. Contador 00-99 por el 7seg autom tico        //
//  Utilizando el 74ls47.                                           //
//                                                                  //
//////////////////////////////////////////////////////////////////////
#include <16f88.h>
//////////////////////////////////////////////////////////////////////
//                       CONFIGURACION DEL PIC                      //
//////////////////////////////////////////////////////////////////////
#FUSES HS              // High speed Osc (> 4mhz for PCM/PCH) (>10mhz
                       // for PCD)
#FUSES MCLR            // Master Clear pin enabled
#FUSES NOBROWNOUT      // No brownout reset
#FUSES NOLVP           // No low voltage prgming, B3(PIC16) or B5
                       // (PIC18)used for I/O
#FUSES NOCPD           // No EE protection
#FUSES NOPUT           // No Power Up Timer
#FUSES NOPROTECT       // Code not protected from reading
#FUSES NOWDT           // No Watch Dog Timer
#USE delay(clock=20000000)     // Frecuencia de 20Mhz
#USE standard_io(A)    // Configuramos el PORTA
#USE standard_io(B)    // Configuramos el PORTB
#DEFINE retardo  45   // Retardo de 25ms
//////////////////////////////////////////////////////////////////////
//                     CUERPO PRINCIAPAL FIRMWARE                   //
//////////////////////////////////////////////////////////////////////
void main()
  {
  port_b_pullups(true);
  disable_interrupts(GLOBAL);   // Desactivamos las interrupciones
  int unid=0, dec=0;            // variables para los dos digitos.   
  int BCD7seg[10]={0b0000,0b0001,0b0010,0b0011,0b0100,
                   0b0101,0b0110,0b0111,0b1000,0b1001};

  while(true)                   // Bucle infinito. True = 1
    {
    for(dec=0;dec<10;dec++)     // Bucle for para las decenas.
      {
      for(unid=0;unid<10;unid++)// Bucle for para las unidades. 
         {
         output_high(PIN_A3);   // Activamos el anodo de las unidades 
         output_b(BCD7seg[unid]);// y mostramos el n mero.
         delay_ms(retardo);      // esperamos un tiempo y apagamos 
         output_low(PIN_A3);     // el anodo de las unidades.
         output_high(PIN_A2);    // Activamos el anodo de las decenas
         output_b(BCD7seg[dec]); // y mostramos las decenas
         delay_ms(retardo);      // esperamos mostrando el numero 
         output_low(PIN_A2);     // y apagamos el display.
         }                       // Cada vez que hacemos esto incrementa  
      }                         // unidades y cada 10 unidades incremen-
                                 // ta las decenas.
    } // End while(TRUE)
  } //Fin void main
Descargar código y .hex:
Ahora realizaremos el mismo ejercicio pero el control del incremento y decremento lo haremos nosotros mediante dos pulsadores conectados a RA0 y RA1.
Ejemplo 12. Contador 00-99 incrementa/decrementa con RA0 y RA1.
Ejercicio 12. Contador de 00-99 con dos pulsadores para incrementar y decrementar en RA0 y RA1. Cuando éste llegue a 99 volverá 00 y al contrario. 
//////////////////////////////////////////////////////////////////////
//   _____               _   _     _ ____          _                //
//  |   __|___ _____ ___| |_|_|___| |    \ ___ ___|_|___ ___ ___    //
//  |__   | .'|     |_ -|   | | -_| |  |  | -_|_ -| | . |   |_ -|   //
//  |_____|__,|_|_|_|___|_|_|_|___|_|____/|___|___|_|_  |_|_|___|   //
//                                                  |___|           //
//                                                                  //
//  FIRMWARE:    Ejemplo 12           MICROCONTROLADOR: PIC16F88    //
//                                                                  //
//  WEB:  www.samshieldesigns.blogspot.com                          //
//  COMPILADOR:  CCS C Compiler v4.140                              //
//  IDE:   MPLAB IDE v.8.84                                         //
//  DESCRIPCION: 7seg. Contador 0-9 por el 7seg incrementa y        //
//  decrementa pulsando RA0 y RA1. Utilizando el 74ls47.            //
//                                                                  //
//////////////////////////////////////////////////////////////////////
#include <16f88.h>
//////////////////////////////////////////////////////////////////////
//                       CONFIGURACION DEL PIC                      //
//////////////////////////////////////////////////////////////////////
#FUSES HS              // High speed Osc (> 4mhz for PCM/PCH) (>10mhz
                       // for PCD)
#FUSES MCLR            // Master Clear pin enabled
#FUSES NOBROWNOUT      // No brownout reset
#FUSES NOLVP           // No low voltage prgming, B3(PIC16) or B5
                       // (PIC18)used for I/O
#FUSES NOCPD           // No EE protection
#FUSES NOPUT           // No Power Up Timer
#FUSES NOPROTECT       // Code not protected from reading
#FUSES NOWDT           // No Watch Dog Timer
#USE delay(clock=20000000)     // Frecuencia de 20Mhz
#USE standard_io(A)    // Configuramos el PORTA
#USE standard_io(B)    // Configuramos el PORTB
#DEFINE retardo  100   // Retardo de 25ms
//////////////////////////////////////////////////////////////////////
//                     CUERPO PRINCIAPAL FIRMWARE                   //
//////////////////////////////////////////////////////////////////////
void main()
  {
  port_b_pullups(true);
  disable_interrupts(GLOBAL);   // Desactivamos las interrupciones
  int unid=0, dec=0;            // variables para los dos digitos.   
  int BCD7seg[10]={0b0000,0b0001,0b0010,0b0011,0b0100,
                   0b0101,0b0110,0b0111,0b1000,0b1001};

  while(true)                   // Bucle infinito. True = 1
    {
    if(input(PIN_A0) == 1){     // Es RA0 es igual a "1"????
        delay_ms(retardo);      // Antirrebote
        unid++;                 // Sumo 1 a "X"
        if(unid>9){             // Si x es superior a nueve
           unid=0;
           dec++;
           if(dec>9) dec=0;
        } 
    }
    output_high(PIN_A3);
    output_b(BCD7seg[unid]);   // Muestro el n  en el Display
    delay_ms(12);
    output_low(PIN_A3);
    
    if(input(PIN_A1) == 1){     // Es RA1 es igual a "1"????
        delay_ms(retardo);      // Antirrebote
        unid--;                 // resto 1 a "X"
        if(unid==255){          // Si x es inferior a cero o lo que  
                                // es lo mismo 255 (va de 0-255)
           unid=9;              // x pasar  a ser nueve.
           dec--;
           if(dec==255) dec=9;
        }
    }
    output_high(PIN_A2);
    output_b(BCD7seg[dec]);   // Muestro el n  en el Display
    delay_ms(12);
    output_low(PIN_A2);
    } // End while(TRUE)
  } //Fin void main
Descargar código y .hex:
Como se puede apreciar en el vídeo tenemos aplicado un "antirrebote" algo rústico que lo que hace es esperar un tiempo (milisegundos) a que la tensión procedente del botón se estabilice. Más adelante os pondré ejemplos más conseguidos para evitar las falsas lecturas en las pulsaciones.
En la siguiente entrada del curso de CCS C voy a desarrollar una PCB para una insoladora casera en la que utilizaremos 4 displays y dos salidas relés para el control de las lamparas dando por terminado el control de los displays.  ¿Cual sería la aplicación o proyecto que harías usando displays? Nos vemos en la siguiente entrada. Un saludo!
Share this post
  • Share to Facebook
  • Share to Twitter
  • Share to Google+
  • Share to Stumble Upon
  • Share to Evernote
  • Share to Blogger
  • Share to Email
  • Share to Yahoo Messenger
  • More...

3 comentarios:

  1. esta muy buena la explicacion y todo pero disculpa tu podrias ayudarme como conecto el pic 16f268a al pc por usb

    ResponderEliminar
    Respuestas
    1. Hola Hernan, pues en el PIC16f628A no tiene hardware para el control del USB como puede ser el PIC18F2550 o el PIC18F4550. Pero puedes utilizar un convertidor RS-232/USB como he comentado en la ultima entrada que he publicado.

      Eliminar
  2. entrada muy interesate! espero ver como sigue, gracias!! (o)

    ResponderEliminar