Si.. la interrupcion puede ser de 0.2us que es lo que tarda 1 ciclo de reloj (Fosc/4). El problema surge con no conocer como funciona el micro, el datasheet lo dice pero es todo casi exceptuando los modulos
El problema es que las instrucciones tambien tardan 1 o 2 ciclos de reloj. Si pensas que:
Detectada la interrupcion, el micro debe guardar los registros y saltar al vector de interrupcion.
Dentro de la interrupcion a veces se salta al destino que corresponde que es la funcion de interrupcion ( 2 ciclos )
Guardar y reestablecer los registros STATUS y W como minimo que seran ( 8/9 ciclos mas )
Preguntar por cual interrupcion llego ahi. ( 2/3/4 mas segun)
Limpiar la bandera de interrupcion. (1 ciclos )
Recargar el Timer si es que no usas el CCP.
Ejecutar el codigo de la interrupcion (lo que hagas )
Ejecutar el RETFIE para volver ( 2 ciclos mas )
Te vas a dar cuenta que es irrealizable lo que pedis!.
El que este demorando 13us significa que entre que se determina la interrupcion, hasta que sale (porque apenas sale entra de nuevo) pasaron 65 ciclos
Podes hacerlo mas rapido ? SI en ASM, pero no vas a ganar nada. Ademas tu micro se pasa en la interrupcion, de tal forma que ni vale la pena usarla, ya que lo del while del main jamas se va a ejecutar, entonces si lo haces en el while del main va a ser mas rapido aun. Y ni siquiera uses el Timer. Lo mas rapido que podes conseguir es:
while(1)
{
output_toggle(PIN_C3);
}
(Usar el FAST_IO(C) y el set_tris_c() )
Y que seguramente NO sea tan rapido como pensas, ya que le va a llevar facil unas 3 ciclos o 0.6us (1.2us periodo) como minimo (salto + XOR).
Se puede reducir aun mas si se repite output_toggle, por toda la memoria.... pero no te salvas de 0.4us de periodo, y cada tanto un estado va a quedar en alto o bajo por 0.6s por el salto.
Y esto pensandolo desde puro ASM.
Lo que vos estas buscando es si o si utilizar el PWM (del CCP) y no la interrupcion del Timer. Aun asi no creo que logres tener ese resultado, deberias tener un micro mucho mas rapido.
Si ahora necesitas muchos mas PWM independientes (Y por eso lo intentas hacer por software) a esa frecuencia entonces sugiero irte a otro integrado o buscar algun integrado aparte que haga de PWM y lo controles via SPI/i2C/etc si es que existe.
-----------
Hay micros que poseen otras ventajas, los PIC18 por ejemplo ya agregan el de guardar/restablecer los registros STATUS/W por si solos al entrar. Los PIC24 ya no ocupa 4 ciclos del oscilador para hacer una instruccion, y asi en adelante, pero lo que estas pidiendo requiere de un micro demasiado rapido e insensato hacerlo por software.
-----------
Pero la pregunta del millon es...
¿Realmente necesito esa frecuencia?
Todo esto suponiendo que es un PWM. Ya que tu codigo no es mas que dividir el reloj que es de 20Mhz por 4 y asi obtener una salida cuadrada de 5Mhz