Contador con PIC16F877A y display

#1
Hola a todos y de ante mano muchas gracias por sus respuestas, estoy trabajando con un pic 16f877a y ya tengo todo lo concerniente a la programación para un contador (logrado gracias a los aportes de este grandioso foro), el problemas que tengo es como hacer qUE este contador empiese a contar (valga la redundancia) mientras mantengo presionado un pulsador y cuando lo suelte deje de hacerlo. Toda la programacion esta hecha en mikroC.

GRACIAS..
 
Última edición por un moderador:
#3
hola, es un solo display y es de 9 segmentos?, si es asi mira, entre el pic y el dislpay usa un decodificador bcd a display, si el display es de anodo comun usa un 74ls47 y si es de catodo comun un 74ls48, entonces creas una rutina, yo uso pcw compiler, en c, seria algo asi;

int a; //variable

while(true)
{
if(input(pin_d0)) // en este pin estara el pushbotton, cambias el puerto a tu gusto
{
output_b(a); // esta sera la slaida, donde se conecta el decodificador
delay_ms(1000); // el tiempo a tu gusto
a++;
if(a>=10)
{
a=0;
}
}
 
#4
muchas gracias cargamsoft, danning, voy a implementar sus sugerencias. Es un contador de 0 a 9 con display de 7 segmentos
 
Última edición:
#5
Fijate, si no lo podes resolver yo te ayudo, estoy haciendo algo parecido y tambien trabajo con mikroC. Aunque lo uqe te dijo danning deberia andar tranquilo.
 
#6
me parece que hay que usar la EEPROM del pic para almacenar el nuevo numero cada vez que pulsamos el switch ( o lo mantenes apretado) asi cuando soltas el pulsador queda en ese numero y no se hace cero nuevamente , no se que opinara el resto

tienen algun ejemplo en C para usar la EEPROM ? con eso ya podriamos armar este contadorcito
 
Última edición:
#7
Amigo ilcapo, en caso de necesitar una remanencia en el dato ante un corte de suministro electrico, es logico utilizar registros en EEPROM, de lo contrario, solo se almacena en un registro volatil de la RAM.
 
#8
la verdad que tenes razon no se porque se me ocurrio lo de la eeprom!! igualmente me dieron ganas de usar la EEPROM con C jaja XD! ( siempre lo hice con assembler pero es muy tedioso) si alguien tiene un ejemplito para ver como se hace con C desde ya muchas gracias :), saludos !
 
#9
ilcapo, es mu sencillo, en mi compilador yo lo uso asi, para guardar un valor que no pase 8 bits se escribe write_eeprom(direccion, valor); por ejemplo write_eeprom(0x00,1) y para leer es read_eeprom(direccion) es decir, tu guardas un dato que quieres que permanesca aunque la alimentacion halla sido desconectada y cuando lo lees le das una variable para ello; a=read_eeprom(0x00), la variable "a" tendra el valor que esta en esa dirrecion , que con anterioridad guardamos un 1, espero que te sea util,
 
#10
Ok gracias aca va un programita facil para manejar la eeprom: grabo un numero ( de una tabla) en la eeprom y luego leo la eeprom y muestro el valor guardado por el puerto C del pic , hasta aca funciona OK , adjunto programa y simulacion en proteus

para seguir con el contador que queria el amigo jcosu quiero habilitar las resistencias de pullups del puerto B para hacer una rutina de interrupciones pero cuando coloco la instruccion port_b_pullups(TRUE); nunca pasan a estado logico 1 los pines del puerto B!!! , lo pueden ver a esto en la simulacion en proteus que adjunto, no se porque no se habilitan los pullups! que raro ! en otros programas con esa instruccion se habilitaban ! a ver si alguien ve el error que yo debo estar con sueño ja XD!

saludos!
 

Adjuntos

#13
ya solucione el problema tenia desmarcado tools -> Real time annotation

continuando con el contador de 0 a 9 ahora me salta un nuevo problema! a lo mejor estoy configurando mal las interrupciones por RB4 a RB7 ?? coloco un pulsador en RB4

les paso el programa y simulacion en proteus
 

Adjuntos

#14
Camaradas.

Necesito un poco de ayuda. Quiero programar un contador con PIC16F877A.

Este es mi código, y me aparece un error.

"Undeclared identifier 'unidades'"
"Undeclared identifier 'decenas'"

¿Podrían ayudarme? De antemano, muchas gracias.

Código:
short numero[ ] = { 0x3F, 0x06, 0x1B, 0x4F, 0x66, 0x6D, 0x5E, 0x07, 0x7F, 0x67 };



void main ()                       //Programa principal

{
     TRISB=0;                         //Configuración de puertos
     TRISC=0;
     unidades = decenas= 0;           //Inicialización de variables


while(1)

{                          //Programa de usuario
PORTB=numero [decenas];
PORTD.F0=1;                           //Habilita display de decenas
delay_ms(10);
PORTD.F0= 0;
PORTB =numero [unidades];             //Envía unidades
PORTD.F1=1;                           //Habilita display de decenas
delay_ms(10);
PORTD.F1=0;

PORTD.F2=1;                           //Habilita display de centenas
delay_ms(10);
PORTD.F2=0;

PORTD.F3=1;                           //Habilita display de unidades de mil
delay_ms(10);
PORTD.F3=0;

unidades++;                           //Incrementa unidades
if (unidades>'9')
{
   unidades='0';                      //Reinicia unidades
   decenas++;                         //Incrementa decenas
   if(decenas>'9')
   {
    decenas='0';  //Reinicia decenas
         }

       }
   }
}
 
Última edición por un moderador:
#15
falta declarar las variables 'unidades' y 'decenas'... se hace como la variable número pero sin [] y del tipo correcto byte o char... ver help de mikroc.
 
Arriba