TODOPIC
Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: ricamesa 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.
}
}
}
-
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.
-
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
-
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:
- Tienes que ingresar para ver archivos adjuntos -
-
Muchas gracias KILLERJC, ya están trabajando adecuadamente, gran aprendizaje para mi tu ayuda. :) ((:-))