# Contador de personas con pic16f84



## ISAACTELLEZ (Oct 30, 2008)

quisiera por favor ayuda con un proyecto electronico:
el circuito esta basado en un pic16f84 y su finalidad es contar interrupciones en el puerto B. el problrma es que el pic solo cuenta con registros de 8 bits, insuficientes para la aplicasion que va a tener pues deseo implementar una especie de contador de 16 bits y que esta información se visualize en un modulo lcd.

si alguien tiene una idea de como incrementar un registro de ocho bits y , cuando este desborde seguir la cuenta en otro registro.

Notra: estoy obligado a usar un 16f84


----------



## pepechip (Oct 30, 2008)

como dichos datos tendras que representarlos en un display, lo mejor es que guardes los datos en 3 registros, uno para las unidades, otro para las decenas y otro para las centenas.


----------



## ISAACTELLEZ (Oct 30, 2008)

el problema es que no se como incrementarlos cunando van desbordando


----------



## ecotronico (Oct 30, 2008)

Lo unico que te puedo decir, es que el programa tendras que compilarlo en lenguaje C.
Asi, puedes declarar un entero sin signo, por ejemplo:

unsigned int contador;

y con eso tienes automáticamente un contador de 16 bits, que significa 2^16 valores distintos, desde 0 hasta 65535. suficiente ?

bueno, el asunto es que el PIC de todas maneras trabaja con 8 bits, y es el compilador de C quien se encarga internemente del detalle de "acoplar dos registros" para construirno mas grande.

ahora, si solo debes usar lenguaje ensamblador, hay varias maneras de construir contadores.
incluso hay codigos escritos por ahi (busca en google no mas) para realizar retardos de segundos y cosas por el estilo.

respecto al display, no tengo idea como se utiliza.
aun soy novato en esto.

espero te halla podido ayudar en algo.

saludos!


----------



## Gradmaster (Oct 30, 2008)

es muy sencillo en ensamblador.

etiqueta_1     incf var_1 ;incrementa la primer variable y luego haces una comparacion

                      movf nueve,0 ; usas una constante con valor de 9 
                      subwf var_1,0  ;llevas el valor de la variable al registro 0
                      btfss status,C   ; revisa si el valor de carry es 1 si es asi el valor de la variable supero #9
                      goto etiqueta_1 ; sino a superado 9 regresa a incrementar la var_1

                      incf var_2  ; si supero 9 incrementas la variable 2 y haces otra comparacion 


con este metodo determinas la primer variable como las unidades, decenas, etc. 

espero que te sirva de lago y exito.


----------



## ISAACTELLEZ (Nov 1, 2008)

muchas gracias, ahora lo que todavia no se es como visualizar esos datos en un modulo lcd en decimal


----------



## ISAACTELLEZ (Nov 4, 2008)

de casualidad alguien conoce el modulo lcd lmg-162-stn o me pude proporcionar su hoja de datos


----------



## pepechip (Nov 4, 2008)

con 3 displays de 7 segmentos te resultaria mas facil realizarlo.


----------



## ISAACTELLEZ (Nov 4, 2008)

lo que pasa es que el programa tiene 2 contadores individuales que deberan visualizarse en el lcd, uno en cada linea y deseo contar hasta 10 000


----------



## Moyano Jonathan (Nov 4, 2008)

Decime bien detallado como queres que funcione tu proyecto para así te puedo ayudar , yo domino algo de c de ccs y te puedo ayudar con lo del contador y con lo del LCD.

Con lo de incrementar un registro de 16 bits sería más o menos así:

long int contador // Variable contador de 16 bits: 0 a 65535

while(true)
{
if(contador==10000) { // Mira si el contador llegó a 10000.
contador = 0x00; // Si es así Resetea la variable.
}
else
contador ++ // sino aumenta en 1 la variable  
}


----------



## ISAACTELLEZ (Nov 5, 2008)

el programa debe ser en ensamblador, por que es que mas domino y seria dificil aprender c en estos momentos pues el proyento tiene que quedar en unos 10 dias.
se trata de un contador de pasajeros que reconosca entre una bajada y una subida, que las cuente y uqe las visualize en el lcd que tengo(lmg-162-stn). luego mediante retardos "contar el tiempo que esta interrumpida una line del puerto b del pic si rebasa 500ms activar una alarma que lo avise.
gracias por la ayuda a gradmaster es justo lo que necesitaba.


----------



## ISAACTELLEZ (Nov 5, 2008)

Comenten por favor cualquier idea me es util


----------



## Meta (Nov 6, 2008)

Hola:

La verdad que no siempre las personas salen uno a uno. Podría contar 1 con tres personas que salgan al mismo tiempo.

Por ejemplo:
Una mujer con un bebé en un brazo y otro hijo de 6 años pegado a la madre salen las mismo tiempo. Cosas así no es muy eficaz  del todo. También hay salvajes de grupos de amigos que salen a lo bruto.


Un cordial saludo.


----------



## lanselor (Nov 6, 2008)

Si el programa es para el 16f84, para enviar a una lcd (16x2) hay una libreria que te ayuda a trabajar con ella. Permitiendote la configuración de 8 bits o de 4 (por si necesitas reducir lineas) en datos y dos bits más de control.

Si las necesitas puedo enviartelas así como un ejemplo de codigo en .ASM de como usarlas.


----------



## Meta (Nov 6, 2008)

Esa librería la encuentras aquí:

www.pic16f84a.org


----------



## ISAACTELLEZ (Nov 6, 2008)

la mayoria de las librerias estan diseñadas para el modulo lcd lm106l pero yo tengo un lmg-162-stn. esees ahora mi mayor problema. ¿alguien tiene la hoja de datos o sabe como funciona?


----------



## jimmyneutron (May 12, 2010)

Hola amigos, necesito que me ayuden con este programita, es un proyecto final y estoy un poco quedado, tengo que programar el pic16f877 simular en proteus y montarlo en la proto, el circuito es un contador de objetos opacos que pasan por una banda transportadora no importa el color, no sé cómo realizar el código para cargar en el pic. Les agradesco su ayuda.


----------



## Meta (May 12, 2010)

ISAACTELLEZ dijo:


> la mayoria de las librerias estan diseñadas para el modulo lcd lm106l pero yo tengo un lmg-162-stn. esees ahora mi mayor problema. ¿alguien tiene la hoja de datos o sabe como funciona?



Mejor consigue un HD44780 de Hitacgi y ahorras mucho tiempo y trabajo por 10 €.

Puedes usar un 16F88 que tiene *1 timer de 16 bits*, y 2 de 8 bits.


----------



## jimmyneutron (May 12, 2010)

ah gracias, pero lo que necesito es el codigo para el pic, esque yo tengo este y no me funciona bien, yo conecto un convertidor a/d no uso el micro para convertir la señal.

#include <16f877.h>
#fuses XT,NOWDT,NOPROTECT,NOLVP,PUT,BROWNOUT
#use delay(clock = 4000000)
#define use_portd_lcd TRUE
#use standard_io(B)
#use standard_io(C)
#use standard_io(D)
#byte puerto_b = 06
#include <lcd.c>

int flanco_a,tiempo,d,desborde;
long bandera,velocidad,frecuencia,angular,cutil,base,porc;

#int_ext

void conteo()
 {
   flanco_a= flanco_a + 1;
   if( flanco_a == 1)
    {
      desborde = 0;
      d = 0;
      set_timer0(0);
      delay_us(3);
      ext_int_edge(H_TO_L);
      velocidad = 0;
    }
   if( flanco_a == 2)
    {
      ext_int_edge(L_TO_H);
    }
   if ( flanco_a >= 3)
    {
      tiempo = get_timer0();
      flanco_a = 1;
      set_rtcc(0);
      ext_int_edge(H_TO_L);
      desborde = 0;
      d = 0;
    }
  }

#int_rtcc

void desbordado()
  {
    desborde = desborde + 1;
    d = desborde;
    set_timer0(0);
  }
void main()
 {
   cutil = 0;
   set_tris_c(0xFd);
   enable_interrupts(GLOBAL);                    
   enable_interrupts(INT_RTCC);                   
   enable_interrupts(INT_EXT);                    
   ext_int_edge(L_TO_H);                                                                         
   setup_counters(RTCC_INTERNAL, RTCC_DIV_256);    
   flanco_a=0;
   desborde = 0;
   set_rtcc(0);
   frecuencia = 0;
   base = 0;
   lcd_init();
   lcd_gotoxy(5,1);
   printf(lcd_putc,"0 RPM");
   setup_timer_2(T2_DIV_BY_1, 255, 1);
   setup_ccp1(CCP_PWM_PLUS_1);
   cutil = 540;
   delay_ms(10);
   set_pwm1_duty(cutil);
    do
     {
       delay_ms(6000);
       lcd_init();
       frecuencia = (3906) / (tiempo + 256*desborde);
       angular = (frecuencia*60)/(24);
       lcd_gotoxy(5,1);
       printf(lcd_putc,"%lu RMP", angular);
       if(angular > 185)
         {
           base = angular - 182;
           if(base == 0)
             {
               cutil = 540;
             }
           else
             {
               cutil = cutil - 3*base;
             }  
         }
       if(angular < 180 )
         {
           base = 182 - angular;
           if(base == 0)
             {
               cutil = 540;
             }
           else
             {
               cutil = 540 + 3*base;
             }  
         }
       set_pwm1_duty(cutil);   
     }
   while(true);
 }


----------

