Vous êtes sur la page 1sur 46

Manejo de

Temporizadores
Mdulo
Mdulo
Mdulo

Timer
Timer
Timer

0
1
2

(TMR0)
(TMR1)
(TMR2)

COMPETENCIA
El alumno comprender los principales
elementos que conforman la estructura interna
del reloj o temporizador TMR0, TMR1 y TMR2
del PIC16F877. Analizar su principio de
funcionamiento y la funcin del preescalador.

JUSTIFICACIN
Las operaciones de pausas, sincronizacin
de tiempo de ejecucin y lapsos de tiempo
son uno de los criterios necesarios al
momento de realizar implantaciones sobre
los sistemas basados en microcontroladores.

TMR0

Qu tiene de especial?
Es un contador de 8 bits.
Se puede leer para saber cual es valor actual de las cuentas o puede ser escrito
Reloj Externo
Reloj Interno
para colocar un valor inicial.
terminal RA4/TOCK1
Posee un bloque de preescalamiento que permite ampliar el rango de las
cuentas. Contador de
eventos
Genera una
seal de interrupcin cuando se produce un desborde en el registro
TMR0 (cuando pasa de 0xFF a 00). Bit T0IF del registro INTCON

Temporizador

Cmo manejo el
TMR0?
Para manejar el TMR0 se debe configurar el registro

OPTION_REG en el banco 1 del condigo de programacin

Configuracin del OPTION_REG

bit 5 T0CS: Bit selector de fuente para el TMR0


bit 4 T0SE:Bit selector de flanco

1 = Incrementa en flanco de bajada en pin T0CKI


0 = Incrementa en flanco de subida en pin T0CKI

1 = Prescaler apagado
0 = Prescaler es asignado al modulo TMR0
PS2:PS0: Bits selectores relacion de trabajo

bit 3 PSA: Bits de asignacin del preescaler


bit 2-0

1 = Clock externo, pin RA4/T0CKI


0 =Clock interno(CLKOUT)

TMR0
COMO CONTADOR
DE
EVENTOS

Ejercicio:
Disear un programa en el PIC16F877 para contar eventos con flancos de
bajada en RA4/T0CKI y mostrar la cuenta en el puerto B.
Solucin: configurar el registro OPTION_REG en funcin al ejercicio propuesto
1

Por tanto:
OPTION_REG = 1111 1000

Cdigo del programa:


list p=16f877
;Comando que indica el Pic usado
include "p16f877.inc"
;Etiquetas genricas para el Pic16F877
org 0x00
nop
_inicio
Bsf
Bcf

;Inicio del programa en la posicin cero de


;memoria
;Libre (uso del debugger)

STATUS,RP0
STATUS,RP1

;Ir banco 1

Movlw
b'00000110
;PA como entrada digital
Movwf
ADCON1
Movlw
0xFF
Movwf
TRISA
;PA entrada
Clrf TRISB
;PB salida
OPTION_REG = 1111 1000
movlw
;Valor a escribir en el registro de configuracin
b'11111000'
;del TMR0
movwf
OPTION_REG
;Configuracion del TMRO
bcf
bcf

STATUS,RP0
STATUS,RP1

clrf
BUCLE
movf
movwf
goto
END

TMR0
TMR0,W
PORTB
BUCLE

;Ir banco 0
;TMR0=0 inicializamos el contador en cero
;W=TMR0
;Escribe el valor de TMR0 en PORTB
;Salta a la etiqueta bucle

Ejercicios propuestos:
Disear un programa en el PIC16F877 para contar eventos con flancos
de subida en RA4/T0CKI con un preescalamiento de 1:2. Mostrar la
cuenta en el puerto B.
Disear un programa en base al PIC16F877 que rote un bit a la
izquierda del puerto B cada vez que ocurra cuatro eventos (flancos de
bajada en RA4/T0CKI).
Disear un programa en base al PIC16F877 para contar eventos
(flancos de bajada en RA4/T0CKI) y mostrar la cuenta en un display de
7 segmentos conectado al puerto B. Cuando las cuentas llegan a 9 pasan
de nuevo a 0.
Disear un programa en base al PIC16F877 para contar eventos
(flancos de bajada en RA4/T0CKI) y mostrar la cuenta en tres displays
de 7 segmentos.

TMR0
COMO
TEMPORIZADOR

Ejercicio:
Programar el TMR0 para generar un retardo de un segundo. A partir del cual
un LED conectado al PORTC debe apagarse y prenderse indefinidamente.
Debe permanecer un segundo en cada estado.
Solucin: configurar el registro OPTION_REG en funcin al ejercicio propuesto y
establecer el retardo.

Para generar retardos es necesario usar el modulo TMR0 como


temporizador por lo tanto es necesario colocar el bit T0CS a 0
Un ciclo de instruccin = 4*Tosc ( donde Tosc es el inverso de la
frecuencia del clock que usa el PIC)

Retardo_T0= 4*Tosc* TMR0


El tiempo mximo sera: Retardo_T0 =4*Tosc*256
de 4MHz, tendriamos: 256 us.

Si el cristal usado es

Si usamos el preescaler con un valor de 256.

Retardo_T0_Pre= 4*Tosc*TMR0*Preescaler.

Retardo_T0_Pre= 4.0.25us*256*256 =65536 us =65.536 ms


No alcanza a un segundo. Pero podramos lograr retardos mayores usando
bucles:
Retardo=Bucle*Retardo_T0_Pre
Retardo=Bucle*65,536ms
Como el Retardo debe ser 1seg
1000ms =Bucle*65,536
Bucle=15.25

Por tanto no existe una sino mltiples soluciones considerando este


ltimo punto y la frmula :

Retardo= 4*Tosc*TMR0*Preescaler*Bucle

Por tanto:
OPTION_REG = 1100 0110

Cdigo del programa:

list p=16f877
;Comando que indica el Pic usado
include "p16f877.inc" ;Etiquetas genricas para el Pic16F877
CONTA
EQU 0x20
;Variable CONTA en direccin 0x20 hexadecimal de
;memoria RAM
org 0x00
;Inicio del programa en la posicin cero de
;memoria
nop
;Libre (uso del debugger)
_inicio
bsf STATUS,RP0
;Ir banco 1
bcf STATUS,RP1
clrf
movlw
movwf

TRISB
;PORTB
salida
OPTION_REG
= 1100 0110
b'11000110
;Configuracin del modulo TMR0
OPTION_REG
;Preescaler = 128

bcf STATUS,RP0
bcf STATUS,RP1
clrf
_bucle
bsf
call
bcf
call
goto

PORTB

;Ir banco 0
;PORTB = 0

PORTB,0
_retardo ;Llama la rutina de retardo
PORTB,0
_retardo
_bucle
;Ir _bucle

Sub-rutina de retardo

_retardo
movlw
movwf
_espera1
clrf
movlw
movwf
_espera
btfss
goto
decfsz
goto
return

d'64'
CONTA

;T = 4 * Tosc * Valor de TMR0 * Preescaler


;Cargar el valor de CONTA para 1 segundo

INTCON
d'134'
TMR0

;Deshabilitar interrupciones
;Cargar el valor de TMR0 para 122 cuentas
;(Complemento)

INTCON,T0IF
_espera
CONTA,F
_espera1

;Esperar desborde del TMR0


;Decrementar el registro CONTA hasta cero
;Si no es cero: ir a _espera1

;retorno de call

END

Cuando se produce un desborde en el registro TMR0


(cuando pasa de 0xFF a 00) el Bit T0IF del registro
INTCON se pone en 1

Ejercicios:
Programar el TMR0 para generar un retardo de un segundo. A
partir del cual se incrementa un contador cuyo valor se muestra
por el PORTC.
Programar el TMR0 para generar un retardo de 500 ms. Cada
vez que concluya el tiempo se activar el PORTC de forma
escalonada.
Programar el TMR0 para generar un la palabra HOLA, letra por
letra, con un retardo de 0,25 segundos en un display de 7
segmentos conectado al PORTC

TIMER0 en C
La funcin para configurara el TMR0 es:

setup_timer_0 (mode)
Parameters:
mode may be one or two of the constants defined in the
devices .h file.
RTCC_INTERNAL, RTCC_EXT_L_TO_H or RTCC_EXT_H_TO_L
RTCC_DIV_2, RTCC_DIV_4, RTCC_DIV_8, RTCC_DIV_16,
RTCC_DIV_32,
RTCC_DIV_64, RTCC_DIV_128, RTCC_DIV_256
PIC18XXX only: RTCC_OFF, RTCC_8_BIT
One constant may be used from each group or'ed together with the |
operator.
setup_timer_0 (RTCC_DIV_2|RTCC_EXT_L_TO_H);

TIMER0 en C
El compilador de C suministra una serie de funciones
para leer o escribir en el TIMER0.

Para escribir un valor en el registro TMR0:


set_timer0 (valor);

// valor=entero de 8 bits.

Para leer el valor actual del registro TMR0:


valor=get_timer0 ();

// valor=entero de 8 bits.

TIMER0 en C
Ejemplo:
Utilizando la interrupcin del TMR0, generar una seal cuadrada de
1KHz
Solucin:
1 KHz tiene un periodo T= 1 ms, por tanto el tiempo alto de la seal
cuadrada ser de 0,5 ms o 500us. Si se usa un cristal de 4 MHz y un
prescaler de 2 se tiene la siguiente ecuacin de desbordamiento:
Retardo_T0_Pre= 4*Tosc*(256-TMR0)*Preescaler
500us=1us *(256-TMR0)*2
TMR0=6

TIMER0 en C

TMR1

TMR1
El TMR1 Tiene 16 bits distribuidos
registros, el TMR1L y el TMR1H.

en

dos

Cuenta desde 0000h hasta FFFFh, si desborda se


activa el bit TMR1IF en el registro PIR1.
El TMR1 se configura en el
registro

banco 0

usando el

T1CON.

Tiene
tres
Temporizador,
Asncrono.

formas
Contador

de
funcionamiento:
Sncrono y Contador

T1CON

El bit de desborde del TMR1 es el TMR1IF ubicado en


el registro P1RI.
Para configurar el TMR1 primero se debe
deshabilitar el TMR0 colocando OPTION_REG=
10000000 en el banco 1.

0 0

El retardo esta dado por:

Retardo=
4*Tosc*TMR1*Preescaler
Ejemplo:
si sabemos que el cristal es de 4 MHz,

el
pre-escalamiento es de 1 a 8 y usamos el TMR1
completo. Entonces el retardo es:
Retardo = 4 * 0.25us *65536*8= 0.524288 s

Ejemplo: realizar una subrutina con retardo de 0.524288


segundos utilizando el TMR1.
Solucin:
Primero deshabilitamos el TMR0 en el banco 1.
movlw b'10000000'
movwf OPTION_REG

ndo configuramos el TMR1 en el registro T1CON en el banco


vlw
b'00110000'
vwf
T1CON

Tercero y ltimo paso realizamos la rutina de


retardo.
retardo
bcf P1RI,TMR1IF
clrf TMR1L
clrf TMR1H
bsf T1CON,TMR1ON
esperar
btfss
P1RI,TMR1IF
goto esperar
bcf T1CON,TMR1ON
return

TIMER1 en C
La funcin para configurara el TMR1 es:

setup_timer_1 (mode)
Parameters:
mode values may be:
T1_DISABLED, T1_INTERNAL, T1_EXTERNAL,
T1_EXTERNAL_SYNC
T1_CLK_OUT
T1_DIV_BY_1, T1_DIV_BY_2, T1_DIV_BY_4, T1_DIV_BY_8
constants from different groups may be or'ed together with |.
setup_timer_1 ( T1_DISABLED );
setup_timer_1 ( T1_INTERNAL | T1_DIV_BY_4 );
setup_timer_1 ( T1_INTERNAL | T1_DIV_BY_8 );

TIMER1 en C
El compilador de C suministra una serie de funciones
para leer o escribir en el TIMER1.

Para escribir un valor en el registro TMR1:


set_timer1 (valor);

// valor=entero de 16 bits.

Para leer el valor actual del registro TMR1:


valor=get_timer1 ();

// valor=entero de 16 bits.

TIMER1 en C
Ejemplo:
Utilizando la interrupcin del TMR1, para generar un retardo de 1
segundo
Solucin:
Se busca el periodo parcial de 0,5 s y se repite dos veces. Si se usa
un cristal de 4 MHz y un prescaler de 8 se tiene la siguiente
ecuacin de desbordamiento:
Retardo= 4*Tosc*(65536-TMR1)*Preescaler
0,5s=1us *(65536-TMR1)*8
TMR1=3036

TIMER1 en C

TMR2

TMR2 es un temporizador de 8 bits con un prescaler (divisor de


frecuencia previo), un registro de periodo (PR2) que marca el valor mximo
que puede alcanzar la cuenta de TMR2 y un postscaler (contador de
coincidencias entre TMR2 y PR2)
El registro TMR2 se puede leer y escribir desde el ncleo del
microcontrolador. TMR2 puede trabajar como temporizador pero no como
contador de flancos externos
El contador TMR2 puede contar desde 0x00 hasta el valor cargado en
PR2, en el ciclo siguiente al de esa coincidencia, el contador vuelve a cero
El TMR2 tambin se puede utilizar para generar una seal de reloj para
transferencias serie sncronas mediante el puerto serie sncrono (SSP)
El TMR2 se emplea adems como base de tiempos para los mdulos CCP
cuando se configuran en modo PWM (vanse mdulos CCP).

Diagrama de bloques del TEMPORIZADOR


TMR2

T2CON: REGISTRO DE CONTROL DEL TIMER


2

bit 7 No implementado: Se lee como 0


bit 6:3 TOUTPS3:TOUTPS0: bits de seleccin del postscaler del
Timer2
0000= 1:1 Postscale
0001= 1:2 Postscale

1111= 1:16 Postscale


bit2TMR2ON: Bitde paro/arranque del TMR2
1 = Timer2 on
0 = Timer2 of
bit 1:0 T2CKPS1:T2CKPS0: Bits de seleccin de prescaler del
Timer2
00= Prescaler is 1
01= Prescaler is 4

Clculo de la temporizacin con TMR2

Operacin con Temporizador TMR2


En el caso de TMR0 y TMR1 era necesario precargar un valor de partida en la
cuenta y el flag correspondiente se activaba al desbordar el contador, esto
obligaba a volver a precargar de nuevo el contador para iniciar una nueva
temporizacin. En el caso de TMR2, la cuenta va desde 0x00 hasta el valor de
PR2 y en el ciclo siguiente el contador vuelve a cero por hardware, con lo cual no es
necesario precargar por software ningn valor peridicamente y las
temporizaciones tendrn una duracin fija mientras no se modifique el registro de
periodo (PR2). No obstante, tambin sera posible precargar un valor en TMR2
aunque no ser lo habitual ms que en el principio de todo el proceso.
El flag TMR2IF se pondr a 1 cuando produzca un nmero de coincidencias entre
TMR2 y PR2 igual al valor establecido para el postscaler.
Si usamos el prescaler y el postscaler con su valor mximo, el tiempo de
rebosamiento mximo del postscaler (overflow) sera:
(4/fosc)*(Prescaler mximo)*256* (Postscaler mximo) = (4/fosc) * 16*256*16
= (4/fosc) * 65536
que supondra un valor de temporizacin mximo igual que el que se puede conseguir
con el temporizador TMR0 pero inferior al mximo alcanzable con TMR1

EJEMPLO DE CONFIGURACIN DEL TIMER 2


Realizar un retarde de 20ms usando el TMR2
-Calculamos los valores a cargar
-Pre=16, PR2=124 y Pos=10
-Retardo=16*(124+1)*10*1us=20ms
PASOS
-En el banco 1 se carga el valor de PR2
movlw.124
movwfPR2
-En el banco 0 se carga los valores de configuracin el T2CON

0
1
movlw
movwf

0
1

0x4B
T2CON

-Realizamos la subrutina de retardo:


Retardo
clrf
TMR2
bcf PIR1, TMR2IF
bsf T2CON, TMR2ON
Espera
btfss
PIR1, TMR2IF
goto
Espera
bcf T2CON, TMR2ON
return

TIMER2 en C
La funcin para configurara el TMR12es:

setup_timer_2
Parameters:(mode,period,postscale)
mode values may be: T2_DISABLED, T2_DIV_BY_1,
T2_DIV_BY_4, T2_DIV_BY_16

period is a int 0-255 that determines when the clock value is


reset,
postscale is a number 1-16 that determines how many timer
overflows before an interrupt: (1 means once, 2 means twice,
and so on).
setup_timer_2 ( T2_DIV_BY_4, 0xc0, 2);

TIMER2 en C
El compilador de C suministra una serie de funciones
para leer o escribir en el TIMER2.

Para escribir un valor en el registro TMR2:


set_timer2 (valor);

// valor=entero de 8 bits.

Para leer el valor actual del registro TMR2:


valor=get_timer2 ();

// valor=entero de 8 bits.

TIMER2 en C
Ejemplo:
Utilizando la interrupcin del TMR2, generar una seal cuadrada de
1KHz.
Solucin:
1 KHz tiene un periodo T= 1 ms, por tanto el tiempo alto de la seal
cuadrada ser de 0,5 ms o 500us. Si se usa un cristal de 4 MHz, un
prescaler de 4 y postscaler de 1 se tiene la siguiente ecuacin de
desbordamiento:
Retardo= 4Tosc*Preescaler *(PR2+1)*postscaler
500us=1us *4*(PR2+1)*1
PR2=124

TIMER2 en C

FIN