Está en la página 1de 13

26/4/2020 El TMR1 (Contador o Temporizador de 16 bits) - Foro

 Enlaces rápidos  FAQ  Registrarse  Identificarse

 ÍNDICE GENERAL  INGENIERÍA LIBRE  SISTEMAS DIGITALES II 

El TMR1 (Contador o Temporizador de 16 bits)


RESPONDER  Buscar este tema…   1 mensaje • Página 1 de 1

rodrigoxbg
Administrador

#1 » Lun Sep 03, 2018 6:03 pm

En esta sesión 15 vamos a hablar del Timer 1. Que en sí, hace lo mismo que el TMR0

Como lo dicho anteriormente. Este módulo es similar al Timer 0 en sus funciones. Y a su misma manera se tiene que
configurar para hacerlo trabajar como contador o temporizador. Sin embargo esté Timer trabaja con 16 bits ; pero,
si nuestras instrucciones y registros solo nos permiten manipular 8 bits...

Como se hace para configurarlo?

▼ OCULTAR SPOILER: EL TMR1

El 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).

Registro TMR1. Fuente propia.


img1.JPG (15.83 KiB) Visto 2291 veces
https://www.rodrigocarita.com/foro.html 1/13
26/4/2020 El TMR1 (Contador o Temporizador de 16 bits) - Foro
g J G ( 5 83 ) sto 9 eces
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.

Registro TMR1L y TMR1H. Fuente: Datasheet 16f877a


tmr1-reg.JPG (42.88 KiB) Visto 2291 veces

Modos de trabajo

Timer 1: Modos de trabajo. Fuente: Propia


tmr1-modos.JPG (22.68 KiB) Visto 2285 veces
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


https://www.rodrigocarita.com/foro.html 2/13
26/4/2020
g
El TMR1 (Contador o Temporizador de 16 bits) - Foro

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 2285 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:

T1CON registro. Fuente: Datasheet


T1CON.JPG (23.15 KiB) Visto 2285 veces
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.

Timer1 escalas. Fuente: Datasheet


timer1-escalas.JPG (15.44 KiB) Visto 2285 veces
• 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
https://www.rodrigocarita.com/foro.html 3/13
26/4/2020 El TMR1 (Contador o Temporizador de 16 bits) - Foro
p g
• 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

Timer1-Registros. Fuente: Datasheet


TMR1registros..JPG (66.99 KiB) Visto 2285 veces

▼ OCULTAR SPOILER: TIMER 1 CONTADOR

Fórmula Timer 1 contador. Fuente:Datasheet


timer1cont.JPG (16.01 KiB) Visto 2284 veces
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.

https://www.rodrigocarita.com/foro.html 4/13
26/4/2020 El TMR1 (Contador o Temporizador de 16 bits) - Foro

Timer 1. Flanco de bajada. Fuente: Datasheet


flanco.png (21.79 KiB) Visto 2284 veces
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

Valores pree. TMR1. Fuente: Propia


ejercicio1tmr1.JPG (16.21 KiB) Visto 2284 veces
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 2284 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.

El código

CÓDIGO: SELECCIONAR TODO

Vamos a encende n led desp es de 5 p lsos Usando el Time 1


https://www.rodrigocarita.com/foro.html 5/13
26/4/2020 El TMR1 (Contador o Temporizador de 16 bits) - Foro
;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


La simulación

Contador 5 pulsos con timer1. Fuente: Propia


s15-ejercicio1.gif (53.02 KiB) Visto 2284 veces

▼ OCULTAR SPOILER: TIMER1 TEMPORIZADOR

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

https://www.rodrigocarita.com/foro.html 6/13
26/4/2020 El TMR1 (Contador o Temporizador de 16 bits) - Foro

Fórmula Timer1 temporizador: Fuente propia


timer1temp.JPG (20.59 KiB) Visto 2269 veces
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

Cálculos Timer1 temporizador: Fuente propia


calculotmr1.JPG (44.67 KiB) Visto 2267 veces
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)

https://www.rodrigocarita.com/foro.html 7/13
26/4/2020 El TMR1 (Contador o Temporizador de 16 bits) - Foro

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

Carga timer1 temporizador: Fuente propia


configuracionT1CONtemp.jpg (71.79 KiB) Visto 2267 veces
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.

El código
CÓDIGO: SELECCIONAR TODO

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


https://www.rodrigocarita.com/foro.html 8/13
26/4/2020 El TMR1 (Contador o Temporizador de 16 bits) - Foro
CO O ; tu o de sub ut a de co p obac ó
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

La simulación

Conexion pic osciloscopio: Fuente propia


tmr1tempsimu2.JPG (43.35 KiB) Visto 2267 veces

100ms de retardo timer1: Fuente propia


tmr1tempsimu.JPG (35.04 KiB) Visto 2267 veces
https://www.rodrigocarita.com/foro.html 9/13
26/4/2020 El TMR1 (Contador o Temporizador de 16 bits) - Foro
t te ps u J G (35 0 ) sto 6 eces

El videotutorial
▼ OCULTAR SPOILER: YOUTUBE

Realizar un tren de pulsos con periodo 116 ms y un dutty de 50%.


Con un periodo de 116ms y el dutty cicle al 50% quiere decir que 58ms se mantendrá en estado alto y 58ms en estado
bajo.
De la misma manera realizamos los cálculos para obtener el valor del tmr1
Elemento Adicional: Mostrar

Desafio
Realizar un contador regresivo programable sin tecla de interrupción. Con dos
pulsadores uno para subir la cuenta y otro para iniciarla. Cuando la cuenta
llegue a "0" Encender un Led durante 5 segundos.
Como la función de un cronómetro vamos a mostar el valor en un dígito de las milésimas, por lo tanto podremos
generar un retardo de 100ms con el Timer 1.

Los cálculos

;Como queremos un retardo de 100 ms


; TMR1 = 65536 -( 100 /((4/20000)*pre)
;Con..
; Pre = 8
; TMR1= 3036 --> Convertido a hexadecimal "0BDC"

El Código
https://www.rodrigocarita.com/foro.html 10/13
26/4/2020 El TMR1 (Contador o Temporizador de 16 bits) - Foro
l Cód go
CÓDIGO: SELECCIONAR TODO

; --------- www.rodrigocarita.com -----------


;El proyecto genera un activador de temporización programable mediante
;2 pulsadores. 1 para aumentar la cuenta en 5 y otro para iniciarla
;El valor se muestra en una pantalla LCD 16x2
;al finalizar la cuenta se encenderá un led durante 5 segundos.
;//////////////////////////////////////////////////////////////////////////////
;/////////////////////////////////////////////////////////////////////////////
;Como queremos un retardo de 100 ms
;
; 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.

#DEFINE BTNAUMENTAR PORTB,3 ;Definimos un comando en una palabra


#DEFINE BTNCOMENZAR PORTB,2 ;Definimos un comando en una palabra

ORG 0;
CBLOCK 0x20 ;Como las librerías usan direcciones de memoria es necesario adjuntar
La simulación

Pic16f877a timer1 cuenta regresiva: Fuente Propia


cuentaregresiva.gif (38.83 KiB) Visto 2245 veces
La implementación

https://www.rodrigocarita.com/foro.html 11/13
26/4/2020 El TMR1 (Contador o Temporizador de 16 bits) - Foro

Pic16f877a Timer1 Cuenta regresiva: Fuente propia


cuentaregresiva2.gif (9.13 MiB) Visto 2244 veces

ADJUNTOS

Tmr1-Cronom.X.rar
(90.7 KiB) Descargado 139 veces

tmr1-ejemplo1.X.rar
(52.4 KiB) Descargado 124 veces

No cobramos por el material, no te llenamos de publicidad, los archivos tienen enlaces directos.
Ponemos mucho esfuerzo en cada tema publicado, ¿Te gustaría apoyarnos y seguir motivándonos con una pequeña donación?

1 mensaje • Página 1 de 1
RESPONDER 

 Volver a “Sistemas Digitales II”

IR A 

 Índice general  Contáctenos  Borrar todas las cookies del Sitio • Todos los horarios son UTC-05:00

Desarrollado por phpBB® Forum Software © phpBB Limited


Traducción al español por phpBB España

IDENTIFICARSE • REGISTRARSE

NOMBRE DE USUARIO:

CONTRASEÑA:

Olvidé mi contraseña

Recordar
Ocultar mi estado de conexión en esta sesión

Identificarse

https://www.rodrigocarita.com/foro.html 12/13
26/4/2020 El TMR1 (Contador o Temporizador de 16 bits) - Foro

https://www.rodrigocarita.com/foro.html 13/13

También podría gustarte