Decodificador de 8 bits con el pic 16f887a con 3 display

:unsure:estoy haciendo un decodificador de 8 bits con el pic 16f887a con 3 display de cátodo común para el curso de sistemas digitales en la universidad, lo probé en el el proteus y funciona bien luego lo arme en el protoboard y comenzaba a parpadear los display solo manteniéndose quieto en el numero 255 y ahora el ingeniero me pidió que lo lleve a pcb en circuito.
ya hice el pcb y todo pero no tengo la seguridad de que funcione y recurro a ustedes para ver que puedo mejorar para que trabaje le decodificador gracias por la ayuda que puedan brindar. :)
aquí adjunto el código del decodificador:
Código:
//******************************************************************************
#include <16F877a.h>//microcontrolador usado
#fuses XT,NOWDT,NOPROTECT,NOBROWNOUT,NOLVP 
#use delay(clock=4000000)//frecuencia de trabajo del pic
#use standard_io(b)//uso del puerto b como entrada o salida 
#use standard_io(c)//uso del puerto c como entrada o salida 
#use standard_io(d)//uso del puerto d como entrada o salida  
#use standard_io(a)//uso del puerto a como entrada o salida 
#use standard_io(e)//uso del puerto e como entrada o salida 

//******************************************************************************
//VARIABLES
//******************************************************************************
int tabDISPLAY[10]={0b11111100,0b01100000,0b11011010,0b11110010,0b01100110,0b10110110,0b10111110,0b11100000,0b11111110,0b11110110};//tabla usadas para centenas y unidades
int tabDISPLAY2[3]={0b11111111,0b00000110,0b11011011};//tabla del puerto a  usada para centenas
int tabDISPLAY3[3]={0b10000100,0b00000000,0b10000011};//tabla del puerto e  usada para centenas
int numero,delay=1;//declarando la variable numero y un tiempo de retardo de 1ms
int h_digit,m_digit,i_digit;//declarando las variables h_digit,m_digit,i_digit
//******************************************************************************
//FUNCIONES
//******************************************************************************
void vizu(void);
void int2bcd(int valor);
void int2DISPLAY(int valor1);
//******************************************************************************
///PROGRAMA 
//******************************************************************************
void main(void)//la funcion principal 

  {
      while(true)//bucle infinito
    {  
         vizu();
        
    }
         
   }
//*****************************************************************************            
 void vizu(void)   
             {
                 numero=input_b();//la variable numero contine los datos de la entrada del puerto bit
                 int2DISPLAY(numero);//int2display contine a la variable numero
                 output_a(tabDISPLAY2[h_digit]);//muestra el valor de h_digit (centenas) por el puerto a usando la tabla tabDISPLAY2
                 delay_ms(delay);//tiempo de muestra de dato el de delay
                 output_e(tabDISPLAY3[h_digit]);//muestra el valor de h_digit (centenas) por el puerto a usando la tabla tabDISPLAY2
                 delay_ms(delay);
                 output_c(tabDISPLAY[m_digit]);//muestra el valor de m_digit (decenas) por el puerto a usando la tabla tabDISPLAY
                 delay_ms(delay);
                 output_d(tabDISPLAY[i_digit]);//muestra el valor de i_digit (unidades) por el puerto a usando la tabla tabDISPLAY
                 delay_ms(delay);
             
              }  
                    
//******************************************************************************                           
//******************************************************************************
// funcion que convierte de binario a a decimal en el display
//
void int2DISPLAY(int valor1)
     {
      h_digit=(int)valor1/100; //1er digito en centenas
      valor1-=h_digit*100;      //y se le resto el valor
      m_digit=(int)valor1/10;   //2do digito
      valor1-=m_digit*10;       //y tambien se le resto
      i_digit=valor1;           // y por último solo me quedan las unidades
      
     }

/******************************************************************************/
espero su ayuda, gracias por los aportes que puedan brindar



hola gracias por las correcciones, a ver si no está mal diseñada mi pcb
 

Adjuntos

  • deco modificado.rar
    48.7 KB · Visitas: 14
Última edición por un moderador:
Hola pablov

Quiere decir que el Código está bien.
Sin embargo en el circuito hay algunas cosas por mejorar.

Debes asegurarte, estudiando las hojas de datos del PIC, que las salidas a donde están conectados tanto los Display’s como los LED’s puedan suministrar la corriente para encenderlos,

El LED del ISIS de Proteus tiene las siguientes características: VF = 2.2V, IF = 10mA.
Así que para cada LED se requiere una resistencia (R) limitadora de corriente de: (Vcc - VF) / IF = R.
Esa fórmula la puede utilizar para calcular la resistencia de acuerdo a las características eléctricas de los LED’s que estés utilizando en la realidad.

Lo mismo ocurre con los Display’s; los del ISIS de Proteus tienen las siguientes características: VF = 1.5V, IF =10mA.
Utiliza la misma formula, aquí arriba para calcular el valor de la resistencia “Por Segmento” para los Display’s que estés utilizando en la realidad.

Tienes unas salidas del PIC puenteadas entre Si: RA4, RE1, RE2. están conectadas al segmento E del Display para las centenas. No creo que esto sea correcto.

El botón para restablecer al PIC queda mejor como se mira en la imagen adjunta.

saludos
a sus ordenes
 

Adjuntos

  • Deco Modificado.jpg
    Deco Modificado.jpg
    219.6 KB · Visitas: 17
  • Deco Modificado.zip
    20.3 KB · Visitas: 16
Atrás
Arriba