Perdon no lo vi. Ahora mirando el codigo encuentro varios problemas.
if(ang_servo1 == val_min){
ang_servo1 = val_min;
servo = 1;
}
else{
ang_servo1 = ang_servo1 - 50;
servo = 1;
}
Por que no directamente
if(PORTBbits.RB0 == 1){ //ANG_SERVO1 = 1000
while(PORTBbits.RB0);
ang_servo1 = ang_servo1 - 50;
if(ang_servo1 < val_min) ang_servo1 = val_min;
Es decir, Decremento y verifico si me pase... Asi con todos los botones.
Y finalmente la interrupcion.
Hacer un switch case es un desastre.... Por lo tanto, considero que deberias buscar otra aproximacion.
Deberias en ves de usar el valor del timer, deberia tener una interrupcion fija, de unos 0,1ms por ejemplo
Entonces 10 veces es el minimo (1ms)
Y 20 veces es el maximo (2ms)
Esto hace que tu interrupcion sea la siguiente:
void __interrupt (high_priority) Tmr0ISR(void){
if(INTCONbits.TMR0IF){
ingresoTmr0(valorpara0.1ms);
INTCONbits.TMR0IF = 0;
if(continterrupciones > ang_servo1) LATEbits.LE0 = 0;
if(continterrupciones > ang_servo2) LATEbits.LE1 = 0;
if(++continterrupciones > 200) {
continterrupciones = 0;
LATEbits.LE0 = 1;
LATEbits.LE1 = 1;
}
}
}
Y cargas en ang_servox un valor entre 10 y 20...
Por supuesto esto no tiene demasiados pasos, ya que tenemos 10 pasos para dar. Podes achicar mas la interrupcion.
Ademas como el tiempo es fijo, podrias usar el CCP en modo Compare, para que se auto-recargue, lo que si vas a necesitar usar el Timer 1