Amigos, tengo esta parte de código que funciona para mover 8 servos de una manera sencilla y eficaz utilizando el setup_timer_1(T1_INTERNAL | T1_DIV_BY_1); y setup_ccp2(CCP_COMPARE_INT); (anexo imagen en proteus). En el código se muestra #define pos_servo 12500, de tal manera que 12550 es el valor para 2.5 ms y 2500 es para 0.5 ms (tiempos maximizo mínimos del servo).
Bien, pues ahora que quiero agregarle una función para que en la parte del CCP
CCP_2 = ticks_tmr1 + pos_servo;
(linea 48 del código)
pos_servo esa constante definida por el procesador la pueda yo controlar por el adc independientemente con un array de adc´s y pensando en que la linea 48 quede de la siguiente manera
CCP_2 = ticks_tmr1 + adc_servo(); pero ni siquiera e podido hacer que me muestre la lectura del adc. tal parece que por las interrupciones no me permite mostrar ningún valor del adc se muestre.
pudieran darme alguna opinión.. O quizas no estoy desarrollando correctamente la funcion para la lectura de los ADC´s. Gracias...
#include <16f877A.h>
#device ADC=10
#fuses HS,NOWDT,NOPROTECT,NOPUT,NOBROWNOUT,NOLVP,NOCPD,NODEBUG,NOWRT
#use delay(clock=20000000)
#byte porta=0xF05 #byte portb=0xF06 #byte portc=0xF07
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7, PARITY=N, BITS=8)
#use fast_io(a)
#use fast_io(b)
#use fast_io(c)
#priority timer1,ccp2 // float const uS Tick = 0.2; Microsegundos por Tick del TMR1 a 20 Mhz
#define ticks_tmr1 53036 // 65536-53036=12500 * 0,0002 = 2,5 milisegundos
#define pos_servo 12500 // limite_max=12500, limite_min=2500
int servo=0,ch=0;
short flag=FALSE;
int puerto=6;
int16 valor_canal[8];
#int_timer1
void timer1_isr() // Se activa cada 2,5 ms
{ flag=TRUE; set_timer1(ticks_tmr1); } // 65536-53000=12536*0,0002 = 2,5 ms
#int_ccp2
void ccp2_isr()
{ bit_clear(*puerto,servo); }
void main(void)
{
porta=0x00; portb=0x00; portc=0x00;
set_tris_a(0b11111111); set_tris_b(0b00000000); set_tris_c(0b00000000);
setup_adc_ports(ALL_ANALOG);
setup_adc(ADC_CLOCK_INTERNAL);
setup_timer_1(T1_INTERNAL | T1_DIV_BY_1);
setup_ccp2(CCP_COMPARE_INT); // Configura CCP2 en modo COMPARE
set_timer1(ticks_tmr1);
enable_interrupts(int_timer1); // Int timer 1
enable_interrupts(int_ccp2); // Habilito la interrpción INT_CCP2
enable_interrupts(global); // Habilita interrupciones
while (TRUE)
{
if(flag==TRUE) // bandera para tmr1 para cada 2.5 ms
{
if (++servo>=8) servo=0;
bit_set(*puerto,servo);
CCP_2 = ticks_tmr1 + pos_servo; // Calculo posicion de los servos
flag=FALSE;
}
}
}
void adc_servo()
{
for(ch=0;ch<=7;ch++)
{
set_adc_channel(ch); delay_us(20);
valor_canal[ch] = read_adc();
}
}