Autor Tema: Problema con tsop e interrupcion por entrada externa  (Leído 2393 veces)

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

Desconectado kain589

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 324
Problema con tsop e interrupcion por entrada externa
« en: 03 de Abril de 2009, 21:14:18 »
Saludos! Estoy intentando hacer un codigo que capture los valores que llegan desde el tsop, para ello despues del bit de start empiezo a captura bit cada 600us. Lo que sucede es que tengo un problema extraño, o yo no consigo verlo y por eso pienso que es extraño. Aqui va el codigo
Código: C
  1. #include <18F2550.h>
  2. #fuses HSPLL,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL3,CPUDIV1,VREGEN
  3. #use delay(clock=48000000)
  4.  
  5. #include ".\include\usb_cdc.h"
  6. //Variables
  7. //Constantes, intentar usar define
  8. //Variables 1 bit
  9. int1 fresh_sta;//Por ahora no usada
  10. //Variables 8 bit
  11. int8 byte1  = 0;//byte memorizar mando
  12. int8 byte2  = 0;//byte memorizar mando
  13. int8 byte3  = 0;//byte memorizar mando
  14. int8 byte4  = 0;//byte memorizar mando
  15. int8 byte5  = 0;//byte memorizar mando
  16. int8 contbit = 0;
  17. //Defines
  18. //#define sensor_ir  input(PIN_B0)
  19. #byte PORTB                = 0xF81
  20. #bit  sensor_ir            = PORTB.0
  21. //INTERRUPCIONES
  22.  
  23. /*Interrupcion externa0, en la bajada.
  24. */
  25. #int_EXT
  26. void EXT_isr()
  27.    {
  28.    printf(usb_cdc_putc, "\n\r Externa");//muestra estado
  29.    //Se entra al empezar al recibir trama
  30.    if(!input(PIN_B0))//Sigue a nivel bajo??
  31.       {//Se resetea timer0 y se activa interrupcion
  32.       contbit = 0;//Resetea contador bits
  33.       setup_timer_0(0);
  34.       enable_interrupts(INT_RTCC);//Activa int. timer0
  35.       disable_interrupts(INT_ext);//Desactiva int. externa
  36.       printf(usb_cdc_putc, "\n\r Bucle");//muestra estado
  37.       }
  38.    /*printf(usb_cdc_putc, "\n\r Externa");//muestra estado
  39.    contbit = 0;//Resetea contador bits
  40.    setup_timer_0(0);
  41.    enable_interrupts(INT_RTCC);//Activa int. timer0
  42.    disable_interrupts(INT_ext);//Desactiva int. externa*/
  43.    }
  44.  
  45. //Interrupcion timer0
  46. #int_RTCC
  47. void RTCC_isr(){
  48.    printf(usb_cdc_putc, "\n\r Timer");//muestra estado
  49.    //se memorizan 40 bits en 5 bytes
  50.    if(contbit<8)//De 0 a 7
  51.       {
  52.       byte1= (byte1<<1)+ sensor_ir;
  53.       }
  54.    if(contbit>7 && contbit<16)
  55.       {
  56.       byte2= (byte2<<1)+ sensor_ir;
  57.       }
  58.    if(contbit>15 && contbit<24)
  59.       {
  60.       byte3= (byte3<<1)+ sensor_ir;
  61.       }
  62.    if(contbit>23 && contbit<32)
  63.       {
  64.       byte4= (byte4<<1)+ sensor_ir;
  65.       }
  66.    if(contbit>31 && contbit<40)
  67.       {
  68.       byte5= (byte5<<1)+ sensor_ir;
  69.       }
  70.    ++contbit;
  71.    if(contbit==40)
  72.       {
  73.       contbit = 0;//Resetea contador bits
  74.       disable_interrupts(INT_RTCC);//Desactiva int. timer0
  75.       enable_interrupts(INT_ext);//Activa int. externa
  76.       printf(usb_cdc_putc, "\n\r %x",byte1);//muestra estado
  77.       printf(usb_cdc_putc, "\n\r %x",byte2);//muestra estado
  78.       printf(usb_cdc_putc, "\n\r %x",byte3);//muestra estado
  79.       printf(usb_cdc_putc, "\n\r %x",byte4);//muestra estado
  80.       printf(usb_cdc_putc, "\n\r %x",byte5);//muestra estado
  81.       }
  82. }
  83.  
  84. void main() {
  85.    //Inicia usb
  86.    delay_ms(300);
  87.    usb_cdc_init();
  88.    usb_init();
  89.    //Define flanco de bajada (Para la activacion de la interrupcion  )
  90.    ext_int_edge(INT_EXT,H_TO_L);
  91.    enable_interrupts(INT_ext);
  92.    //Configurar timer1 y activar interrupcion
  93.    SETUP_TIMER_0(RTCC_INTERNAL|RTCC_DIV_16);
  94.    
  95.    while(!usb_cdc_connected()) {}
  96.       usb_task();
  97.       if (usb_enumerated())
  98.             {//activa interrupcion externa
  99.             printf(usb_cdc_putc, "Enumerado");//muestra estado
  100.             enable_interrupts(GLOBAL);
  101.             }
  102.       while(true){}//Bucle eterno
  103. }

Uso el usb en modo cdc para "depurar". El tsop lo conecto a la entrada rb0 del pic.

El programa me entra en la interrupcion externa, y dentro de ésta compruebo que el sensor este a 0 para activar la toma de bits a traves del timer; el problema es que nunca me detecta el sensor a nivel bajo. Lo que no comprendo es si configuro la interrupcion en el flanco de bajada, por qué al comprobar el estado del pin_b0 con "if(!input(PIN_B0))" nunca me entra en el if, si al estar negado "!" debería entra ¿no? No creo que la salida del tsop cambie de valor en tan pocos us que cuando el pic la comprueba ya ha cambiado.

He probado a no hacer la comprobacion, y al conectarlo al usb se queda "colgado" el hiperterminal, no me llega ningun mensaje y se bloquea el programa de hiperterminal.

Tambien he probado a hacer una conexión con un cable a tierra y entonces si me entra en la interrupcion externa, entra en el if, activa el timer y el programa responde normalmente.

El tsop tiene su salida a 5v en ausencia de infrarrojos y conmuta a 0v al recibir infrarrojos a 38khz ¿Alguien tiene idea de que puede suceder? Muchas gracias de antemano.
Saludos desde Córdoba, españa

Desconectado cerebro

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 735
Re: Problema con tsop e interrupcion por entrada externa
« Respuesta #1 en: 03 de Abril de 2009, 21:32:43 »
 :( me pasa lo mismo y no tengo idea porque.... dentro de unos dias los voy a probar con un generador de onda y un osciloscopio..

ya lo pregunte pero sin frutos...
http://www.todopic.com.ar/foros/index.php?topic=25351.0


saludos y no te olvides de mi si le encontras el problema  :mrgreen:
LAS MALVINAS SON ARGENTINAS!

Desconectado kain589

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 324
Re: Problema con tsop e interrupcion por entrada externa
« Respuesta #2 en: 03 de Abril de 2009, 21:49:34 »
Es algo intrigante, porque hace tiempo me paso lo mismo pero lo dejé sin solucionar.

El tema es que muchas veces he usado la interrupcion para descodificar el rc5 y no he tenido problemas.

Se me ha ocurrido meter algun delay de unos 300us, por probar, sin ninguna razon "seria". Otra opcion que se me ocurré, a lo mejor mas util seria poner

Código: C
  1. while(input(pin_b0)){}//se queda mientras esté a 1
  2. if(!input(pin_b0))        //Si esta a 0,deberia estarlo pues acabamos de salir del while, la rutina a hacer
  3.   {
  4.    //rutina
  5.    }

Como decia antes, lo que mas me llama la atencion es que al usar el cable a tierra si entra. Tengo un led con una r de 10k a la salida dle tsop, y se puede ver como la salida oscila al apuntarle con los infrarrojos
Saludos desde Córdoba, españa

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18286
    • MicroPIC
Re: Problema con tsop e interrupcion por entrada externa
« Respuesta #3 en: 04 de Abril de 2009, 04:48:19 »
Prueba a quitar el printf del principio, eso consume muchos us

Desconectado kain589

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 324
Re: Problema con tsop e interrupcion por entrada externa
« Respuesta #4 en: 04 de Abril de 2009, 09:05:42 »
Gracias por la ayuda, probé a quitar el printf pero seguia sin reconocer la entrada a "0".

Al final probe:

Código: C
  1. while(input(pin_b0)){}//se queda mientras esté a 1
  2.       if(!input(pin_b0))        //Si esta a 0,deberia estarlo pues acabamos de salir del while, la rutina a hacer
  3.        {
  4.         //rutina
  5.         }

Y el programa funciona, otra cosa es que pulsando siempre la misma tecla, de forma continua o con varios pulsos cada, vez me da una lectura.

De todas formas, solo lo he podido probar una vez porque la placa se ha vuelto loca y aqui llevo media hora que no funciona y me dice error al conectar el usb... la he comprobado, remontado, cambiado el pic...y sigue sin ir, luego por la tarde mas relajado volveré a intentarlo.

Edito-> El funcionamiento erratico de la placa se debe al programa, alguna vez funciona, pero las demas me dice el mensaje de windows de un dispositivo usb ha tenido mal funcionamiento...Sin embargo, sin tocar la placa cargo un programa que simplemente genera un eco y no me da ningun problema
« Última modificación: 04 de Abril de 2009, 10:29:56 por kain589 »
Saludos desde Córdoba, españa

Desconectado MLO__

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4581
Re: Problema con tsop e interrupcion por entrada externa
« Respuesta #5 en: 04 de Abril de 2009, 10:33:50 »
Hola.

Nunca he sido muy amigo de colocar printf(); en las interrupciones. Lo que hago es habilitar un flag en la interrupcion y luego procesarla en el main. Me imagino que al compilar te salen algunos warning referentes a la deshabilitacion de alguna interrupcion cierto?

Saludos
El papel lo aguanta todo

Desconectado kain589

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 324
Re: Problema con tsop e interrupcion por entrada externa
« Respuesta #6 en: 04 de Abril de 2009, 10:45:12 »
Si sale que se desactivan en usb-cdc-puts y en usb-token-reset. Lo tendre en cuenta para hacerlo de esa forma la siguiente vez.

De todas formas no sé por qué ahora no me funciona bien la conexion y me dice que el dispositivo ha tenido un funcionamiento erroneo, no creo que sea por los printf.
Saludos desde Córdoba, españa


 

anything