TODOPIC

Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: c4_esp_VR en 29 de Julio de 2006, 06:12:26

Título: Controlar servo con TIMER1 !!!IM---PRESIONANTE!!!
Publicado por: c4_esp_VR en 29 de Julio de 2006, 06:12:26
Hola a todos:

He conseguido realizar un pulso con un periodo de 20ms y con un ton de 1.5ms con lo que con las caracteristicas de los servos, éste se debería de situar en el centro, pero no hace nada. El pulso lo he mirado con un osciloscopio para pc por la targeta de sonido y es perfecto pero el servo no funciona con lo que compre un servo (futaba S3003) nuevo y tampoco funciona en cambio si uso delay_ms() si que funcionan, haber si alguien me puede decir que le pasa a este sencillo programa para que no funcione el servo.

Gracias a todos chavales sois unos CRACKS  :-/ :-/ :-/ :-/ :-/ :-/ :-/ :-/ :-/ :-/ :-/

#include <18F2550.h>
#fuses HSPLL,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL3,CPUDIV1,VREGEN
#use delay(clock=12000000)
#include <stdlib.h>

#define SERVO   PIN_A2

#define LEDV    PIN_B6
#define LEDR    PIN_B7

#define LED_ON  output_high
#define LED_OFF output_low

#priority TIMER1 //Damos prioridad a las interrupciones del contador

int1 flagSERVO1 = 0;
int contador=0;


#int_timer1
void isr_timer1(void)
{   
      flagRTCC=1;
      set_timer1(0x15A0);
}

//PROGRAMA PRINCIPAL
void main(void) {

   long valTIMER=0;

   LED_OFF(LEDV);                   //encendemos led rojo
   LED_ON(LEDR);

   setup_timer_1 ( T1_INTERNAL | T1_DIV_BY_4 );
   enable_interrupts(INT_TIMER1);
   enable_interrupts(GLOBAL);

   set_timer1(0x15A0);      //Vtmr1 = 65536 - (1s * ( 12000000Hz / 4 ) / prescaler ) 200us -> Vtmr1=5536 set_timer1(0x15A0);

   LED_OFF(LEDR);
   LED_OFF(LEDV);                    //apagamos LEDs

   while (TRUE)
   {
            if(flagRTCC==1)
            {
               flagRTCC=0;
               output_high(SERVO);
               flagSERVO1=1;
            }

            if(flagSERVO1==1)
            {
               valTIMER=get_TIMER1();
               if(valTIMER>10036)//1,5ms->10036 0.5ms->7036 0.1ms->5836 2.3ms->12436 set_timer1(0x15A0);
               {
                  output_low(SERVO);
                  flagSERVO1=0;
               }
            }
   }//end bucle infinito
}//end void
Título: Re: Controlar servo con TIMER1 !!!IM---PRESIONANTE!!!
Publicado por: c4_esp_VR en 31 de Julio de 2006, 16:23:01
Bueno despues de muchas horas dándole al coco, al final decidí ir a la uni a mirarlo con un osciloscopio digital y resulta que la sañal que me daba el prdenador por la tarjeta de sonido estaba mal...así que ahora sin problemas va perfecto sólo hay que poner los tiempos adecuados  :-) :-) :-) :-) :-) :-) :-) :-) :-) :-) :-) :-) :-) :-):-) :-) :-) :-) :-) :-) :-) :-) :-) :-) :-) :-) :-):-) :-) :-) :-) :-) :-) :-) :-) :-) :-) :-) :-) :-)
Título: Re: Controlar servo con TIMER1 !!!IM---PRESIONANTE!!!
Publicado por: aitopes en 31 de Julio de 2006, 18:10:25
Hola! Me alegro lo hayas solucionado....

Habia leido el post original, y no enconraba la razon por la que no funcionaba, si el osciloscopio te mostraba correctamente los pulsos.
Ahora ya entendi el "porque"  :)

Saludos! :mrgreen: