Es solo un problema de temporizacion, vas a tener que verificar el assembler que te genera. Acordate que todo salto (goto, call, btfss, btfsc) se llevan 2 instrucciones de reloj en vez de 1.
Ademas, proba poner clear_interrupt(nombreinterrupcion) justo antes de el fin de la subrrutina de interrupcion. No deberia ser necesario pero proba.
Vas a tener que afinar muy concienzudamente los tiempos, y considerar todas las bifuraciones del programa para que todo el tiempo lleve lo mismo.
La otra es usar el modulo CCP (capture compare pwm) del 16f628 y sus interrupciones.