Autor Tema: Recibir Señal IR con PIC / Receptor Infrarrojo (SOLUCIONADO)  (Leído 18859 veces)

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

Desconectado alesgare

  • PIC10
  • *
  • Mensajes: 11
Recibir Señal IR con PIC / Receptor Infrarrojo (SOLUCIONADO)
« en: 03 de Junio de 2008, 01:40:27 »
Hola,

Les cuento que estoy haciendo un contador de personas, de tal forma que si pasan por el umbral de la puerta, a travez de un sistema emisor-receptor infrarrojo, la información llega a un PIC y este maneja los datos.

Bueno, el problema es que no se me ocurre cual es la mejor manera de decifrar el pulso por flanco que manda la señal del receptor hacia el PIC. Se supone que el receptor está recibiendo permanentemente la señal infrarroja modulada y al haber una interrupción el receptor genera un "uno" lógico que dura microsegundos y que este uno lógico necesita ser rescatado por el PIC para luego hacer mi programa, pero no sé como trabajar con este tipo de señal que llega y se va tan rápido....

¿Cómo recibo la señal desde el PIC, que método se utiliza o quién me da una idea del código en C?
(escuché por ahi que la salida CCP estaría involucrada...)

Les agradecería sus respuestas,

Saludos!
« Última modificación: 14 de Junio de 2008, 12:00:37 por alesgare »

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18271
    • MicroPIC
Re: Recibir Señal IR con PIC / Receptor Infrarrojo
« Respuesta #1 en: 03 de Junio de 2008, 01:51:09 »
Lo más fácil es meter esta señal por una interrupción externa y procesarla ahí. Puedes encontrar muchos ejemplos en C que usan la interrupción externa, en la carpeta de ejemplos del compilador, y en el subforo de C.
Muevo este hilo allí porque creo que estará mejor.

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
Re: Recibir Señal IR con PIC / Receptor Infrarrojo
« Respuesta #2 en: 03 de Junio de 2008, 10:54:33 »
Hola

Puedes poner un led emisor infrarrojo que emita luz a una frecuencia de 38kHz, es decir, apagándose y encendiéndose. Esto lo puedes hacer con el tmr0 o con el pwm de los pic que lo tengan.

Luego, para lograr la detección puedes usar un TSOP1738, el cual detecta luz infrarroja que oscile a 38kHz y cuando lo hace pone a 5V su terminal de salida. Esto de los 38kHz sirve mucho para despreciar la luz solar o la luz de una habitación.

Para la detección del flanco alto y bajo puedes seguir el consejo de Nocturno y usar la interrupción externa en RB0 de un pic.

Desconectado alesgare

  • PIC10
  • *
  • Mensajes: 11
Re: Recibir Señal IR con PIC / Receptor Infrarrojo
« Respuesta #3 en: 06 de Junio de 2008, 21:06:38 »
Hola!,

Primero, muchas gracias por sus respuestas, me sirvieron mucho para saber por donde empezar.

Ok, ahora que tengo mas avanzado el proyecto me surgieron unas dudas con la programación y aún no puedo hacer una interrupción en C (CCS) para trabajar con la señal proveniente del sensor.

Puse la salida del sensor en el osciloscopio y resultó lo siguiente:



Me resultó perfecto!... el receptor está siempre en 5V y cuando pasa alguien produce ese pulso de 0V.

Bueno, ahora el problema es que no entiendo mucho CCS y quiero hacer que cuando pase una persona, es decir, que cuando se reciba ese pulso, el PIC pase a un estado y cuente... solo eso.

Tengo un PIC 18F2550 y experimenté con el siguiente código:

Código: [Seleccionar]


#include <18F2550.h>
#device adc=8

#FUSES WDT                  //No Watch Dog Timer
#FUSES WDT128                //Watch Dog Timer uses 1:128 Postscale
#FUSES INTRC_IO              //Internal RC Osc, no CLKOUT
#FUSES NOPROTECT              //Code not protected from reading
#FUSES BROWNOUT              //Reset when brownout detected
#FUSES BORV20                //Brownout reset at 2.0V
#FUSES PUT                  //Power Up Timer
#FUSES NOCPD                  //No EE protection
#FUSES STVREN                //Stack full/underflow will cause reset
#FUSES NODEBUG                //No Debug mode for ICD
#FUSES NOLVP                  //No Low Voltage Programming on B3(PIC16) or B5(PIC18)
#FUSES NOWRT                  //Program memory not write protected
#FUSES NOWRTD                //Data EEPROM not write protected
#FUSES IESO                  //Internal External Switch Over mode enabled
#FUSES FCMEN                  //Fail-safe clock monitor enabled
#FUSES NOWRTC                //configuration not registers write protected
#FUSES NOWRTB                //Boot block not write protected
#FUSES NOEBTR                //Memory not protected from table reads
#FUSES NOEBTRB                //Boot block not protected from table reads
#FUSES NOCPB                  //No Boot Block code protection
#FUSES NOMCLR                 //Master Clear pin disabled
#FUSES LPT1OSC                //Timer1 configured for low-power operation
#FUSES NOXINST                //Extended set extension and Indexed Addressing mode disabled (Legacy mode)
#FUSES PLL1                  //No PLL PreScaler

#use delay(clock=8000000, RESTART_WDT)

#fuses XT,NOWDT,NOPROTECT,PUT,NOLVP      //ordenes para el programador
#fuses INTRC                     //oscilador interno
//#use delay (clock=4000000)            //Fosc=4Mhz
#use standard_io(a)
#use fast_io(b)
                  //declaracion del puerto b

///DECLARACION DE FUNCIONES GLOBALES
#int_ext
void interrupcion(void){
disable_interrupts(int_ext);
disable_interrupts(global);
output_high(PIN_A0);
enable_interrupts(int_ext);
enable_interrupts(global);
}     //funcion que ejecuta la iluminacion del porta dada la interrupcion

//int a;



///PROGRAMA
void main(void)
{
   #byte TRISB = 0xFF;      //portb entrada m
   #byte TRISA = 0x00;
   enable_interrupts(int_ext);      //activar interrupcion rb4:7
   enable_interrupts(global);      //activar interrupciones
   while(1){
}
}


//while(1)           
//{
//if (a==1){
    //  output_high(PIN_B0);
      //  delay_ms(200);   

// output_low(PIN_B0);
  //      delay_ms(200);

//}

//};

//}




Realmente ahi está lo que he tratado de hacer.

Creo que el código esta un poco desordenado, pero primero intenté hacerlo por interrupción (INT_RB o INT_EXT) y luego me aconsejaron hacerlo sin interrupciones, solo usando el while y chequeando variables.... Que opinan ustedes??? , Alguna ayudita???

Saludos!!


PS: La inicialización la copié del receptor DMX de Nocturno, pero creo que igual funciona para el objetivo de mi proyecto...
« Última modificación: 06 de Junio de 2008, 21:16:22 por alesgare »

Desconectado Gonzalo_BlackHawk

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 519
Re: Recibir Señal IR con PIC / Receptor Infrarrojo
« Respuesta #4 en: 06 de Junio de 2008, 23:48:31 »
Hola alesgare, yo te recomiendo utilizar la interrupción externa, noto que tu código esta bastante desordenado y es poco óptimo, pero no te desanimes, nos ha pasado a todos en nuestros principios. Puedes implementar tu código como sigue:

Código: C
  1. // DIRECTIVAS DE PREPROCESADOR.
  2. #include <18F2550.h>                                            // Archivo de cabecera para el dispositivo PIC.
  3. #fuses HSPLL                                                        // Cristal de alta velocidad (>4 MHz) con PLL habilitado.
  4. #fuses USBDIV                                                           // El reloj del USB proviene del PLL de 96 MHz dividido por 2.
  5. #fuses PLL5                                                                     // El oscilador a cristal es de 20 Mhz. Se divide por 5 la frecuencia de entrada al PLL porque este solo admite 4 Mhz en la misma.
  6. #fuses CPUDIV1                                                          // El reloj del sistema posee una frecuencia de la mitad del PLL (96 Mhz / 2 = 48 Mhz).
  7. #fuses NOFCMEN                                                          // Desactiva el monitor a prueba de fallos del reloj.
  8. #fuses NOIESO                                                           // Deshabilita el encendido del PIC con dos osciladores. Este modo solo se usa cuando se requieren tiempos de encendido cortos.
  9. #fuses BROWNOUT,BORV46                                  // Reset Brownout habilitado por hardware. El reset Brownout se activa cuando la tensión de alimentación desciende por debajo de los 4.6V.
  10. #fuses VREGEN                                                           // Regulador de voltaje interno de 3.3 V para USB activado.
  11. #fuses PUT                                                                      // Retardo de encendido activado.                                                                              
  12. #fuses NOWDT                                                        // WDT desactivado.        
  13. #fuses CCP2C1                                                           // Entrada y salida de CCP2 multiplexada al pin RC1.
  14. #fuses NOPBADEN                                                 // Pines del puerto B configurados como I/O digitales luego de un reset.
  15. #fuses NOLPT1OSC                                                        // Timer1 configurado para operacion de alto consumo. Mas estabilidad frente a las interferencias.
  16. #fuses MCLR                                                                     // Pin de MCLR activado, RE3 deshabilitado.
  17. #fuses NOSTVREN                                            // El subdesbordamiento o desbordamiento del Stack no causa un reset.                      
  18. #fuses NOXINST                                                          // Set de instrucciones extendido y direccionamiento indexado deshabilitado.
  19. #fuses NOLVP                                                            // Programación por bajo voltaje deshabilitada.
  20. #fuses NODEBUG                                                          // Modo de depuración para ICD deshabilitado.
  21. #fuses NOPROTECT,NOCPD,NOCPB                    // Codigo, codigo de EEPROM y bloque de Booteo no protegido contra lectura.
  22. #fuses NOWRTD,NOWRTB,NOWRTC,NOWRT       // Memoria de programa, registros de configuración, bloque de Booteo y EEPROM de datos no protegida contra escritura.                                    
  23. #fuses NOEBTRB,NOEBTR                                   // Memoria y bloque de Booteo no protegido contra lecturas de tabla en otros bloques.
  24. #use delay(clock=48000000)                              // Frecuencia del reloj del sistema = 48 Mhz. No es la misma frecuencia que la del cristal.                                            
  25.  
  26. // VARIABLES GLOBALES.
  27. int Cuenta = 0;
  28. short Flag_LED = 0;
  29.  
  30. // PROCEDIMIENTO DE INTERRUPCIÓN POR FLANCO DESCENDENTE EN EL PIN B0.
  31. #int_ext
  32. void ISR_ext()
  33. {
  34. Cuenta++;
  35. Flag_LED = 1;
  36. }    
  37.  
  38. // PROCEDIMIENTO PRINCIPAL.
  39. void main()
  40. {
  41.     enable_interrupts(int_ext);       // Habilita la interrupción externa.
  42.     enable_interrupts(global);        // Habilita en forma global las interrupciones.
  43.     ext_int_edge (0, H_TO_L);       // La interrupción se produce cuando se produce un flanco descendente.
  44.      
  45.     while(1) {
  46.          if (Flag_LED){
  47.              output_high(PIN_A0);     // Coloca en 1 la salida AN0 por medio segundo cuando pasa alguien y luego la vuelve a 0.
  48.              delay_ms(500);
  49.              output_low(PIN_A0);
  50.              Flag_LED = 0;
  51.          }
  52.     }
  53. }


Esta creo que es la forma más compacta de detectar cuando una persona pasa, el programa enciende un LED conectado en el pin RA0 y además lleva la cuenta de cuantas personas pasaron y las almacena en la variable Cuenta. Puede que existan errores de sintaxis, he escrito el código aqui mismo en el foro y no he probado de compilarlo, hazlo tú y luego nos cuentas.

Un saludo desde Argentina.
"Siempre piensa si el jugo vale la exprimida..."

"La muerte esta tan segura de vencer que nos da toda una vida de ventaja."

Desconectado alesgare

  • PIC10
  • *
  • Mensajes: 11
Re: Recibir Señal IR con PIC / Receptor Infrarrojo
« Respuesta #5 en: 07 de Junio de 2008, 02:45:07 »
Hola,

Primero, gracias Gonzalo por ayudarme en esto.

He probado el código que me enviaste y no me funcionó. Sirvió para clarificarme un poco las cosas, pero según parece faltaron un par de detalles, pues cambié la rutina de inicialización (#fuses) y el programa corrió. Para probar que efectivamente el programa funciona le agregué un "do" al main que haga parpadear un LED en RB1. Además incluí un LED en RB0 para ver cuando éste esta prendido o apagado mediante un cable que conecto y desconecto (simulando la señal del sensor)... En el montaje se puede ver más claro:



De manera que pongo un LED también en RA0 para ver si efectivamente el programa entra a la interrupción (o mejor aún, al if del while...), pero esto no sucede, es decir, de alguna forma el programa no está provocando la interrupción ya que no se incrementa el Flag_Led y por lo tanto no entra al if...

El código modificado lo incluyo enseguida:

Código: [Seleccionar]
        // DIRECTIVAS DE PREPROCESADOR.
    #include <18F2550.h>
#device adc=8

#FUSES WDT                  //No Watch Dog Timer
#FUSES WDT128                //Watch Dog Timer uses 1:128 Postscale
#FUSES INTRC_IO              //Internal RC Osc, no CLKOUT
#FUSES NOPROTECT              //Code not protected from reading
#FUSES BROWNOUT              //Reset when brownout detected
#FUSES BORV20                //Brownout reset at 2.0V
#FUSES PUT                  //Power Up Timer
#FUSES NOCPD                  //No EE protection
#FUSES STVREN                //Stack full/underflow will cause reset
#FUSES NODEBUG                //No Debug mode for ICD
#FUSES NOLVP                  //No Low Voltage Programming on B3(PIC16) or B5(PIC18)
#FUSES NOWRT                  //Program memory not write protected
#FUSES NOWRTD                //Data EEPROM not write protected
#FUSES IESO                  //Internal External Switch Over mode enabled
#FUSES FCMEN                  //Fail-safe clock monitor enabled
#FUSES PBADEN                //PORTB pins are configured as analog input channels on RESET
#FUSES NOWRTC                //configuration not registers write protected
#FUSES NOWRTB                //Boot block not write protected
#FUSES NOEBTR                //Memory not protected from table reads
#FUSES NOEBTRB                //Boot block not protected from table reads
#FUSES NOCPB                  //No Boot Block code protection
#FUSES NOMCLR                 //Master Clear pin disabled
#FUSES LPT1OSC                //Timer1 configured for low-power operation
#FUSES NOXINST                //Extended set extension and Indexed Addressing mode disabled (Legacy mode)
#FUSES PLL1                  //No PLL PreScaler

#use delay(clock=8000000, RESTART_WDT)


 

#byte       PORTA=      0xF80
#byte       PORTB=      0xF81
 
     // VARIABLES GLOBALES.
     int Cuenta = 0;
     short Flag_LED = 0;
     
     // PROCEDIMIENTO DE INTERRUPCIÓN POR FLANCO DESCENDENTE EN EL PIN B0.
     #int_ext
     void ISR_ext()
     {
disable_interrupts(int_ext);       // Habilita la interrupción externa.
         disable_interrupts(global);
                 
Cuenta++;
Flag_LED = 1;

         enable_interrupts(int_ext);       // Habilita la interrupción externa.
         enable_interrupts(global);        // Habilita en forma global las interrupciones.
     }   

     // PROCEDIMIENTO PRINCIPAL.
     void main()
     {
        enable_interrupts(int_ext);       // Habilita la interrupción externa.
        enable_interrupts(global);        // Habilita en forma global las interrupciones.
        ext_int_edge (0, H_TO_L);       // La interrupción se produce cuando se produce un flanco descendente.
       
set_tris_a(0x00);
set_tris_b(0xFF);

do{   
      output_low(PIN_A1);          //led off
      delay_ms(500);           
      output_high(PIN_A1);        //led on
      delay_ms(500);



        }while(1); {
         
if (Flag_LED){
           output_high(PIN_A0);     // Coloca en 1 la salida AN0 por medio segundo cuando pasa alguien y luego la vuelve a 0.
           delay_ms(500);
           output_low(PIN_A0);
           Flag_LED = 0;
  }
          }
    }

Entonces acá van las preguntas:

1.- Como he dicho antes, tuve que cambiar la rutina de inicialización, pues no funcionaba la que me mandaste, entonces, ¿es realmente importante esa rutina? o la modifico de todas formas?

2.- En el código también agregué ciertas cosas que pensé que faltaban como desactivar las interrupciones cuando entra a la interrupción y activarlas nuevamente cuando sale. También agregué los set_tris_x que no estaban antes y #BYTE PORTX=XXXX que también faltaban... he hecho bien???

3.- Y lo más importante: porqué aún no funciona la interrupción?? De que otra manera puede funcionar??  Que falta!?


Saludos!!
« Última modificación: 07 de Junio de 2008, 02:51:14 por alesgare »

Desconectado pocher

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 2568
Re: Recibir Señal IR con PIC / Receptor Infrarrojo
« Respuesta #6 en: 07 de Junio de 2008, 06:50:27 »
No he leido los primeros mensajes, solo he visto el último programa, tengo prisa.

No te activa el LED de la interrupción porque tienes que meter toda su programación dentro del while, no fuera como lo tienes ahora.

Puedes quitar lo de desactivar-activar las interrupciones al entrar dentro de la rutina de interrupción, CCS te lo hace automáticamente.

Un saludo

Desconectado Gonzalo_BlackHawk

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 519
Re: Recibir Señal IR con PIC / Receptor Infrarrojo
« Respuesta #7 en: 07 de Junio de 2008, 10:21:25 »
Hola alesgare, ahora un poco más tranquilo, vamos a revisar tus preguntas:

Citar
1.- Como he dicho antes, tuve que cambiar la rutina de inicialización, pues no funcionaba la que me mandaste, entonces, ¿es realmente importante esa rutina? o la modifico de todas formas?

Obviamente las directivas de preprocesador son fundamentales (lo que tu llamas rutina de inicialización en realidad no es una rutina en si, sino la configuración del PIC que se realiza cuando se graba el micro) y de ello dependen que el programa ande o no. Yo extraje el segmento de preprocesadores de un programa que tenia, porque estaba realmente apurado y no lo revise, el programa inclusive estaba configurado para una transmisión USB asi que no necesariamente la configuración que puse es la óptima para tu programa. Ya más adelante nos dedicaremos a eso.

Citar
2.- En el código también agregué ciertas cosas que pensé que faltaban como desactivar las interrupciones cuando entra a la interrupción y activarlas nuevamente cuando sale. También agregué los set_tris_x que no estaban antes y #BYTE PORTX=XXXX que también faltaban... he hecho bien???

Tal como te lo ha dicho el compañero Pocher, CCS desactiva la interrupción automáticamente al entrar en ella y la activa nuevamente al salir de ella, por lo que no necesitas hacerlo manualmente. Los #byte para definir los registros de los puertos no son realmente necesarios, pero de todas formas no influyen en el funcionamiento o no del programa. Con respecto a configurar los registros TRIS, como no has definido ninguna configuración específica de entrada y salida con #USE XXX_IO el programa utiliza la predeterminada o standard_io. En este modo el compilador se encarga de definir las direcciones en los puertos automáticamente cada vez que van a ser utilizados, por lo que el set_tris es seguramente una redundancia. Como no me quedo tranquilo y no me gusta el método standard_io (pero es el más facil de implementar) utilizaremos a partir de ahora el metodo fast_io. Ya lo veremos mas adelante.

Citar
3.- Y lo más importante: porqué aún no funciona la interrupción?? De que otra manera puede funcionar??  Que falta!?

La interrupción tal como fue definida deberia andar, revisa el datasheet del 18F2550 pero estoy casi seguro que la interrupción externa 0 corresponde al pin RB0. Si RB0 es definido como entrada y si se habilita la interrupción por software, no hay motivo por el cual no funcione.

Vamos con el código, veo que otra vez hay un desparramo de rutinas y configuraciones sin sentido, pero nada que no se pueda arreglar, de todas formas prueba el código que te doy y dime si no he metido la pata :mrgreen:. Vamos a repasar un poco el código que has posteado:

Código: [Seleccionar]
#device adc=8
No estas utilizando el ADC asi que esta configuración sobra. Quitemos todo lo innecesario para probar lo básico y luego podremos ir profundizando, que te parece?

Código: [Seleccionar]
#FUSES WDT                  //No Watch Dog Timer
En realidad el fuse WDT si activa el Watchdog y aunque lo reinicias en durante cada delay, yo lo apagaria porque tu código no lo necesita por ahora.

El resto de los fuses esta bien, mi configuración no te andaba porque yo lo coloque para que funcione con cristal externo y además con el MCLR activado. Error mio, pues tu no tienes nada de eso en tu circuito, imposible que andase :(

Código: [Seleccionar]


      do{   
      output_low(PIN_A1);          //led off
      delay_ms(500);           
      output_high(PIN_A1);        //led on
      delay_ms(500);
        }while(1);
         
if (Flag_LED){
           output_high(PIN_A0);     // Coloca en 1 la salida AN0 por medio segundo cuando pasa alguien y luego la vuelve a 0.
           delay_ms(500);
           output_low(PIN_A0);
           Flag_LED = 0;
}
          }
    }

Seguramente la interrupción se produce pero como nunca sale del while, el código despues de él nunca se ejecuta, me extraña que el compilador no te halla tirado una advertencia de "code unreachable" porque ese segmento es inalcanzable en tiempo de ejecución. Ahora posteo el código que debería funcionar, esta vez dejo los fuses como estan:

Código: C
  1. // DIRECTIVAS DE PREPROCESADOR.
  2. #include <18F2550.h>
  3. #FUSES NOWDT                    //No Watch Dog Timer
  4. #FUSES INTRC_IO                 //Internal RC Osc, no CLKOUT
  5. #FUSES NOPROTECT                //Code not protected from reading
  6. #FUSES BROWNOUT                 //Reset when brownout detected
  7. #FUSES BORV20                   //Brownout reset at 2.0V
  8. #FUSES PUT                      //Power Up Timer
  9. #FUSES NOCPD                    //No EE protection
  10. #FUSES STVREN                   //Stack full/underflow will cause reset
  11. #FUSES NODEBUG                  //No Debug mode for ICD
  12. #FUSES NOLVP                  //No Low Voltage Programming on B3(PIC16) or B5(PIC18)
  13. #FUSES NOWRT                    //Program memory not write protected
  14. #FUSES NOWRTD                   //Data EEPROM not write protected
  15. #FUSES IESO                     //Internal External Switch Over mode enabled
  16. #FUSES FCMEN                    //Fail-safe clock monitor enabled
  17. #FUSES PBADEN                   //PORTB pins are configured as analog input channels on RESET
  18. #FUSES NOWRTC                   //configuration not registers write protected
  19. #FUSES NOWRTB                   //Boot block not write protected
  20. #FUSES NOEBTR                   //Memory not protected from table reads
  21. #FUSES NOEBTRB                  //Boot block not protected from table reads
  22. #FUSES NOCPB                    //No Boot Block code protection
  23. #FUSES NOMCLR                 //Master Clear pin disabled
  24. #FUSES LPT1OSC                  //Timer1 configured for low-power operation
  25. #FUSES NOXINST                  //Extended set extension and Indexed Addressing mode disabled (Legacy mode)
  26. #FUSES PLL1                     //No PLL PreScaler
  27. #use delay(clock = 8000000)   // Reloj interno de 8 Mhz.
  28. #use fast_io(A)               // Las direcciones de los puertos solo pueden ser configuradas mediante set_tris_x() y _
  29. #use fast_io(B)               // no se cambian cada vez que se ejecuta una operación de entrada o salida. Esto acelera la velocidad de procesamiento.  
  30.  
  31. // VARIABLES GLOBALES.
  32. int Cuenta = 0;
  33. short Flag_LED = 0;
  34.      
  35. // PROCEDIMIENTO DE INTERRUPCION POR FLANCO DESCENDENTE EN EL PIN B0.
  36. #int_ext
  37. void ISR_ext()
  38. {
  39. Cuenta++;
  40. Flag_LED = 1;
  41. }    
  42.  
  43. // PROCEDIMIENTO PRINCIPAL.
  44. void main()
  45. {
  46. enable_interrupts(int_ext);      // Habilita la interrupción externa.
  47. enable_interrupts(global);       // Habilita en forma global las interrupciones.
  48. ext_int_edge (0, H_TO_L);               // La interrupción se produce cuando se produce un flanco descendente.
  49.        
  50. set_tris_a(0b00000000);
  51. set_tris_b(0b00000001);                         // Solo RB0 es entrada.
  52.  
  53. while(1){
  54.         if (Flag_LED){
  55.                 output_high(PIN_A0);            // Coloca en 1 la salida AN0 por medio segundo cuando pasa alguien y luego la vuelve a 0.
  56.                 delay_ms(500);
  57.                 output_low(PIN_A0);
  58.                 Flag_LED = 0;
  59.         }
  60. }

Prueba el código, si no tienes el HW mal conectado deberia funcionar, si lo hace en forma correcta postea un mensaje con el titulo del tema mas (SOLUCIONADO) asi queda disponible para los demás usuarios. Esperamos tu respuesta.

Saludos.
"Siempre piensa si el jugo vale la exprimida..."

"La muerte esta tan segura de vencer que nos da toda una vida de ventaja."

Desconectado alesgare

  • PIC10
  • *
  • Mensajes: 11
Re: Recibir Señal IR con PIC / Receptor Infrarrojo
« Respuesta #8 en: 07 de Junio de 2008, 12:04:40 »
YEAAAAHHHH!!!

Funcionó perfecto!!!

Ahora puedo empezar a hacer la serie de condiciones que necesito... Te agradezco demasiado!!!

Saludos!!!

Desconectado pocher

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 2568
Re: Recibir Señal IR con PIC / Receptor Infrarrojo (SOLUCIONADO)
« Respuesta #9 en: 07 de Junio de 2008, 12:13:53 »
Ahora piensa qué haras con la variable cuenta.

Quizás sacarla por una LCD para ir visualizando el nº de personas que van pasando.

Y si las personas hacen marcha atrás y te vuelven a pasar por el sensor?

Desconectado alesgare

  • PIC10
  • *
  • Mensajes: 11
Re: Recibir Señal IR con PIC / Receptor Infrarrojo (SOLUCIONADO)
« Respuesta #10 en: 08 de Junio de 2008, 03:44:23 »
Si, lo que pasa es que la idea es poner dos pares de sensores en cada umbral, de forma que también se detecte el sentido de paso...



Los sensores ya los tengo listos en PCB, nada más queda hacer bien las condiciones y la máquina de estados...

Cuando esté listo lo publico, pero es seguro que antes de que eso pase voy a tener mas dudas :P

Saludos!

Desconectado alesgare

  • PIC10
  • *
  • Mensajes: 11
Re: Recibir Señal IR con PIC / Receptor Infrarrojo (SOLUCIONADO)
« Respuesta #11 en: 08 de Junio de 2008, 03:45:14 »
Ah, el esquema que hice en el post anterior tiene un error, los pares van invertidos uno de otro, es decir, va un receptor junto a un emisor y al frente un emisor junto a un receptor de manera que no se confundan las señales emitidas entre pares...

Cuando la persona pasa, se activa primero el par de la izquierda y luego el par de la derecha...
« Última modificación: 08 de Junio de 2008, 03:51:20 por alesgare »

Desconectado alesgare

  • PIC10
  • *
  • Mensajes: 11
Re: Recibir Señal IR con PIC / Receptor Infrarrojo (SOLUCIONADO)
« Respuesta #12 en: 12 de Junio de 2008, 01:07:24 »
Tengo otra pregunta para continuar:

El problema ahora es que debo manejar 4 entradas, ya que son 2 umbrales y cada umbral posee 2 sensores, como lo dibujé en la imagen anterior.

En este momento el programa está utilizando la interrupción externa que utiliza RB0... Como puedo hacer que el PIC responda a las 4 interrupciones que se van a generar por los sensores simultaneamente??

Alguna opinion?, debo cambiar el tipo de interrupcion?, cuales son las opciones que tengo?

Saludos!!

Desconectado pocher

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 2568
Re: Recibir Señal IR con PIC / Receptor Infrarrojo (Última Duda!)
« Respuesta #13 en: 12 de Junio de 2008, 01:44:15 »
No sé como tienes el programa ahora, pero para detectar la entrada-salida de personas por las 2 puertas podría ser así:

A1-A2 sensores de la primera puerta.

A3-A4 sensores de la segunda puerta.

Si A1(A3) se activa antes que A2(A4) entonces es entrada (cnt++)

Si A2(A4) se activa antes que A1(A3) entonces es salida (cnt--)

¡Sin interrupciones!

Desconectado pedro198912

  • PIC10
  • *
  • Mensajes: 2
Re: Recibir Señal IR con PIC / Receptor Infrarrojo
« Respuesta #14 en: 02 de Octubre de 2015, 05:03:10 »
hola
e estado viendo este post y quisiera que alguien de ustedes me facilitara el el diagrama electrónico con que esta echo este sensor IR