El Timer 2 es un temporizador de 8 bits que tiene la particularidad de tener un preescalador y un post-escalador. Además este módulo cuenta con un registro de periodo PR2 que marca el valor máximo que puede alcanzar la cuenta del registro TMR2. A diferencia de los otros temporizadores, el temporizador Timer 2 no incrementa su cuenta hasta llegar a 0xFF y después al desborde sino que incrementa su cuenta desde 0x00 con cada ciclo de instrucción hasta que el valor del registro TMR2 coincide con el del registro PR2 y después, en el siguiente ciclo reinicia la cuenta desde 0x00.

Este módulo cuenta con un preescalador y un post-escalador. El preescalador tiene la misma función que en los otros dos timers y sirve
como divisor de frecuencia antes de cada incremento. El post-escalador funciona como un divisor de frecuencia después de cada coincidencia
entre los registros TMR2 y PR2. Si el post-escalador es 1:1 la bandera de interrupción TMR2IF se habilitará en cada coincidencia entre TMR2 y PR2, en cambio si por ejemplo el post-escalador es 1:16, la interrupción se presentará cada 16 coincidencias.

Este temporizador, al igual que el Timer 1, puede habilitarse y deshabilitarse mediante el bit TMR2ON.

El preescalador se selecciona con los bits T2CKPS1:T2CKPS0 y el post-escalador con los bits T0UTPS3:TOUTPS0 de la siguiente manera:
Preescalador        Post-escalador
 00 = 1:1            0000 = 1:1
 01 = 1:4            0001 = 1:2
 1x = 1:16           0010 = 1:3
     .
     .
     .
       1111 = 1:16
Carga y Temporización

La temporización del Timer 2 está dada por la siguiente expresión:

TempTMR2 = [Preescaler*(PR2+1)*Postscaler]*Tinstr

Donde
Preescaler = Valor del preescalador
PR2 = Valor cargado al registro PR2
Postscaler = Valor del post-escalador
Tinstr = 4/frecuencia de oscilación
TempTMR2 = Temporización dada en segundos

La temporización máxima que puede alcanzar el Timer 2 es la misma que alcanza el Timer 0. Utilizando el oscilador interno del pic 16f628 la temporización máxima sería de 65536uS. Si se desea otra temporización se puede lograr cargando el valor necesario al registro PR2.

PR2 = [([TempTMR2/(4/fosc)])/(Preescaler*Postscaler)]-1

Veamos el mismo ejemplo de los temporizadores anteriores, ahora aplicado al Timer 2: Se desea complementar el valor del puerto B cada
50ms. Se estará revisando que se haya cumplido el tiempo de la temporizacion checando la bandera TMR2IF. Utilizando la expresión de la
precarga y utilizando el preescalador y el post-escalador más grande (16) obtenemos el valor quer que necesitamos cargar al registro PR2 para obtener una temporizacion de 50mS.

PR2 = [([50mS/(4/4Mhz)])/(16*16)]-1 = 194.31

Ya que no podemos cargar numeros fraccionarios el valor del registro PR2 necesario es 194. El código del programa sería el siguiente:
INICIO
 bsf     STATUS,RP0
 clrf    TRISB
 bcf     STATUS,RP0
 movlw   b'01111010'
 movwf   T2CON
 clrf    PORTB
 bcf     PIR1,TMR2IF
PRECARGA
 bcf     T2CON,TMR2ON
 bsf     STATUS,RP0
 movlw   .194
 movwf   PR2
 bcf     STATUS,RP0
 bsf     T2CON,TMR2ON
ESPERA
 btfss   PIR1,TMR2IF
 goto    ESPERA
 bcf     PIR1,TMR2IF
 comf    PORTB,f
 goto    PRECARGA
Descargar código: Ejemplo del temporizador Timer 2