Mi aplicación está pensada para ser usada con el programa LinuxCNC, donde sus salidas son por el puerto paralelo del computador, y tiene un pin especial para ese control, en este caso solo debo agregar un PIC16F628 y unos pocos componentes en la interfase de control. En cambio ese control no es tán fácil de implementar por RS232 o USB, donde debo agregar cables, enchufes, los posibles componentes, e investigar como se debería configurar el programa.
Respecto a los timers: El TMR0, sirve para detectar si la señal del PWM está siempre en 0 o en 1. le pongo un período ligeramente superior al de la señal del PWM, si durante ese período no se produce el cambio de la señal del PWM es porque el PWM está siempre en 0, o siempre en 1, leyendo el valor del pin correspondiente ya lo sé.
Cuando se produce el cambio de la señal del PWM, el primer flanco de subida del PWM, activa el TMR2 que cuenta hasta que se produce el próximo cambio de flanco del PWM, uso el TMR2 con un preescaler de 4:1, para que el valor contado sea directamente el porcentaje (en realidad cuento de a 0.5%, es decir cada dos cuentas del TMR2 son 1%.
Esta tarea puede ser realizada a la vez que estoy usando el TMR1 para contabilizar los microsegundos que faltan para encender el triac, contados a partir del cruce por 0 de la señal AC.
Lo único que no he logrado resolver del todo, es que una vez que se activa la interrupción por cambio del PortB,4 no logro que se borre el bit RBIF del INTCON, pero me parece que es algún bug del MPLAB, aunque no he encontrado ninguna referencia a eso en internet.