El Timer 1 es un módulo temporizador/contador de 16 bits, que consiste en dos registros de 8 bits (TMR1H y TMR1L) que son de lectura y escritura. Este módulo incrementa su cuenta desde 0x000 hasta 0xFFFF y al desbordarse vuelve a 0x0000. Al presentarse el desborde la bandera de interrupción TMR1IF se pone a 1 y, si está habilitada, la interrupción se presenta.

Este módulo al igual que el Timer 0 puede funcionar en modo temporizador y en modo contador. En modo temporizador el par de registros TMR1 se incrementa en cada ciclo de instrucción, este modo se selecciona poniendo a 0 el bit TMR1CS del registro T1CON. En modo contador el par de registros TMR1 se incrementa en cada flanco ascendente de una señal de reloj externa, este modo se selecciona poniendo a 1 el bit TMR1CS del registro T1CON.

El preescalador del Timer 1 tiene un valor máximo de 8 y se selecciona con los bits T1CKPS1:T1CKPS0 de la siguiente manera:
00 = 1:1
 01 = 1:2
 10 = 1:4
 11 = 1:8
A diferencia del Timer 0, el Timer 1 tiene la posibilidad de activar o detener la cuenta mediante el bit TMR1ON del registro T1CON.

Carga y Temporización

En modo temporizador el Timer 1 incrementa su cuenta en cada ciclo de instrucción. La temporización que se puede obtener con este módulo se obtiene de la siguiente relación:

TempTMR1 = [(65536 - precarga)*PS]*Tinstr

Donde:
precarga = Valor que se le asigna al par de registros TMR1 al comenzar la temporización
PS = Valor del preescalador
Tinstr = 4/frecuencia de oscilación
TempTMR1 = Temporización dada en segundos

La temporización máxima utilizando el oscilador interno del pic 16f628 y el valor más grande de preescalador es:

TempTMR1.Max = [(65536 - 0)*8]*1uS = 524288uS

De modo que la temporización máxima que se puede tener con este temporizador, utilizando el oscilador interno de 4Mhz del pic 16f628,
es de 524.288mS. Con la misma frecuencia de oscilación el Timer 0 solamente podia lograr una temporización de 65.538mS así que con el
Timer 1 se logran temporizaciones de mayor duración. Si se desea obtener una temporización distinta solo se debe escribir en el par de registros TMR1 el valor de la precarga necesaria para la temporización deseada.

precarga = -[([Temporizacion/(4/fosc)])/PS]+65536

Veamos el mismo ejemplo que el del temporizador Timer 0 ahora aplicado al Timer 1: Se desea complementar el valor del puerto B cada 50mS. Se estará revisando que se haya cumplido el tiempo de la temporización checando la bandera TMR1IF. Utilizando la expresión de la precarga y utilizando el preescalador más grande (8) obtenemos el valor que necesitamos cargar al par de registros TMR1 para obtener una temporización de 50mS.

precarga = -[([50mS/(4/fosc)])/8]+65536 = 59286 = 0xE796

Así que para obtener una temporización de 50mS mediante el Timer 1 se debe cargar 0xE7 al registro TMR1h y 0x96 al registro TMR1L. El código del programa sería el siguiente:
INICIO
    bsf     STATUS,RP0
    clrf    TRISB
    bcf     STATUS,RP0
    movlw   b'00110000'
    movwf   T1CON
    clrf    PORTB
    bcf     PIR1,TMR1IF
PRECARGA
    bcf     T1CON,TMR1ON
    movlw   0xE7
    movwf   TMR1H
    movlw   0x96
    movwf   TMR1L
    bsf     T1CON,TMR1ON
ESPERA
    btfss   PIR1,TMR1IF
    goto    ESPERA
    bcf     PIR1,TMR1IF
    comf    PORTB,f
    goto    PRECARGA
La configuración del Timer 1 se realiza mediante las líneas “movlw b’01100000′” y “movwf T1CON“. Mediante estas lineas se configura el timer en modo temporizador (TMR1CS = 0) y se selecciona el preescalador máximo (T1CKPS1:T1CKPS0 = 11). Una vez configurado el timer 1 se limpia el puerto B y la bandera TMR1IF del registro PIR1. Posteriormente se realiza la precarga cargando un 0xE7 al registro TMR1H y un 0x96 al registro TMR1L. Nótese que antes de realizar la carga se detuvo el timer poniendo a 0 el bit TMR1ON, esto se hace para evitar errores al momento de cargar el valor a los registros TMR1, después de realizar la carga se enciende el timer poniendo a 1 el bit TMR1ON y en ese momento la temporización comienza.

Para saber si la temporización terminó se está revisando continuamente la bandera TMR1IF. Mientras esta sea 0 la temporización aún no habrá terminado, cuando la bandera es 1 entonces la temporización finalizó, entonces se borra la bandera TMR1IF, se complementa el puerto B y se vuelve a realizar la precarga. De este modo el programa está complementado el puerto B cada 50mS.

Descargar código: Ejemplo del temporizador Timer 1