Como dijo remi.
El timer es un simple contador de pulsos. Y si lo queremos usar como timer contamos los pulsos de reloj que sabemos exactamente cuanto tiempo tienen.
Los PIC de 8bits dividen la frecuencia de entrada por 4, sino me equivoco los PICs de 16bits lo hacen por 2, y eso es lo que le llega a los modulos (nucleo,timers,etc)
Eso te deja con que puedas calcular el periodo o la frecuencia de la siguiente forma
Fcy = Fosc/4
Tcy = 4*Tosc = 4/Fosc (Es decir el periodo del oscilador multiplicado por 4)
Para 10Mhz, el periodo seria 100ns, pero eso es del oscilador, multiplicándolo por 4 te quedan 400ns que serian lo que llegan a los modulos.
-----------------------------
Si usas un preescaler 1:1 entonces el timer va a sumar 1 cada 1 pulso de entrada, es decir cada 400ns
Si usas un preescaler 16:1 entonces el timer va a sumar 1 cada 16 pulsos de entrada, es decir 16*400ns = 6.4us
Asi funciona el Preescaler
------------------------------
Ahora la generacion de la interrupcion, el timer es de un contador de 8 bits, por lo tanto el maximo valor a contar es de 255, luego pasa a 0, y es ahi cuando se activa la interrupcion, por eso mismo se usa el 256, como es ascendente, necesitamos saber desde donde debe comenzar, por eso hacemos la resta. Para saber el retardo final..
En fin un ejemplo final
Quiero una demora de 1ms con un cristal de 20Mhz
- Con un cristal de 20Mhz tengo un periodo de 50ns (1/20Mhz)
- Lo multiplico por 4 - Me deja con 200ns el Tcy
- Uso un preescaler de 64:1 eso me deja con una cuenta cada 64*200ns = 12.8us
- Entonces aumenta 1 cada 12.8us, entonces para 1ms necesito contar 1ms/12.8us = 78.125 redondeado es 78 cuentas
- Calculo el valor a cargar en el timer que es 256-78 = 178
En tu programa luego lo unico a configurar seria el preescaler y cargar esos 178.
Y esos serian los pasos...
Por supuesto, si usas un preescaler mas pequeño a veces los valores que tenes son mas grandes que 255, y esto no significa que NO puedas hacerlo, si se puede, pero con varias cargas del timer, en ves de una sola.