Autor Tema: Conteo de personas  (Leído 1083 veces)

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

Desconectado jorditribo

  • PIC10
  • *
  • Mensajes: 3
Conteo de personas
« en: 25 de Diciembre de 2012, 16:15:23 »
Estoy haciendo una aplicacion de conteo de personas, la idea es que cuando entre una persona la detecte primero un sensor IR y dps un PIR y cuando salga primero una barrera PIR y dps un IR. En fin el programa es medio complicado no se si hay una forma mas facil de hacerlo. Inicio el timer1 que cada 524ms incrementa una variable cnt si esta es mayor a 4 (2 segundos y pico) se trata de una nueva persona, esto se verifica al detectarse una interupcion por cambio de estado logico del puerto donde esta el IR, se espera 2 segundos y se verifica si se a activado el PIR (es decir la persona siguio caminando y entro al cuarto). La idea es que cuando se detecte el segundo sensor genere otra interrupcion y salte modificando una variable y que luego regrese a la espera esa de 2 segundos y al terminarla verifique si se a activado el segundo sensor.

Cuando la persona pase por el segundo sensor solo se modifica la variable y nada mas ya que el contador menor que 4 indica que se trata de la segunda deteccion..

En fin es enroscada la idea pero no se si se puede hacer de una forma mas facil y que resulte eficiente. Obviamente que no me funciona el programa ya que debi haber cometido varios errores. Espero que me puedan ayudar. Desde ya gracias..

Código: [Seleccionar]


#include <16F628A.h>

#FUSES NOWDT                  //No Watch Dog Timer
#FUSES INTRC                  //Internal RC Osc
#FUSES NOPUT                  //No Power Up Timer
#FUSES NOPROTECT              //Code not protected from reading
#FUSES BROWNOUT              //Reset when brownout detected
#FUSES MCLR                //Master Clear pin used for I/O
#FUSES NOLVP                  //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOCPD                  //No EE protection
#FUSES RESERVED              //Used to set the reserved FUSE bits

#use delay(clock=4000000)
#define LED   PIN_B0
#define RELE   PIN_B1
#define SALIDA   PIN_B2
#define ENTRADA   PIN_B3
#define IR   PIN_B4
#define PIR   PIN_B5


int deteccionPIR = 0;
int deteccionIR = 0;
int cantPersonas = 1;
int cnt = 0;

void  RB_isr(void)
{
if (input(IR)) {
     deteccionIR = 1;
     if (cnt >= 4){
        set_timer1(0);
        cnt = 0;
        enable_interrupts(INT_TIMER1);
        delay_ms(1900);
        if (deteccionPIR) {
           cantPersonas++;
           deteccionPIR = 0;
           }
       }
}
 
  if (input(PIR)) {
      deteccionPIR = 1;
      if (cnt >= 4) {
         set_timer1(0);
         cnt = 0;
         enable_interrupts(GLOBAL);
         delay_ms(1900);
         if (deteccionIR) {
            cantPersonas--;
            deteccionIR = 0;
         }
      }
  }
}

#int_TIMER1
void  TIMER1_isr(void)
{
   cnt++;   
   set_timer1(0);
}

void main()
{
   set_tris_a(0b00000000);
   set_tris_b(0b01110000);
   port_b_pullups(TRUE);
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
   setup_timer_1(T1_INTERNAL|T1_DIV_BY_8);
   setup_timer_2(T2_DISABLED,0,1);
   setup_comparator(NC_NC_NC_NC);
   setup_vref(FALSE);
   enable_interrupts(INT_RB);
   enable_interrupts(INT_TIMER1);
   enable_interrupts(GLOBAL);
   
   set_timer1(0);
   output_high(LED); 
   
   //aca iria la parte de mostrar la cant de personas con un loop

}


Espero que me puedan indicar que errores cometi en cuanto a a asimilar cosas sobre el funcionamiento de las interrupciones que obviamente no son correctas.. Desde ya gracias y saludos a todos