Autor Tema: Problema con case y sonar IR  (Leído 1339 veces)

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

Desconectado kain589

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 324
Problema con case y sonar IR
« en: 17 de Abril de 2006, 07:39:03 »
Saludos! estoy intentado hacer un de deteccion de obstaculos por IR, para ello mediante el pwm genero un tren de impulsos de 38khz y multiplexo entre el pwm1 y pwm 2 cada vez que se me desborda el timer 0, para saber si el obstaculo esta en alguno de los lados o al frente. Para esto cuando detecto un obstaculo miro que pwm esta funcionando y activo un bit, segun sea el pwm1 o pwm2, de un byte "rebote"; este byte esta formado por solo 2 bit rebI,rebD, despues cada x desbordamientos (en este caso 20) hago un case segun el valor de rebote y aqui es donde esta el problema aunque el obstaculo este en medio me entra en case1 y case2, obstaculos a un lado y a otro, pero no en case3 que seria que esta en medio. A mi no se me ocure que me puede estar dando el problema, a ver si alguien sabe que puedo estar haciendo mal o que se me escapa, gracias de antemano

Código: C
  1. #include <16f876a.h>
  2. #fuses XT,NOWDT,NOPROTECT,NOLVP,PUT,BROWNOUT
  3. #use delay(clock=4000000)
  4. #use standard_io(b)
  5. #use standard_io(c)
  6. #define sensor_ir input(PIN_B0)
  7. #bit T0IF = 0xb.2
  8.  
  9. int duty       =  12;
  10. int tempo      =  25;
  11. int contRtCC   =  0;
  12. int rebote     =  0;
  13. //int m_nuevo    =  0;
  14. int1 RTCC   = 0;//variable tipo bit
  15.  
  16. #bit rebD = rebote.0
  17. #bit rebI = rebote.1
  18.  
  19. void detecta_reb (void){
  20.      if(!sensor_ir){
  21.       if (RTCC == 0){//Esta emitiendo el derecho?
  22.          rebD = 1;
  23.       }
  24.       if (RTCC == 1){//Esta emitiendo el izquierdo?Podria ponerse como else
  25.          rebI = 1;
  26.       }
  27.       if (contRTCC >= 20){
  28.          contRtCC = 0;
  29.          switch (rebote) {//tomar decisiones, si problemas rebote&&3
  30.          case 0 : //ningun obstaculo
  31.                   //no hace nada
  32.                   //nunca entra
  33.                   break;
  34.          case 1 : //obstaculo a la derecha
  35.                   output_high(pin_b2);
  36.                   break;
  37.          case 2 : //obstaculo a la izquierda
  38.                   output_high(pin_b1);
  39.                   break;
  40.          case 3 : //obstaculo al frente
  41.                   output_high(pin_b3);
  42.                   break;
  43.          }
  44.         rebote  = 0;
  45.      }
  46.    }
  47.  }
  48.  
  49. #int_RTCC
  50. RTCC_isr(){
  51.     ++contRTCC;
  52.     if(RTCC==1){//Emito con el izquierdo
  53.       RTCC = 0;
  54.       setup_ccp1(CCP_PWM); // Activo CCP1 como PWM
  55.       setup_ccp2(CCP_OFF);// Desactivo CCP2
  56.     }
  57.     else{
  58.       RTCC = 1;//Emito con el derecho
  59.       setup_ccp1(CCP_OFF);// Desactivo CCP1
  60.       setup_ccp2(CCP_PWM); // Activo CCP2 como PWM
  61.     }
  62.   }
  63.  
  64.  
  65. void main() {
  66.    output_b(0x00);//se podra quitar
  67.  
  68.    setup_ccp1(CCP_PWM);                // Configura CCP1 como PWM
  69.  
  70.    setup_ccp2(CCP_PWM);                // Configura CCP2 como PWM
  71.  
  72.    setup_timer_2(T2_DIV_BY_1,tempo,1); // f=38KHz (t = 26us)
  73.  
  74.    set_pwm1_duty(duty);                // Determina tiempo en alto
  75.  
  76.    set_pwm2_duty(duty);                // Determina tiempo en alto
  77.  
  78.    setup_counters(RTCC_INTERNAL,RTCC_DIV_8);
  79.  
  80.    enable_interrupts(INT_RTCC);
  81.  
  82.    enable_interrupts(global);
  83.  
  84.    do{
  85.       if(!sensor_ir){
  86.          detecta_reb();
  87.       }
  88.       delay_ms(1000);
  89.       output_low(pin_b1);//borra para poner a 0 sino detecta
  90.       output_low(pin_b2);//borra para poner a 0 sino detecta
  91.       output_low(pin_b3);//borra para poner a 0 sino detecta
  92.       }while (TRUE);
  93. }

Las pruebas las estoy haciendo apuntando directamente con los led IR, por lo que no debe ser problema de la reflexion, ademas como entra en un lado y en otro, creo que no debe ser problema del hardware
Saludos desde Córdoba, españa

Desconectado kain589

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 324
Re: Problema con case y sonar IR
« Respuesta #1 en: 19 de Abril de 2006, 14:37:53 »
He cambiado el case por if con todos los casos posibles y en lugar de usar 2 bits de una variable he usado dos variables de un bit  pero sigue dando el mismo error; asi que supongo que debe ser problema del planteamiento logico
« Última modificación: 19 de Abril de 2006, 15:14:05 por kain589 »
Saludos desde Córdoba, españa