Está en la página 1de 9

Timer 1

Es un módulo del microcontrolador que es semejante al TMR0, que a diferencia con este
último este nuevo es un registro de 16 bits.
Pero si nuestros códigos solamente nos permiten manipulación de 8 bits, como funciona con
16?

La respuesta es que este registro se divide en 2 subregistros, donde en uno de ellos se


almacenan los 8 bits menos significativos (LSB) y en el otro los 8 más significativos (MSB).

Entonces para poder cargar un valor al TMR1 hay que cargar los
MSB y LSB en esos dos registros que se encuentran en el Banco
0 del microcontrolador. según su datasheet.

Modos de trabajo

El módulo TMR1 tiene dos modos de trabajo principales. Como TEMPORIZADOR o CONTADOR.
Su configuración y selección dependerá del registro T1CON.

COMO TEMPORIZADOR : El incremento del timer se da por los pulsos brindados del oscilador
de cristal. Para nuestro pic es de 20MHZ. Se usa esta forma para generación de retardos y
tiempos de utilidad.

COMO CONTADOR : Es un contador de 16 bits, El cual su fuente de incremento de cuenta son
los pines RC0 y RC1. Sin embargo esta configuración presenta una característica adicional.

• Contador Síncrono : Es el modo normal del timer 1, por cada pulso de entrada en el
puerto RC0 o RC1 el valor del registro TMR1L incrementará en una unidad. Se dice que es
síncrono; debido a que, el pulso es detectado en un proceso perteneciente a la oscilación del
cristal de nuestro microcontrolador. Por lo que si mandamos nuestro microcontrolador al
modo de bajo consumo ("sleep") ya no podremos incrementar la cuenta hasta que
despertemos al pic.

• Contador Asíncrono: Es un modo del timer 1, que tiene la ventaja de funcionar aún
cuando el microcontrolador haya entrado al modo de bajo consumo ("sleep"). Estando en ese
modo por cada pulso que se le brinde a los pines de entrada el registro TMR1L seguirá
incrementando su cuenta. Podremos ver el valor actual o realizar acciones si despertamos al
pic mediante una interrupción. Entrando en este modo existe una aplicación muy usada
cuando se requiere trabajar con tiempos precisos y relojes digitales. Pues basta con conectar
en los pines RC0 y RC1 un cristal de 32.768KHz con algunas configuraciones para generar un
retardo exacto de 1 segundo.

Configuración del TMR1


Para realizar las configuraciones con los registros involucrados, es necesario observar el
diagrama de bloques.

Timer 1: Diagrama de bloques. Fuente: Datasheet


Timer1bloques.JPG (39.49 KiB) Visto 1731 veces
Se puede observar que el bit "TMR1CS" me seleccionará la fuente de pulsos para incrementar
el timer. Con eso se podrá configurar como contador o temporizador. Para continuar la línea
viene el preescalador que puede ser de utilidad si deseamos valores más grandes. También
hay que ver que el bit "T1SYNC" está en modo negado. Este habilitador permitirá seleccionar
si se va a trabajar en modo síncrono o asíncrono. Y para finalizar nos encontramos con una
compuerta lógica AND. El cual está controlada en su otro bit por "TMR1ON" este último pin me
permitirá habilitar el incremento al TIMER1.

En caso se haya desbordado el Timer1 (el objetivo es ese) se activará la bandera TMR1IF
El circuito es muy sencillo. Los bits de configuración pertenecen al registro T1CON mostrado a
continuación:

Entonces para configurar el Timer1 es necesario brindar valores a cada bit del registro.

• T1CKPS1 : T1CKPS1 -> Son bits de selección del preescalador de los pulsos de


incrementos del TIMER. Hay que seleccionar uno dando valores binarios. Lo que significa que
máximo tendremos 4 escalas.
• T1OSCEN -> Si deseamos conectar un cristal para el trabajo en bajo consumo y la
generación de tiempo preciso. Se puede hablitiar este bit.
1=  El oscilador estará activado
0=  El oscilador estará apagado
• T1SYNC* -> Permite seleccionar el modo de cuenta Síncrono o Asíncrono. Este bit está
negado. Y solamente funciona cuando el bit (TMR1CS =1) de lo contrario el valor de este pin
no se tomará en cuenta.
1=  Modo asíncrono (ya negado)
0=  Modo síncrono (ya negado)
• TMR1CS -> Selecciona la fuente de reloj para el incremento del TMR1. En pocas
palabras este bit me permite escoger entre temporizador o contador.
1=  Timer 1 como contador
0=Timer 1 como temporizador
• TMR1ON -> Habilitador del incremento del timer 1.
1=  Activa el incremento del timer1
0=  Detiene el incremento del timer1

Existen más registros involucrados con el TMR1, que en esta sesión por el momento no las
tocaremos. Sin embargo el faltante en nuestra lista es el.
• TMR1IF-> Es la bandera del timer1 que indica cuando se haya desbordado. Lo que
significa que ha pasado del valor TMR1H d'255' TMR1L d'255' = 65535 a 0. Si ha ocurrido es
necesario borrar el valor por software.
1=  Se ha desbordado el Timer1
0=  No se ha desbordado el Timer1
TIMER 1 COMO CONTADOR

El timer1 puede incrementar su cuenta por cualquiera de los pines RC0 o RC1. Este contador
detectará los flancos de subida.

Sin embargo hay que saber que para que la cuenta empiece el pin RC1 requiere detectar un
"Flanco de Bajada". Una vez que se haya producido este entonces el TMR1 incrementará en 1
con cada flanco de subida realizado.

Encender un led despues de haber presionado 5


veces sobre un pulsador. Usando Timer1
Antes de desarrollar el ejercicio vamos a tener algunas consideraciones.
El pulsador vamos a configurarlo en Pull-Down. Por lo cual el Timer1 nos quitará un
pulso. Para ello lo configuraremos entonces con 4 pulsos requeridos.
Calcularemos el valor del preescaler en la fórmula y además el valor del TMR1

Ya con los valores solamente nos queda configurar el registro T1CON que se encuentra en el
banco 0.
Configuracion timer1. Fuente:Propia
configuracionT1CON.jpg (73.62 KiB) Visto 1730 veces
Hemos configurado con ese valor en el registro T1CON para que nuestro timer1 trabaje como
contador síncrono.
Lo que queda es realizar el programa que detecte el bit TMR1IF del registro PIR1.

CODIGO

;Vamos a encender un led despues de 5 pulsos. Usando el Timer 1


INCLUDE <P16F877A.INC> ;Incluimos los comandos del PIC
LIST P=16F877A ;Incluimos el microprocesador
INCLUDE <mimacro.INC> ;Incluimos la macro
__config 0x3f32 ; Este es un comando de fusibles, lo estudiaremos más
adelante.

ORG 0; ;Empieza la dirección 0 del programa


; T1CON -> | X | X | T1CKPS1 | T1CKPS2 | T10SCEN | T1SYNC | TMR1CS |
TMR1ON |
banco 1 ;Nos dirigimos al banco 1.
BCF TRISD,4 ;Declaramos el pin 4 del puerto D como salida
banco 0 ; Nos dirigimos al banco 0
CLRF PORTD ;Limpiamos todo el puerto D
MOVLW b'00000011' ;Cargamos el valor de la configuración
MOVWF T1CON ;En el registro T1CON.
MOVLW 0XFF ;Cargamos los bits más significativos (MSB) del timer1
MOVWF TMR1H ;En el registro TMR1H
MOVLW 0XFC ;Cargamos los bits menos significativos (LSB) del timer1
MOVWF TMR1L ;En el registro TMR1L

PROGRAMA ;Título del programa para bucle


BTFSS PIR1,TMR1IF ;Detectamos si se ha desbordado el Timer 1
GOTO PROGRAMA ;Caso falso: Seguimos testeando
apagar TMR1IF,PIR1 ;Caso verdadero. Limpiamos la bandera de
desbordamiento del TMR1
encender 4,puertod ; Encendemos el pin 4 del puerto D (led)
GOTO $ ;Realizamos el bucle sobre si mismo

END ; Finaliza el programa


TIMER 1 COMO
TEMPORIZADOR
Mostramos la fórmula para realizar una temporización en el TMR1. Como se da cuenta es tan
similar al TMR0

 Para entender su utilización vamos a resolver un ejemplo sencillo.

Generar un pin intermitente con un retardo de 100ms


usando el TMR1
1: Configuramos el TMR1 como temporizador. TMR1CS=0
2: Calculamos el valor del TMR1
• En caso el valor este fuera de los límites 0 a 65535 tendremos que usar el preescalador
• Seleccionamos el mejor Preescalador posible que lleve el valor del TMR1 dentro del rango
de 0 a 65535

3: Apagamos momentaneamente el timer1. TMR1ON = 0


4: Cuando se calcula el valor queda cargar ese resultado a los registros TMR1H y TMR1L.
5: Encendemos el timer1. TMR1ON = 1 desde ese instante el TMR1 empezará su cuenta
(temporización)

6: Se Testea el bit TMR1IF del registro PIR1 para averiguar si hubo desbordamiento.
7: No olvidar limpiar el bit para realizar el proceso repetidamente.

Realizando el cálculo para obtener los valores de TMR1 y Preescaler


Como ya tenemos de respuesta que usando un preescalador de 8. El timer1 toma un valor
3036 que está dentro del rango de 0 a 65535 por lo tanto es válido.

Lo que queda es convertir ese resultado a hexadecimal. 3036 = 0BDC


(hexadecimal)

Ahora con todos los valores, vamos a cargar la configuración al registro T1CON perteneciente
al TMR1

Con las configuraciones hechas TMR1 como temporizador y preescalador de 8. para poder
llegar a 100ms de retardo con un TMR1=3036 nos queda programar.
CODIGO

;Como queremos un retardo de 100ms


;
; TMR1 = 65536 -( 100 /((4/20000)*pre)

;.....................................................................
......
;Con..
;
; Pre = 8
; TMR1= 3036 --> Convertido a hexadecimal "0BDC"

INCLUDE <P16F877A.INC>
LIST P=16F877A
INCLUDE <mimacro.INC> ;Incluimos la macro
__config 0x3f32 ; Este es un comando de fusibles, lo estudiaremos más
adelante.
ORG 0;
CBLOCK 0x20 ;Como las librerías usan direcciones de memoria es
necesario adjuntar
ENDC ;Estos dos comandos en nuestro código

banco 1 ;Nos vamos al banco 1


BCF TRISB,5 ;Declaramos el pin 5 del puerto B como salida
banco 0 ;Nos vamos al banco 0
CLRF PORTB ;Limpiamos todo el puerto B

; T1CON : | X | X | T1CKPS1 | T1CKPS0 | T1OSCEN | T1SYNC* | TMR1CS |


TMR1ON |

MOVLW b'00110000' ;Cargamos la configuración como temporizador,


preescaler 8
MOVWF T1CON ;al registro de configuración del TMR1

PROGRAMA ;Título del programa


encender 5,puertob ; Encendemos el pin 5 del puerto B
CALL RETARDO100 ; Llamamos a la subrutina de retardo generado por el
TMR1
apagar 5,puertob ; Apagamos el pin 5 del puerto B
CALL RETARDO100 ; Llamamos a la subrutina de retardo generado por el
TMR1
GOTO PROGRAMA ; Vamos al Título (Hacemos el bucle)

RETARDO100 ;Título de la subrutina de retardo


apagar 0,T1CON ;Apagamos el pin T1CON para desactivar el Timer1
MOVLW 0X0B ;Cargamos el primer valor
MOVWF TMR1H ;En el registro de los 8 bits más significativos
MOVLW 0XDC ;Cargamos el segundo valor
MOVWF TMR1L ;En el registro de los 8 bits menos significativos
encender 0,T1CON ;Activamos el TIMER1, empieza la cuenta
(temporización)

COMPROBAR ;Título de subrutina de comprobación


BTFSS PIR1,TMR1IF ; ¿el pin TMR1IF es 1?
GOTO COMPROBAR ; Respuesta falsa, me voy a seguir testeando.
apagar TMR1IF,PIR1 ;Respuesta verdadera, apaga el TMR1
RETURN ;Regreso a donde llamaron.
END

También podría gustarte