Autor Tema: Controlar servo con TIMER1 !!!IM---PRESIONANTE!!!  (Leído 1727 veces)

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

Desconectado c4_esp_VR

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 735
    • www.muchotrasto.com
Controlar servo con TIMER1 !!!IM---PRESIONANTE!!!
« 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

Desconectado c4_esp_VR

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 735
    • www.muchotrasto.com
Re: Controlar servo con TIMER1 !!!IM---PRESIONANTE!!!
« Respuesta #1 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  :-) :-) :-) :-) :-) :-) :-) :-) :-) :-) :-) :-) :-) :-):-) :-) :-) :-) :-) :-) :-) :-) :-) :-) :-) :-) :-):-) :-) :-) :-) :-) :-) :-) :-) :-) :-) :-) :-) :-)

Desconectado aitopes

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5100
    • uControl
Re: Controlar servo con TIMER1 !!!IM---PRESIONANTE!!!
« Respuesta #2 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:
Si cualquier habilidad que aprende un niño será obsoleta antes de que la use, entonces, ¿qué es lo que tiene que aprender? La respuesta es obvia:
La única habilidad competitiva a largo plazo es la habilidad para aprender
“. Seymour Papert