Autor Tema: Contador en MikroC no me funciona del todo en Proteus  (Leído 3409 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado ricamesa

  • PIC10
  • *
  • Mensajes: 10
Contador en MikroC no me funciona del todo en Proteus
« en: 26 de Enero de 2017, 21:05:24 »
Hola a todos, estoy en periodo de aprendizaje  de MikroC, estudiándolo en el libro “DISEÑO Y SIMULACIÓN DE SISTEMAS MICROCONTROLADOS EN LENGUAJE C” de Juan Ricardo Clavijo Mendoza, he realizado el contador de 0 a 9999, con un display dinámico de 7 segmentos, con 4 dígitos, prácticamente como está en el libro, solo que en vez del PIC 16F84A, lo hago con el 16F887 y cambio el puerto que alimenta, los pines a, b, c, d, e, f, g del puerto B  como el libro, al puerto C y para los cuatro cátodos del display uso el puerto A (RA0, RA1, RA2 y RA3) mediante inversores 7404 o transistores 2N2222 como se indica en el libro mencionado. compilo el programa sin ningún problema y al simularlo en Proteus, si utilizo inversores, se muestran el conteo adecuadamente, pero no ocurre lo mismo, si empleo los transistores mencionados y tampoco si empleo el ULN2803 (arreglo con Darlington), al cual  modifique agregándole el pin 9 GND, pues si lo hago sin esto como viene originalmente en Proteus,  no se muestra nada, ojalá alguno de ustedes, me pueda indicar mi error o cual es el problema y como solucionarlo, mil gracias de antemano por su ayuda y saludos para todos, les anexo el código.
********************************************************************************
Código:
//Declara las constantes para el display.
const unsigned short DIGITOS[] =
{
     0x3F,//Código del dígito 0
     0x06,//Código del dígito 1
     0x5B,//Código del dígito 2
     0x4F,//Código del dígito 3
     0x66,//Código del dígito 4
     0x6D,//Código del dígito 5
     0x7D,//Código del dígito 6
     0x07,//Código del dígito 7
     0x7F,//Código del dígito 8
     0x6F //Código del dígito 9
};
//Función para visualizar el display dinámico
void VerDisplay(int Numero)
{
unsigned short U;//Variable para guardar las unidades
unsigned short D;//Variable para guardar las decenas
unsigned short C;//Variable para guardar las centenas
unsigned short UM;// Variable para guardar las unidades de mil
UM = Numero/1000; //Cálculo de las unidades de mil
C = (Numero-UM*1000)/100; //Cálculo de las centenas
D = (Numero-UM*1000-C*100)/10; //Cálculo de las decenas
U = (Numero-UM*1000-C*100-D*10); //Cálculo de las unidades

PORTC = DIGITOS; // Visualiza las unidades
PORTA.F0 = 1;       // Activa en alto el primer display
delay_ms(10);       //Retardo de 10 milisegundos
PORTA = 0;          //Desactiva todos los displays

PORTC = DIGITOS[D]; // Visualiza las decenas
PORTA.F1 = 1;       // Activa en alto el segundo display
delay_ms(10);       //Retardo de 10 milisegundos
PORTA = 0;          //Desactiva todos los displays

PORTC = DIGITOS[C]; // Visualiza las centenas
PORTA.F2 = 1;       // Activa en alto el tercer display
delay_ms(10);       //Retardo de 10 milisegundos
PORTA = 0;          //Desactiva todos los displays

PORTC = DIGITOS[UM]; // Visualiza las  unidades de
PORTA.F3 = 1;       // Activa en alto el cuarto display
delay_ms(10);       //Retardo de 10 milisegundos
PORTA = 0;          //Desactiva todos los displays
}

void main(void)
{
        unsigned short N = 0;//Variable de contéo
        int Numero = 0;
        TRISC = 0;  //Configura el puerto C como salida
        TRISA = 0;  //Configura el puerto A como salida
        PORTA = 0;  //Se desactivan todos los displays
        while(1)    //Bucle infinito
        {
        //Se visualiza el valor de Número.
        VerDisplay(Numero);//Esta función dura aproximadamente 40 milisegundos
        //Se cuentan 12 incrementos en N para hacer un incremento en NÚMERO
        //aproximadamente cada 500 milisegundos.
        N++;
        if (N==12)
        {
          N = 0; //Se reinicia el cont{eo de N.
          Numero++; //Se incrementa el valor de N{umero.
          if (Numero==10000) //Se evalúa si Numero vale 10000
          Numero = 0; // y se reinicia en 0 si es 10000.
        }
       }
}


Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Contador en MikroC no me funciona del todo en Proteus
« Respuesta #1 en: 27 de Enero de 2017, 00:34:40 »
Citar
para los cuatro cátodos del display uso el puerto A (RA0, RA1, RA2 y RA3)

Deberias mirar el circuito por que asi no estan conectados.


Desconectado ricamesa

  • PIC10
  • *
  • Mensajes: 10
Re:Contador en MikroC no me funciona del todo en Proteus
« Respuesta #2 en: 27 de Enero de 2017, 17:07:38 »
Gracias por contestar,  la imagen 1, con inversores 7404 funciona perfectamente; la imagen 2, con transistores 2N2222 (como lo indica el libro) y la imagen 3, con el CI ULN2803 (arreglo de darlington), en ambos casos ocurre lo mismo mostrado en las imágenes.
Saludos

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Contador en MikroC no me funciona del todo en Proteus
« Respuesta #3 en: 27 de Enero de 2017, 17:45:13 »
Poneles resistencia de pull-up a las entradas del LCD ( lo de los catodos ).

¿Por que?, por que tu inversor puede dar 5V o GND, pero a diferencia del transistor o del arreglo darlington que es el ULN, estos solo pueden contarla salida a GND. Si o si tenes que llevar a un valor positivo en algun momento y ningun de ellos te lo permite.

Pone resistencias desde cada entrada a cada comun del LCD a 5V, y usa una resistencia de 10k, adjunto ejemplo de 1 entrada, deberias repetirlo para todas:


* Imagen 3.png
(12.22 kB, 776x240 - visto 2950 veces)
« Última modificación: 27 de Enero de 2017, 17:48:59 por KILLERJC »

Desconectado ricamesa

  • PIC10
  • *
  • Mensajes: 10
Re:Contador en MikroC no me funciona del todo en Proteus
« Respuesta #4 en: 28 de Enero de 2017, 21:07:50 »
Muchas gracias KILLERJC, ya están trabajando adecuadamente, gran aprendizaje para mi tu ayuda.   :) ((:-))