Antes que nada, quisiera preguntarle a a RedPic si está bien que siga posteando mis avances aquí ó abro otro hilo.
Mientras espero la confirmación aqui tengo una 2da aproximación del código:
#include <16f877.h>
#fuses HS,NOWDT,NOPROTECT,NOLVP,NOBROWNOUT,PUT
#use delay (clock=20000000)
#USE RS232 (baud=9600,bits=8,parity=N,xmit=PIN_C6,rcv=PIN_C7)
#byte RCSTA= 0x018
#bit CREN= RCSTA.4 // Se activa para recepción continua
#bit OERR= RCSTA.1 // Error de Overrun
#use fast_io(A)
#use fast_io(B)
#use fast_io(C)
#use fast_io(D)
#use fast_io(E)
#byte PORTA = 0x05
#byte PORTB = 0x06
#byte PORTC = 0x07
#byte PORTD = 0x08
#byte PORTE = 0x09
#bit servo_01 = PORTB.0
#bit servo_02 = PORTB.1
#bit servo_03 = PORTB.2
#bit servo_04 = PORTB.3
#bit servo_05 = PORTB.4
#bit servo_06 = PORTB.5
#bit servo_07 = PORTB.6
#bit servo_08 = PORTB.7
#bit servo_09 = PORTD.0
#bit servo_10 = PORTD.1
#bit servo_11 = PORTD.2
#bit servo_12 = PORTD.3
#bit servo_13 = PORTD.4
#bit servo_14 = PORTD.5
#bit servo_15 = PORTD.6
#bit servo_16 = PORTD.7
#define n 16// número de servos, para otro número de servos hay que hacer mediciones de tiempo
#define max_theCount 50//
#define derecha 45
#define izquierda 8//
int8 duty[n];
int8 i=0;// es el índice exclusivo de servo[] en la recepción serial
int1 band=0;
// Recepción de datos
#int_rda
void rda_isr(void){//1er byte recibido indica el servo y el 2do byte el ciclo
if (band==0){
i=getc();
band=1;
}
else{
band=0;
duty[i]=getc();
}
}
/////////////////////////////////////// PRINCIPAL /////////////////////////////////////
void main()
{
int8 theCount=0;
int k;
set_tris_b(0x00);
set_tris_c(0b10000000);
set_tris_d(0x00);
PORTB=0x00;
PORTD=0x00;
port_b_pullups(FALSE);
for(k=0;k<=(n-1);k++)
duty[k]=izquierda;//
setup_adc_ports(NO_ANALOGS);
setup_adc(ADC_OFF);
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DISABLED,0,1);
enable_interrupts(int_rda);
enable_interrupts(global);
while (1)
{
delay_us(13);
#asm
nop
nop
#endasm
servo_01= (duty[0] >= theCount);// Cada 50us llega aqui de forma cíclica
servo_02= (duty[1] >= theCount);
servo_03= (duty[2] >= theCount);
servo_04= (duty[3] >= theCount);
servo_05= (duty[4] >= theCount);
servo_06= (duty[5] >= theCount);
servo_07= (duty[6] >= theCount);
servo_08= (duty[7] >= theCount);
servo_09= (duty[8] >= theCount);
servo_10= (duty[9] >= theCount);
servo_11= (duty[10] >= theCount);
servo_12= (duty[11] >= theCount);
servo_13= (duty[12] >= theCount);
servo_14= (duty[13] >= theCount);
servo_15= (duty[14] >= theCount);
servo_16= (duty[15] >= theCount);
theCount++;
if (theCount>max_theCount) theCount=0;
}
}
La trama es así: 1er Byte enviado indicas el servo [0..15] y el 2do Byte enviado el ciclo útil que va desde 8 (Extremo izquierdo) y 45 (Extremo Derecho), en resumen: (Servo, Posición)
El programa está respondiendo bien, pero después de enviar varios datos noto que otros servos se mueven también, eso es por el tiempo que se tarda en recibir los datos vía serial hace un desplazamiento de tiempo

esto lo empecé a notar después que ajusté la sensibilidad del servo a 0.5m y 2.5m, en estos momentos no sé como podría solucionar eso, en una primera opción sería usar un servo menos sensible

pero sé que esa no es la solución correcta.
PD1: No sé exactamente que es y cómo solucionarlo, pero sucede cuando le cambio el ciclo a varios de ellos, voy a chequear.
Adjunto archivos.
Saludos.
// Editado posteriormente \\
Ya creo haber identificado el problema, estoy trabajando para corregirlo.

, es un problema de tiempo en la recepción de datos que descuadra todo, no sabía que esto de los servos había que ser taaan precisos, ahora entiendo a RedPic con los 20ms exactos

RECOMENDACIÓN: No montar esto en físico hasta que esté bien depurado y probado su correcto funcionamiento en proteus.
Saludos.