Bueno pues quiero controlar un servo con un adc, vi lo que tiene redpic de 8 servos pero controla 0º, 90º y 180º, yo digo que modulando el ancho de pulso se puede controlar los grados de este bueno eso espero, lo que hice fue con la interrupción del timer1 y poner el settimer dependiendo del valor del adc, pero en la simulación de proteus no sale nada, bueno aquí el código que tengo para que le hechen un vistaso
#include <18f4550.h>
#device ADC=10;
#fuses HS, NOPROTECT, NOWDT, NOLVP
#use delay(clock=4000000)
#define servo1 PIN_B0
int16 adc_value,time1, flag=0,value,flag2=0;
#int_TIMER1
void periodo(void)
{
if(flag2==0)
{
set_adc_channel( 0 );
value=read_adc();//Leer el adc
//delay_us(10);
adc_value= (int) (value*(180/1023));//Valores en grados del servomotor
time1=(900+(adc_value*6.66)); //Para futaba min=0.9ms max=2,1ms
set_timer1(time1);//Pone el angulo del servo
flag=1;
}
if(flag2==1)
{
output_high(servo1);
set_timer1(65536-(int)(adc_value*6.66));//Tiempo en alto para el pwm
flag=2;
}
if(flag2=2)
{
output_low(servo1);
set_timer1(65536-(20000-(time1)-(int)(adc_value*6.66)));//Tiempo restante para los 20ms
flag=0;
}
}
void main (void)
{
setup_timer_0(RTCC_OFF);
setup_timer_1(T1_INTERNAL | T1_DIV_BY_1);
setup_timer_2(T2_DISABLED,0,1);
setup_timer_3(T3_DISABLED);
enable_interrupts(int_timer1);
enable_interrupts(global);
setup_adc_ports(AN0_analog); // Inicializa el canal0 del adc
setup_adc(adc_clock_internal);//Frecuencia para tomar muestras
set_timer1(45536);//Tiempo para esperar los primeros 20ms
while(true);
{
if(flag==0)
{
flag2=0;
}
if(flag==1)
{
flag2=1;
}
if(flag==2)
{
flag2=2;
}
}
}