Вы находитесь на странице: 1из 14

CAPTULO 6: Las Interrupciones y 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.

6.1. LOS TEMPORIZADORES EN EL PIC16F877A


Cada uno de los temporizadores disponibles en el PIC16F877A tiene como elemento
esencial un contador sincrnico ascendente de 8 o 16 bits. Estos contadores se pueden
programar para contar pulsos internos o externos, segn se expondr ms adelante al
estudiar cada temporizador por separado. El nmero almacenado en cada contador (valor
de la cuenta) se puede leer o modificar mediante la lectura o escritura de registros de
funciones especiales asociados al temporizador en cuestin. El desbordamiento de los
contadores queda reportado en bits indicadores disponibles en esos registros, y puede
generar tambin una solicitud de interrupcin al microcontrolador. La figura 1 muestra el
esquema general de los mdulos para temporizar Timer0, Timer1 y Timer2, cuyas
principales caractersticas se resumen en la Tabla1.

Figura 1: Esquema de bloques general de los temporizadores del PIC16F877A.

Los temporizadores pueden disponer de un contador asincrnico auxiliar. Este contador


auxiliar se inserta en el camino de los pulsos, antes del contador principal, en cuyo caso
funciona como un pre-divisor (prescaler) o despus del contador principal, funcionando
entonces como post-divisor (postscaler). Los temporizadores Timer0 y Timer1 tienen
solamente un pre-divisor; el Timer2, en cambio, dispone de un pre-divisor y un post-divisor.
1

CAPTULO 6: Las Interrupciones y Temporizadores

Tabla 1: Caracterstica principales de los temporizadores del PIC16F877A.

6.1.1. EL MDULO TIMER0


El mdulo Timer0 consta bsicamente de un pre-divisor y un contador ascendente de 8 bits
(figura 2). El pre-divisor es un contador asincrnico ascendente con factor de divisin
programable cuyo conteo no es visible para el programador. El contador ascendente de 8
bits se puede leer o escribir a travs del registro de funciones especiales TMR0.

Figura 2: Diagrama de bloques del Timer0.

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
>

CAPTULO 6: Las Interrupciones y Temporizadores

donde = 1 si no se usa el pre-divisor y = 2, 4, , 256 si se usa.


Hay tres registros de funciones especiales asociados al Timer0: TMR0, OPTION_REG e
INTCON. La figura 3 muestra los nombres de los bits de los registros OPTION_REG e INTCON.
El registro TMR0 almacena el valor que tiene el contador del Timer0. Este valor se puede
leer o escribir en cualquier momento desde el programa que ejecuta el microcontrolador.
Cuando se escribe un valor en TMR0, la cuenta del pre-divisor, si est asignado al Timer0,
se pone a 0. Adems, una escritura en el registro TMR0 inhibe el conteo del Timer0 durante
dos ciclos de mquina.

Figura 3: Registros de funciones especiales OPTION_REG e INTCON.

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

CAPTULO 6: Las Interrupciones y Temporizadores

Figura 4: El pre-divisor se puede asignar al Timer0 o al Perro Guardin (WDT).

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 )

6.1.2. EL MDULO TIMER0 EN C


La funcin para configurar el Timer0 es:
setup_timer_0 (modo);
donde modo est definido en el fichero de cabecera (afecta a los bits 5:0 del registro
OPTION_REG):
4

CAPTULO 6: Las Interrupciones y Temporizadores

Tabla 2: Posibles valores que se pueden colocar en modo.

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.

CAPTULO 6: Las Interrupciones y Temporizadores

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 (

).

Figura 5: Circuito para generar la seal de 1 KHz del ejemplo 1.

CAPTULO 6: Las Interrupciones y Temporizadores

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 compilador se encarga al entrar en la interrupcin de habilitar la interrupcin por


desbordamiento del Timer0 (TMR0IE = 1) y al salir de borrar el bit indicador (TMR0IF = 0),
por lo que no es necesario hacerlo por programa.
Se puede observar la seal con el osciloscopio digital y activando los cursores en el men
de Trigger (figura 6) y la medida es de 1000 ms.
7

CAPTULO 6: Las Interrupciones y Temporizadores

Figura 6: Seal cuadrada capturada por el osciloscopio digital.

6.1.3. EL MDULO TIMER1


El Timer1 es un segundo mdulo disponible para procesos de temporizacin en el
PIC16F877A y su estructura se muestra en la figura 7. Costa fundamentalmente de un
contador ascendente de 16 bits precedido por un pre-divisor programable con factor de
divisin de 1, 2, 4 u 8.

Figura 7: Diagrama de bloques del Timer1.

CAPTULO 6: Las Interrupciones y Temporizadores

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.

Figura 8: T1CON, registro de control del Timer1.

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

CAPTULO 6: Las Interrupciones y Temporizadores

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

6.1.4. EL MDULO TIMER1 EN C


La configuracin del mdulo Timer1 en el compilador de C se realiza a travs de la funcin:
setup_timer_1 (modo);
Donde modo est definido en el fichero de cabecera (afecta a los bits 5:0 del registro
T1CON). En la tabla 3 se pueden observar las posibles alternativas que se pueden colocar
en modo.
Los distintos modos se pueden agrupar mediante el empleo del smbolo |.

10

CAPTULO 6: Las Interrupciones y Temporizadores

Tabla 3: Posibles valores que se pueden colocar en modo.

La lectura y escritura en el registro TMR1 se realiza a travs de las siguientes funciones:


valor = get_timer1 ( );
set_timer1 (valor);
donde valor es un entero de 16 bits.

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

CAPTULO 6: Las Interrupciones y Temporizadores

Figura 8: Circuito para visualizar y medir el retardo de 1 segundo del ejemplo 2.

Se calcula un periodo de 0.5 segundos y se repite dos veces. Segn la ecuacin de


desbordamiento del registro TMR1, utilizando un cristal con = 4 , un factor de
divisin de 8 del pre-divisor se tiene:
= (65536 1 )
0.5 =

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

CAPTULO 6: Las Interrupciones y Temporizadores

PROGRAMA:

Tambin se podra realizar sin interrupciones, esperando a que el registro TMR1 se


desbordase.

13

CAPTULO 6: Las Interrupciones y Temporizadores

PROGRAMA:

14

Вам также может понравиться