Hola Algec.
Estuve analizando exhaustivamente el "supuesto" malfuncionamiento. Digo "supuesto" porque a mi parecer el software se está comportando como debe. Y su comportamiento es correcto con respecto a tus "tablas de verdad" expuestas en el .xls.
El problema es que vos estás intentando detectar un malfuncionamiento que no genera la interrupción por cambio del puertob.Si no genera la interrupción, no se analiza y por lo tanto no se encuentra error alguno.
Fijate que en tu tabla de verdad con fallos(lo hago para el giro a la izq. es lo mísmo para la der.) tenés los siguientes 4 valores que arrojaría el encoder:
11
10
10
11
Bien?
Esos serían los 4 valores que el encoder arrojaría indefinidamente mientras el cable A estuviese cortado.Ahora..el problema es que la tabla es capaz de detectar un error en sólo dos posiciones del encoder y esas son en el 1er paso y en el 3er paso. Para que lo entiendeas, marco con una E donde tu tabla es capaz de detectar un error:
11 <--E
10
10 <--E
11
Ahora analicemos las transiciones: Detecta el error en el primer paso(11) pero comparandolo con el paso anterior(el cuarto, que es también 11). Genial en la teoría, pero malo en la práctica. Si el paso anterior era el 11 y ahora también lo es, no se produce un cambio en el puertob, por lo que la interrupción no sucede y no es posible detectar el error. Lo mísmo sucede con el tercer paso, viene de un estado 10 y continúa en 10. No hay cambios en RB4-RB7. No hay interrupción, por lo que tampoco se detecta error alguno.
Actualmente cuando abris un contacto, en lugar de interrumpir 4 veces por ciclo interrumpe sólo dos: en los segundos y cuartos pasos.El problema es que en esos la diferencia da 1 y -1, por lo que el algoritmo no detecta ningún error.
Esto sucede porque la onda cuadrada que hace girar al motor es generada por un tercero y no por el uC. Si vos generaras la señal para hacer girar al servo y a la vez lees el encoder, ahi sí podrías detectar si se cortó un cable, o se perdió algún paso por sobrevelocidad o bien no giró el motor por algún freno o problema mecánico comparando el valor enviado al motor con el valor del encoder.
Espero se haya entendido y haberte podido orientar un poco.
Saludos.