Temporizadores
Temporizadores
Temporizadores
CAPTLO 6: TEMPORIZADORES
En muchas aplicaciones el microcontrolador debe trabajar con la variable tiempo. Por
ejemplo, para generar seales de una determinada frecuencia, para medir la duracin de
una seal, o simplemente para llevar la fecha y la hora, as pues el microcontrolador
necesita algn recurso para contar el tiempo con precisin.
El microcontrolador PIC16F877A cuenta con tres mdulos bsicos para temporizar, que se
identifican con los nombres Timer0, Timer1 y Timer2. Adems este microcontrolador
cuenta con mdulos adicionales para temporizar, que amplan las posibilidades de los
mdulos bsicos. Son los denominados mdulos de Comparacin, Captura y Modulacin
Pulsos en Anchura o mdulos CCP (Capture/Compare/PWM), que comparten componentes
y funciones con el Timer1 y el Timer2.
El Timer0 puede trabajar como contador de ciclos de mquina o como contador de pulsos
externos. En el primer caso se dice que el mdulo opera en el modo temporizador (timer) y
los pulsos de reloj que llegan al Timer0 llegan con una frecuencia 4, donde es la
frecuencia del oscilador principal del PIC. Si cuenta pulsos externos, el mdulo opera como
contador (counter). Los pulsos externos llegan por el terminal RA4/T0CKI/C1OUT del
microcontrolador.
A su paso por el Timer0, los pulsos llegan al bloque de sincronizacin. En este bloque, los
pulsos que entran son muestreados en dos instantes de tiempo dentro de cada ciclo de
mquina, de lo que resulta una seal cuyos flancos ocurren en fase con el reloj del
microcontrolador. Con esta seal sincronizada se excita el contador TMR0.
Cuando el Timer0 trabaja en el modo contador, el bloque de sincronizacin determina el
valor mnimo del periodo (o la frecuencia mxima) de los pulsos que entran por el terminal
RA4/T0CKI/C1OUT del microcontrolador. Si es el periodo del oscilador principal del
microcontrolador y es el factor de divisin del pre-divisor, el perodo de los pulsos que
entran por el terminal T0CKI debe cumplir
>
El desbordamiento del Timer0 hace que el indicador TMR0IF (bit 2 del registro INTCON)
pase a 1. Si la atencin al Timer0 se hace usando la tcnica de E/S programada, entonces se
debe consultar el bit TMR0IF para saber si el Timer0 se ha desbordado.
Si la interrupcin del Timer0 est habilitada, lo cual se hace poniendo a 1 el bit TMR0IE (bit
5 del registro INTCON), cuando se desborda el Timer0 se produce una solicitud de
interrupcin.
En el registro OPTION_REG estn los bits de control del Timer0. La fuente de los pulsos de
reloj se selecciona con el bit T0CS. Si se selecciona una fuente de reloj externa en el terminal
RA4/T0CKI/C1OUT, el bit T0SE sirve para hacer que el contador se incremente con los
flancos de subida (con T0SE = 0) o de bajada (con T0SE = 1) de los pulsos en T0CKI.
El Timer0 y el WDT comparten el pre-divisor, en un esquema como el que se muestra en la
figura 4. El pre-divisor, un contador asincrnico ascendente de 8 bits, puede ser asignado al
Timer0 o al WDT. Esta asignacin es excluyente, es decir, si el pre-divisor se asigna al WDT,
el Timer0 no lo puede usar y viceversa. Cuando est asignado al WDT, el pre-divisor funciona
como post-divisor del Perro Guardin.
El pre-divisor se asigna al Timer0 poniendo a 1 el bit PSA (bit 3 del registro OPTION_REG).
Si PSA es puesto a 0, el pre-divisor queda asignado al WDT. El factor de divisin del predivisor asignado al Timer0 se selecciona con los bits PS2, PS1 y PS0 del registro
OPTION_REG.
3
El factor de divisin del pre-divisor asignado al Timer0 puede tomar los valores:
= 2, 4, 8, , 2+1 , , 256
donde = 1, 2, , 7 es el valor situado en los bits PS2:PS0.
Para calcular el tiempo de desbordamiento del Timer0 se puede proceder de la siguiente
forma. Sea la cantidad de pulsos que deben llegar al Timer0 para que se desborde, el
factor de divisin del pre-divisor y el perodo de los pulsos de entrada al pre-divisor. Si el
Timer0 opera como temporizador, entonces es la duracin de un ciclo de mquina ( =
4 ); si opera como contador, es el perodo de los pulsos externos. El tiempo que
tarda en desbordarse el Timer0 es
=
Debe tenerse en cuenta que el valor que se carga en el registro TMR0 es el valor inicial
desde donde el Timer0 empezar la cuenta hasta llegar al valor mximo de 256. Se puede
afirmar que = 256 0 , donde 0 es el valor inicial que se cargar en el registro
TMR0. Por lo tanto, la ecuacin anterior puede reescribirse como
= (256 0 )
Los distintos modos se pueden agrupar mediante el empleo del smbolo |, como se muestra
en el siguiente ejemplo:
setup_timer_0 (RTCC_DIV_2 | RTCC_EXT_L_TO_H)
donde el orden de las posiciones de las etiquetas que estn en parntesis es irrelevante.
El compilador 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:
valor = get_timer0 ( );
valor = entero de 8 bits.
Ejemplo 1: Generar una seal cuadrada de 1 kHz utilizando la interrupcin Timer0 (ver
figura 5). Para visualizar la frecuencia y la seal generada utilice los instrumentos virtuales
OSCILLOSCOPE y COUNTER TIMER ubicados en INSTRUMENTS (
).
Para generar una seal de 1 kHz se necesita un semiperiodo de 500 . Segn la ecuacin
de desbordamiento del registro TMR0, utilizando un cristal de 4 MHz un factor de divisin
de 2 del pre-divisor se tiene:
= (256 0 )
500 = (
4
) 2 (256 0 )
4000000
donde 0 = 6, es decir, se debe cargar el registro TMR0 con el valor de 6. Pero esta
relacin slo se cumple si se trabaja en ensamblador. Al trabajar en C, el compilador genera
lneas de cdigo que aumentan el tiempo de ejecucin del programa y, por ello, es necesario
ajustar el valor final sumndole un valor de 20 o 21. En este caso se ha utilizado un valor de
carga de 26 (0x1A).
PROGRAMA:
El Timer1 puede operar como temporizador (al contar ciclos de mquina) o como contador
(si cuenta pulsos externos). Como contador, el Timer1 puede ser programado para que
trabaje en modo sincronizado o en modo no sincronizado. Para ello se usa el bit
1
del registro T1CON. Si 1 = 0, el Timer1 trabaja como contador sincronizado, pue los
pulsos de entrada al contador TMR1 pasan por el bloque de sincronizacin. En este bloque
se muestrea la seal entrante y se sincroniza con el reloj interno del microcontrolador, de
lo que resulta una seal cuyos flancos ocurren en fase con el reloj principal del PIC. La seal
ya sincronizada excita el contador de 16 bits TMR1, formado por los registros TMR1L y
TMR1H.
Los modos sincronizado y no sincronizado se aplican slo al trabajo del Timer1 como
contador, pues cuando este mdulo opera como temporizador, lo hace obviamente en
modo sincronizado. De hecho, el bit
1 se ignora si el Timer1 se programa como
temporizador con 1 = 0.
Si es el periodo del oscilador principal del microcontrolador y es el factor de divisin
del pre-divisor ( = 1, 2, 4, 8) entonces el perodo de los pulsos en el terminal
RC0/T1OSO/T1CKI debe cumplir
>
= 1), contina
Si el Timer1 est programado como contador no sincronizado (1
operando incluso cuando el microcontrolador est en el modo de bajo consumo. Esta
caracterstica del Timer1 lo hace apropiado para implementar con l un reloj de tiempo real
(RTC: Real Time Clock).
El valor del conteo se puede leer y/o escribir en los registros de funciones especiales TMR1H
y TMR1L. Cuando se escribe en estos registros, la cuenta del pre-divisor va a 0.
En el registro T1CON estn los bits de control del Timer1. La fuente de los pulsos de reloj se
selecciona con el bit TMR1CS y puede ser interna o externa. Si se selecciona el reloj externo,
ste puede ser pulsos que entren por el terminal RC0/T1OSO/T1CKI o tambin puede
colocarse un cristal entre los terminales RC0/T1OSO/T1CKI y RC1/T1OSI/CCP2. El bit
T10SCEN sirve para habilitar el oscilador si se usa un cristal. Con el bit TMR1ON se habilita
el conteo.
9
El valor ( = 0, 1, 2, 3) de los bits T1CKPS1 y T1CKPS0 del registro T1CON fija el factor de
divisin ( = 1, 2, 4, 8 = 2 ) del pre-divisor del Timer1. Por ejemplo, si se quiere un factor
de divisin de 8, hay que poner el valor 3 en los bits mencionados.
El desbordamiento del Timer1 hace que el bit TMR1IF del registro PIR1 pase a 1. Si la
interrupcin del Timer1 est habilitada, lo cual se hace poniendo a 1 el bit TMR1IE registro
PIE1, el desbordamiento genera una interrupcin.
El clculo del tiempo de desbordamiento del Timer1 sigue un razonamiento semejante al
utilizado en el Timer0. Si es la cantidad de pulsos que deben llegar al Timer1 (contador
de 16 bits) para que ste se desborde, el factor de divisin del pre-divisor y el perodo
de los pulsos de entrada al pre-divisor, el tiempo que tarda en desbordarse el Timer1 es
=
Si el Timer1 opera como temporizador, entonces es la duracin de un ciclo de mquina
( = 4 ); si opera como contador, es el perodo de los pulsos externos.
Debe tenerse en cuenta que el valor que se carga en la pareja de registros TMR1L y TMR1H
es el valor inicial desde donde el Timer1 empezar la cuenta hasta llegar al valor mximo
de 65536. Se puede afirmar que = 65536 1 , donde 1 es el valor inicial que
se cargar en los registros TMR1L y TMR1H. Por lo tanto, la ecuacin anterior puede
reescribirse como
= (65536 1 )
Si el Timer1 se deja correr libremente, entonces, de modo natural, = 216 . En este caso,
= 216
10
Ejemplo 2: Generar una funcin que permita realizar retardos de 1 segundo empleando el
temporizador Timer1. Este retardo ser mostrado en un LED conectado al terminal RB1 y se
comprobar dicho valor utilizando el instrumento virtual COUNTER TIMER ubicado en
INSTRUMENTS (
).
11
4
8 (65536 1 )
4000000
donde 1 = 3036, es decir, se debe cargar el registro TMR1 con el valor de 3036
(0xBDC).
Para observar mejor el periodo se va a conectar el terminal RB1 a la entrada CE del
COUNTER TIMER y el modo de funcionamiento se lo coloca en TIME (secs).
12
PROGRAMA:
13
PROGRAMA:
14