hola amigos tengo un proyecto para controlar tres servos solamente e hice elprograma con el algoritmo de interrupcion por timer 1 pero el porblema que tengo es que la frecuencia no funciona esta hecho en un pic 18f4550 deseo su ayuda jejejej y de antemano muchas gracias a este foro por todo lo que he aprendido.
#include <18f4550.h>
#fuses HS,NOMCLR,PUT,NOWDT,NOPROTECT,BROWNOUT,NOLVP,NOCPD,NODEBUG,NOWRT
#use delay(clock=20000000)
#use fast_io(D)
#use fast_io(B)
#priority timer1
#define SERVO1 PIN_D7
#define SERVO2 PIN_D6
#define SERVO3 PIN_D5
#define SERVO4 PIN_D4
#define SERVO5 PIN_D3
#define SERVO6 PIN_D2
#define SERVO7 PIN_D1
#define SERVO8 PIN_D0
const int16 TOTAL = 12500; // PWM Window for servo = 2.5 ms x 8 = 20 ms
//const int16 Ticks4Minimum = 3500; // PWM High for Minimum Position = 0.7 ms
//const int16 Ticks4Center = 7500; // PWM High for Center Position = 1.5 ms
///const int16 Ticks4Maximum = 11500; // PWM High for Maximum Position = 2.3 ms
int16 TIEMPOS[8]={7500,3500,7500,0,0,0,0,0};
static int8 NUMSERVO=0;
static int1 SERVO1_ON=1;
static int1 SERVO2_ON=1;
static int1 SERVO3_ON=1;
static int1 SERVO4_ON=0;
static int1 SERVO5_ON=0;
static int1 SERVO6_ON=0;
static int1 SERVO7_ON=0;
static int1 SERVO8_ON=0;
static int1 ENTRADAS;
static int16 SIGUIENTEINT=53036;
#int_timer1
void timer1_isr(void){
if(ENTRADAS==0){
if(NUMSERVO==0 && SERVO1_ON) output_high(SERVO1);
if(NUMSERVO==1 && SERVO2_ON) output_high(SERVO2);
if(NUMSERVO==2 && SERVO3_ON) output_high(SERVO3);
if(NUMSERVO==3 && SERVO4_ON) output_high(SERVO4);
if(NUMSERVO==4 && SERVO5_ON) output_high(SERVO5);
if(NUMSERVO==5 && SERVO6_ON) output_high(SERVO6);
if(NUMSERVO==6 && SERVO7_ON) output_high(SERVO7);
if(NUMSERVO==7 && SERVO8_ON) output_high(SERVO8);
SIGUIENTEINT = 65535 - TIEMPOS[NUMSERVO];
set_timer1(SIGUIENTEINT);
}
if(ENTRADAS==1){
if(NUMSERVO==0 && SERVO1_ON) output_low(SERVO1);
if(NUMSERVO==1 && SERVO2_ON) output_low(SERVO2);
if(NUMSERVO==2 && SERVO3_ON) output_low(SERVO3);
if(NUMSERVO==3 && SERVO4_ON) output_low(SERVO4);
if(NUMSERVO==4 && SERVO5_ON) output_low(SERVO5);
if(NUMSERVO==5 && SERVO6_ON) output_low(SERVO6);
if(NUMSERVO==6 && SERVO7_ON) output_low(SERVO7);
if(NUMSERVO==7 && SERVO8_ON) output_low(SERVO8);
SIGUIENTEINT = 65535 - TOTAL + TIEMPOS[NUMSERVO];
set_timer1(SIGUIENTEINT);
if(++NUMSERVO>7) NUMSERVO=0;
}
++ENTRADAS;
}
void main(void) {
disable_interrupts(global);
setup_adc_ports(NO_ANALOGS);
setup_adc(ADC_OFF);
setup_counters(RTCC_INTERNAL,RTCC_DIV_2);
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);
port_b_pullups(TRUE);
set_tris_D(0b00000000);
set_tris_B(0b11111111);
output_low(SERVO1);
output_low(SERVO2);
output_low(SERVO3);
output_low(SERVO4);
output_low(SERVO5);
output_low(SERVO6);
output_low(SERVO7);
output_low(SERVO8);
delay_ms(1000);
set_timer1(SIGUIENTEINT);
enable_interrupts(int_timer1);
enable_interrupts(global);
do {
IF(INPUT(PIN_B0)&&TIEMPOS[0]<11000){
IF(!INPUT(PIN_B0)&&TIEMPOS[0]<11000){
TIEMPOS[0]=TIEMPOS[0]+ 250;
}
}
IF(INPUT(PIN_B1)&&TIEMPOS[0]>3800){
IF(!INPUT(PIN_B1)&&TIEMPOS[0]<11000){
TIEMPOS[0]=TIEMPOS[0] - 250;
}
}
} while (TRUE);
}
por favor estoy algo desesperado con esto espero que me puedan ayudar a encontrar la solucion.