TODOPIC

Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: hectdiaf en 01 de Diciembre de 2010, 16:52:51

Título: sensores SRF05 y servomotores
Publicado por: hectdiaf en 01 de Diciembre de 2010, 16:52:51
Muy buenas tarde

me encuentro un poco estancado con una aplicion que estoy desarrollando.

bueno el problema radica en que tengo dos rutinas en mi programa una para leer distancias con los SRF05 y otra para mover dos servos con los datos obtenidos y calculados por los sensores ultrasonido, estas dos rutinas me funcionan pero si las coloco a las dos en un solo programa genreran conflicto no funciona ninguna.

para los sensores SFR05 manipulo el timer  , para los servo utilizo el timer2, tambien utilizo una interrupcion serial no he podio encontrar el error y lo unico que se me ocurre es que los timer son los que generan  el problema me gustaria ver algunas opiniones y sugerencias para que estas dos subrutinas funcionen en un solo codigo.

gracias

RUTINA PARA SRF05

Código: CSS
  1. void sensor2()
  2. void sensor1()
  3. {
  4.    output_high(pin_b6);
  5.    //bit_set(PORTB,6);                    
  6.    delay_us(20);                            
  7.    //bit_clear(portb,6);                    
  8.    output_low(pin_b6);
  9.    DO
  10.    {                                                
  11.    }WHILE(bit_test(portb,0)==0);      
  12.    set_timer1(0);                            
  13.    DO
  14.    {
  15.    }WHILE(bit_test(portb,0)==1);
  16.    Tpulso=get_timer1();
  17.    med1=Tpulso/58;
  18.    IF(med1<=2.0) { med11=10;}
  19.    else if(med1>=20.0) {med11=-10;}
  20.    ELSE {med11=((-1.11*(med1))+12.22);}
  21. }
  22. void sensor2()
  23. {  
  24.    output_high(pin_b7);
  25.    //bit_set(PORTB,7);
  26.    delay_us(20);
  27.    //bit_clear(portb,7);
  28.    output_low(pin_b7);
  29.    DO
  30.    {
  31.    }WHILE(bit_test(portb,1)==0);
  32.    set_timer1(0);  
  33.    DO
  34.    {
  35.    }WHILE(bit_test(portb,1)==1);
  36.    Tpulso=get_timer1();
  37.    med2=Tpulso/58;
  38.    IF(med2<=2.0) { med22=10;}
  39.    else IF(med2>=20.0)  { med22=-10;}
  40.    ELSE {med22=((-1.11*(med2))+12.22);}
  41. }

RUTINA PARA LOS SERVOS

Código: C
  1. void motores()
  2. {
  3.    if((motor1>=0)&&(motor1<0.2))   motor1=0.2;//minimo valor
  4.     if((motor1<0)&&(motor1>-0.2))   motor1=-0.2;//mínimo valor
  5.    temp=36.48*motor1+366;//máximo hasta
  6.    valor1=temp;
  7.    set_pwm1_duty(valor1);         //a Duty de PWM
  8.  
  9.    if((motor2>=0)&&(motor2<0.2))   motor2=0.2;
  10.     if((motor2<0)&&(motor2>-0.2))   motor2=-0.2;
  11.    
  12.    temp=36.48*motor2+366;
  13.    valor2=temp;
  14.    set_pwm2_duty(valor2);
  15. }

MAIN

Código: CSS
  1. void main()
  2. {
  3.  set_tris_b(0x03);
  4.  lcd_init();
  5.  enable_interrupts(int_rda);
  6.  enable_interrupts(global);
  7.  setup_timer_1(T1_INTERNAL| T1_DIV_BY_1);
  8.  setup_timer_2(T2_DIV_BY_16,255,1);
  9.  setup_ccp1(CCP_PWM);      
  10.  setup_ccp2(CCP_PWM);
  11.  
  12.    set_pwm1_duty(0);
  13.    set_pwm2_duty(0);
  14.  i=0;
  15.    while(true)
  16.    {
  17.    m=m+1;
  18.    rx_asm();
  19.       if(ini_f==10000 && fin_f==-10000)
  20.       {
  21.       bit_32a=make32(dat[4],dat[5],dat[6],dat[7]); //el arreglo de cuatro bytes
  22.       bit_32b=make32(dat[8],dat[9],dat[10],dat[11]); //lo paso a entero de 32bits
  23.       motor1=f_IEEEtoPIC(bit_32a);
  24.       motor2=f_IEEEtoPIC(bit_32b);
  25.       printf(lcd_putc "\f %f %f "motor1,motor2);
  26.       delay_ms(500);
  27.       }
  28.    srf_1=f_PICtoIEEE(med11);
  29.    srf_2=f_PICtoIEEE(med22);
  30.    printf(lcd_putc "\f %f \n %f  %u "med11,med22,m);
  31.    send_asm();
  32.    delay_ms(500);
  33.    motores();
  34.    sensor1();//sensor1 es el que esta conectado a PB0, se activa con PB6
  35.    sensor2();//sensor2 es el que esta conectado a PB1, se activa con PB7
  36.    }
  37. }
Título: Re: sensores SRF05 y servomotores
Publicado por: jeremylf en 02 de Diciembre de 2010, 18:53:30
Has usado prioridades? Y... Que PIC usas?

Título: Re: sensores SRF05 y servomotores
Publicado por: hectdiaf en 07 de Diciembre de 2010, 22:26:39
el micro es pic16f877A y que interrupcion deberia tener prioridad frente a las otras
Título: Re: sensores SRF05 y servomotores
Publicado por: Nocturno en 08 de Diciembre de 2010, 03:17:20
Veo que activas las interrupciones pero luego en el código no las veo asignadas.
Tampoco veo la parte de inicialización del micro, imprescindible para saber a qué velocidad oscila.
Si puedes pega el código entero para que no queden dudas y podamos echarte una mano.