Bueno ya realicé el cambio con la esperanza de obtener buenos resultados pero lamento informarles que no he podido, sin embargo publicaré el código final, en el que traté de mejorar la precisión por si alguién le interesa saber hasta donde llegué:
#include <18F4550.h>
#fuses HSPLL,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL5,CPUDIV1,VREGEN,NOPBADEN,NOBROWNOUT
#use delay(clock=48000000)//48MHz
#USE RS232 (baud=9600,bits=8,parity=N,xmit=PIN_C6,rcv=PIN_C7)
//#build(reset=0x000800,interrupt=0x000808:0x000818)
// Necesario para indicarle al compilador a partir de donde alojar mi programa
// Si se quiere usar bootloader se pueden habilitar estás dos líneas
//#ORG 0x000, 0x07FF {} // Espacio reservado para alojar el bootloader
#byte PORTA = 0xF80// Son las direcciones de memoria de los puertos en este PIC
#byte PORTB = 0xF81
#byte PORTC = 0xF82
#byte PORTD = 0xF83
#byte PORTE = 0xF84
/////////////////////////////////////////////////////////////////////////////
//
// CCS Library dynamic defines. For dynamic configuration of the CCS Library
// for your application several defines need to be made. See the comments
// at usb.h for more information
//
/////////////////////////////////////////////////////////////////////////////
#define USB_HID_DEVICE FALSE //deshabilitamos el uso de las directivas HID
#define USB_EP1_TX_ENABLE USB_ENABLE_BULK //turn on EP1(EndPoint1) for IN bulk/interrupt transfers
#define USB_EP1_RX_ENABLE USB_ENABLE_BULK //turn on EP1(EndPoint1) for OUT bulk/interrupt transfers
#define USB_EP1_TX_SIZE 2 //size to allocate for the tx endpoint 1 buffer
#define USB_EP1_RX_SIZE 2 //size to allocate for the rx endpoint 1 buffer
/////////////////////////////////////////////////////////////////////////////
//
// If you are using a USB connection sense pin, define it here. If you are
// not using connection sense, comment out this line. Without connection
// sense you will not know if the device gets disconnected.
// (connection sense should look like this:
// 100k
// VBUS-----+----/\/\/\/\/\----- (I/O PIN ON PIC)
// |
// +----/\/\/\/\/\-----GND
// 100k
// (where VBUS is pin1 of the USB connector)
//
/////////////////////////////////////////////////////////////////////////////
//#define USB_CON_SENSE_PIN PIN_B2 //CCS 18F4550 development kit has optional conection sense pin
/////////////////////////////////////////////////////////////////////////////
//
// Include the CCS USB Libraries. See the comments at the top of these
// files for more information
//
/////////////////////////////////////////////////////////////////////////////
#include <pic18_usb.h> //Microchip PIC18Fxx5x Hardware layer for CCS's PIC USB driver
#include <PicUSB.h> //Configuración del USB y los descriptores para este dispositivo
#include <usb.c> //handles usb setup tokens and get descriptor reports
#use fast_io(A)
#use fast_io(B)
#use fast_io(C)
#use fast_io(D)
#use fast_io(E)
#bit servo_00 = PORTB.0
#bit servo_01 = PORTB.1
#bit servo_02 = PORTB.2
#bit servo_03 = PORTB.3
#bit servo_04 = PORTB.4
#bit servo_05 = PORTB.5
#bit servo_06 = PORTB.6
#bit servo_07 = PORTB.7
#bit servo_08 = PORTD.0
#bit servo_09 = PORTD.1
#bit servo_10 = PORTD.2
#bit servo_11 = PORTD.3
#bit servo_12 = PORTD.4
#bit servo_13 = PORTD.5
#bit servo_14 = PORTD.6
#bit servo_15 = PORTD.7
#define i_usb recibe[0]// es el índice que se recibe vía usb
#define byte_alto_usb recibe[1]//
#define byte_bajo_usb recibe[2]//
#define n 16// número de servos
//para otro número de servos hay que hacer mediciones de tiempo
#define ventana 29827//
#define derecha 29827//
#define centro 17827//
#define izquierda 5827//
#define inicio 17827
#define ventana_ciclos 26176// Valor determinado en simulaciones
int8 i_int=0;// Índice de la interrupción del TIMER1
int8 x=0;// Número de interrupciones
int16 VTI_Servo[n+1], VTI[n+1];
// VTI_Servo[] contiene el estado de los servos y VTI los ticks de las proximas
// interrupciones
int16 TICK_dif[n];
int16 TICK[]={inicio,inicio,inicio,inicio,inicio,inicio,inicio,inicio,inicio,inicio,inicio,inicio,inicio,inicio,inicio,inicio};
int1 band_inicio=0;
int8 ciclos=9;
#INT_TIMER1
void isr_timer1(){
int8 parte_baja, parte_alta;
if (i_int>x){
ciclos++;
set_timer1(65535-ventana_ciclos);//
}
else {
parte_baja=make8(VTI_Servo[i_int], 0);
parte_alta=make8(VTI_Servo[i_int], 1);
if (parte_baja & 0b00000001){
servo_00=1;
}
else {
servo_00=0;
delay_cycles(1);
}
if (parte_baja & 0b00000010){
servo_01=1;
}
else {
servo_01=0;
delay_cycles(1);
}
if (parte_baja & 0b00000100){
servo_02=1;
}
else {
servo_02=0;
delay_cycles(1);
}
if (parte_baja & 0b00001000){
servo_03=1;
}
else {
servo_03=0;
delay_cycles(1);
}
if (parte_baja & 0b00010000){
servo_04=1;
}
else {
servo_04=0;
delay_cycles(1);
}
if (parte_baja & 0b00100000){
servo_05=1;
}
else {
servo_05=0;
delay_cycles(1);
}
if (parte_baja & 0b01000000){
servo_06=1;
}
else {
servo_06=0;
delay_cycles(1);
}
if (parte_baja & 0b10000000){
servo_07=1;
}
else {
servo_07=0;
delay_cycles(1);
}
if (parte_alta & 0b00000001){
servo_08=1;
}
else {
servo_08=0;
delay_cycles(1);
}
if (parte_alta & 0b00000010){
servo_09=1;
}
else {
servo_09=0;
delay_cycles(1);
}
if (parte_alta & 0b00000100){
servo_10=1;
}
else {
servo_10=0;
delay_cycles(1);
}
if (parte_alta & 0b00001000){
servo_11=1;
}
else {
servo_11=0;
delay_cycles(1);
}
if (parte_alta & 0b00010000){
servo_12=1;
}
else {
servo_12=0;
delay_cycles(1);
}
if (parte_alta & 0b00100000){
servo_13=1;
}
else {
servo_13=0;
delay_cycles(1);
}
if (parte_alta & 0b01000000){
servo_14=1;
}
else {
servo_14=0;
delay_cycles(1);
}
if (parte_alta & 0b10000000){
servo_15=1;
}
else {
servo_15=0;
delay_cycles(1);
}
set_timer1(VTI[i_int]);
i_int++;
}
}
/////////////////////////////////////// PRINCIPAL /////////////////////////////////////
void main()
{
int k, kk;
int8 i=0;// es el índice exclusivo de duty[] en la recepción serial
int8 dato=0;
int8 recibe[3];// Buffer de recepción vía usb
//int8 envia[2];// Habilitar en caso de necesitar
int16 aux;
int8 byte_alto, byte_bajo;// Son los baytes alto y bajo de la recepción
// Serial rs232
set_tris_b(0x00);
set_tris_c(0b10000000);
set_tris_d(0x00);
PORTB=0x00;
PORTD=0x00;
port_b_pullups(FALSE);
disable_interrupts(global);
setup_adc_ports(NO_ANALOGS);
setup_adc(ADC_OFF);
setup_timer_1(T1_INTERNAL | T1_DIV_BY_1);
usb_init();//inicializamos el USB
usb_task();//habilita periférico usb e interrupciones
usb_wait_for_enumeration();//esperamos hasta que el PicUSB sea configurado por el host
while (TRUE)
{
if(usb_enumerated())//si el PicUSB está configurado
//if (TRUE)
{
if (ciclos>8){// Esto se repite al terminar un ciclo completo de 20ms
// y la 1era vez que se ejecuta éste código también
ciclos=1;
// Hacemos una copia de TICK[] en TICK_dif[]
for (k=0; k<=n-1; k++) TICK_dif[k]=TICK[k];
// A continuación ordenamos TICK_dif[] de menor a mayor
for (k=0; k<=n-1; k++){
for (kk=k+1; kk<=n-1; kk++){
if (TICK_dif[k]>TICK_dif[kk]){
aux=TICK_dif[kk];
TICK_dif[kk]=TICK_dif[k];
TICK_dif[k]=aux;
}
}
}// Aqui ya terminamos de ordenar de menor a mayor TICK_dif[]
// Ahora vamor a eliminar los repetidos y nos quedamos con los diferentes
// solamente y a la vemos sabemos cuántos son
k=0;
for (kk=1; kk<=n-1;kk++){
if (TICK_dif[k]!=TICK_dif[kk]){
k++;
TICK_dif[k]=TICK_dif[kk];
}
}
x=k+1; // (x+1) es el número de interrupciones que se hacen
i_int=0; // índice de interrupciones
// Generamos el vector con los tiempos de las interrupciones
VTI[0]=65535-TICK_dif[0];//
// Una vez que se entre en la 1era interrupción por desborde del
// timer1 éste será el valor con que se cargará dicho contador
// para que ocurra la próxima interrupción.
VTI[x]=65535-ventana+TICK_dif[x-1];// ventana=2,5ms
// Con éste valor se cargará el contador la última vez que entra
// en el manejo de interrupciones en un ciclo, cada ciclo es de
// 2,5ms, por lo tanto será el tiempo que esperará para que se
// cumpla dicho tiempo
// 30000ticks*(1/12000000)=2,5ms
// a éste valor le resto lo que ha transcurrido previamente
// Próximanete genramos los tiempos de duración de cada interrupción
for (k=1; k<=x-1; k++){
VTI[k]=65535-(TICK_dif[k]-TICK_dif[k-1]);
}
// Ahora vamos a generar el vector de los estados de los pines
// en las interrupciones VTI_Servo[]
for (k=0; k<=x-1;k++){
for (kk=0; kk<=n-1; kk++){
if (TICK_dif[k]<=TICK[kk]){
bit_set(VTI_Servo[k], kk);
}
else bit_clear(VTI_Servo[k], kk);
}
}
}
// Recepción de datos via rs232//
if (kbhit()){
switch (dato){
case 0:
i=getc();
dato=1;
break;
case 1:
byte_alto=getc();// recibe el byte alto
dato=2;
break;
case 2:
byte_bajo=getc();// recibe el byte bajo
TICK[i]=256*byte_alto+byte_bajo;
dato=0;
break;
}
}
// Recepción vía USB
if (usb_kbhit(1))//El endpoint de salida contiene datos del host (EP1)?
{
usb_get_packet(1, recibe, 3);// Recibimos los 3 bytes:
// (servo,byte_alto_usb, byte_bajo_usb)
TICK[i_usb]=256*byte_alto_usb+byte_bajo_usb;
}
if (band_inicio==0){// Se ejecuta una sola vez
set_timer1(65535-ventana);//
// espero 20ms para empezar a mover los servos
enable_interrupts(INT_TIMER1);
enable_interrupts(GLOBAL);
band_inicio=1;
}
}
}
}
Adjunto archivos con una nueva interface, en la que modifiqué los límites permitidos.