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:8A 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:
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
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 PRECARGALa 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
Utiliza nuestro foro de electronica si tienes dudas no relacionadas con este tema.