3.5 Temporizador TIMER1
El módulo del temporizador Timer1 es un temporizador/contador de 16 bits, lo que significa que consiste en dos registros (TMR1L y TMR1H). Puede contar hasta 65535 pulsos en un solo ciclo, o sea, antes de que el conteo se inicie desde cero.
Similar al temporizador Timer0, estos registros se pueden leer o se puede escribir en ellos en cualquier momento. En caso de que ocurra un desbordamiento, se genera una interrupción si está habilitada.
El módulo del temporizador Timer1 puede funcionar en uno o dos modos básicos, eso es como un temporizador o como un contador. A diferencia del temporizador Timer0, cada uno de estos dos modos tiene funciones adicionales.
El temporizador Timer1 tiene las siguientes características:
- Temporizador/contador de 16 bits compuesto por un par de registros;
- Fuente de reloj interna o externa programable;
- Pre-escalador de 3 bits;
- Oscilador LP opcional;
- Funcionamiento síncrono o asíncrono;
- Compuerta para controlar el temporizador Timer1 (conteo habilitado) por medio del comparador o por el pin T1G;
- Interrupción por desbordamiento;
- “Despierta” al microcontrolador (salida del modo de reposo) por desbordamiento (reloj externo); y
- Fuente de reloj para la función de Captura/Comparación.
Esquema simplificado del temporizador Timer1
SELECCIÓN DE LA FUENTE DE RELOJ DEL TEMPORIZADOR TIMER1
El bit TMR1CS del registro T1CON se utiliza para seleccionar la fuente de reloj para este temporizador:
FUENTE DE RELOJ |
TMR1CS |
Fosc/4 |
0 |
pin T1CKI |
1 |
Al seleccionar la fuente de reloj interna, el par de registros TMR1H-TMR1L será incrementado con varios pulsos Fosc como es determinado por el pre-escalador.
Al seleccionar la fuente de reloj externa, este temporizador puede funcionar como un temporizador o un contador. Los pulsos en el modo temporizador pueden estar sincronizados con el reloj interno del microcontrolador o funcionar asíncronamente.
PRE-ESCALADOR DEL TEMPORIZADOR TIMER1
El temporizador Timer1 tiene un escalador completamente separado que permite dividir la frecuencia de entrada de reloj por 1, 2, 4 o 8. No es posible leer el pre-escalador o escribir en él directamente. De todas formas, el contador del pre-escalador se pone a 0 automáticamente después de escribir en los registros TMR1H o TMR1L.
OSCILADOR DEL TIMER1
Los pines RC0/T1OSO y RC1/T1OSI se utilizan para registrar los pulsos que vienen de los dispositivos periféricos, pero también tienen una función adicional. Como se puede ver en la siguiente figura, se configuran simultáneamente como entrada (pin RC1) y salida (pin RC0) del oscilador de cuarzo LP (Low Power - de bajo consumo) adicional. Este circuito está principalmente diseñado para funcionar a bajas frecuencias (hasta 200 KHz), exactamente para el uso de cristal de cuarzo de 32.768 KHz. Este cristal se utiliza en los relojes de cristal puesto que es fácil de obtener un pulso de duración de un segundo al dividir esta frecuencia. Como el oscilador no depende del reloj interno, puede funcionar incluso en el modo de reposo. Se habilita al poner a uno el bit de control T1OSCEN del registro T1CON. El usuario debe proporcionar tiempo muerto por medio de software (unos pocos milisegundos) para habilitar que el oscilador se inicie apropiadamente.
La siguiente tabla muestra los valores recomendados de los capacitores convenientes con el oscilador de cuarzo. No es necesario que estos valores sean exactos. De todas formas, la regla general es: cuánto más alta sea la capacidad, tanto más alta será la estabilidad, lo que a la vez prolonga el tiempo necesario para la estabilización del oscilador.
OSCILADOR |
FRECUENCIA |
C1 |
C2 |
LP |
32 kHz |
33 pF |
33 pF |
100 kHz |
15 pF |
15 pF |
200 kHz |
15 pF |
15 pF |
El consumo de corriente del microcontrolador se reduce a nivel más bajo en el modo de reposo ya que el consumidor de corriente principal - el oscilador - no funciona. Es fácil de poner al microcontrolador en este modo - al ejecutar la instrucción SLEEP. El problema es cómo despertar al microcontrolador, o sea cómo generar una interrupción para “despertarlo”. Como el microcontrolador “duerme”, se debe usar una interrupción causada por dispositivos periféricos para despertarlo. Se pone muy complicado si es necesario despertar al microcontrolador a intervalos de tiempo regulares...
Para resolver el problema, un oscilador de cuarzo LP (de bajo consumo de corriente) completamente independiente, capaz de funcionar en el modo de reposo, está integrado en el microcontrolador PIC16F887. Simplemente, un circuito anteriormente separado ahora está integrado en el microcontrolador y asignado al temporizador Timer1. El oscilador está habilitado al poner a 1 el bit T1OSCEN del registro T1CON. El bit TMR1CS del mismo re-gistro se utiliza para habilitar que el temporizador Timer1 utilice secuencias de pulsos de ese oscilador.
- Una señal generada por este oscilador de cuarzo está sincronizada con el reloj del microcontrolador al poner a 0 el bit T1SYNC. En este caso, el temporizador no puede funcionar en modo de reposo porque el circuito para sincronización utiliza el reloj del microcontrolador.
- La interrupción por desbordamiento en el registro del temporizador Timer1 puede estar habilitada. Si el bit T1SYNC se pone a 1, tales interrupciones se producirán en el modo de reposo también.
COMPUERTA DEL TEMPORIZADOR TIMER1
El pin TG1 o la salida del comparador C2 pueden ser una fuente de los pulsos que pasan por la compuerta del temporizador Timer1. Se configuran por software. Esta compuerta permite que el temporizador mida directamente la duración de los eventos externos al utilizar el pin T1G o las señales analógicas al utilizar la salida del comparador C2. Refiérase a la Figura en la página 163. Para medir duración de señal, basta con habilitar esta compuerta y contar los pulsos en el registro TMR1.
TIMER1 EN EL MODO CONTADOR
El temporizador Timer1 se pone a funcionar como un contador al poner a 1 el bit TMR1CS. Este bit cuenta los pulsos llevados al pin PC0/T1CKI y se incrementa en el flanco ascendente de la entrada del reloj externo T1CKI. Si el bit de control T1SYNC del registro T1CON se pone a 0, las entradas del reloj externo se sincronizarán antes de llegar al par del registro TMR1. En otras palabras, el temporizador Timer1 se sincroniza con el reloj interno del microcontrolador y se le denomina contador síncrono.
Al poner en modo de reposo el microcontrolador que funciona en el modo contador, los registros del temporizador TMR1H y TMR1L no serán incrementados aunque los pulsos de reloj aparezcan en los pines de entrada. Como el reloj interno del microcontrolador no funciona en este modo, no hay entradas de reloj que se utilicen para la sincronización. De todas formas, el pre-escalador sigue funcionando siempre que haya pulsos de reloj en los pines, porque es un simple divisor de frecuencias.
Este contador detecta un uno lógico (1) en los pines de entrada. Cabe destacar que al menos un flanco ascendente debe ser detectado antes de empezar a contar los pulsos. Refiérase a la Figura a la izquierda. Las flechas en la figura indican los incrementos del contador.
TIMER1 EN EL MODO TEMPORIZADOR
Para seleccionar este modo, es necesario poner a 0 el bit TMR1CS. Después de eso, el re-gistro de 16 bits será incrementado con cada pulso generado por el oscilador interno. Si se utiliza el cristal de cuarzo de 4 MHZ, el registro será incrementado cada microsegundo.
En este modo, el bit T1SYNC no afecta al temporizador porque cuenta los pulsos de reloj interno. Como todos los dispositivos utilizan estos pulsos, no hace falta sincronizarlos.
El oscilador de reloj del microcontrolador no funciona durante el modo de reposo así que el desbordamiento en el registro del temporizador no puede causar interrupción en este modo.
Vamos a hacerlo en mikroBasic...
' En este ejemplo, el Timer1 está configurado como un temporizador con el valor del
' pre-escalador 1:8. Cada vez que ocurra un desbordamiento de los registros TMR1H
' y TMR1L, se solicitará una interrupción.
main:
...
PIR1.TMR1IF = 0 ' Poner a 0 la bandera de bit del TMR1IF
TMR1H = 0x22 ' Poner el valor inicial para el temporizador Timer1
TMR1L = 0x00
T1CON.TMR1CS = 0 ' Timer1 cuenta los pulsos del oscilador interno
T1CON.T1CKPS0 = 1 ' El valor del pre-escalador asignada es 1:8
T1CON.T1CKPS1 = 1
PIE1.TMR1IE = 1 ' Interrupción habilitada por desbordamiento
INTCON = 0xC0 ' Interrupción habilitada (bits GIE y PEIE)
T1CON.TMR1ON = 1 ' Encender el temporizador Timer1
...
Registro T1CON
Los bits del registro T1CON están en control del funcionamiento del temporizador Timer1.
T1GINV - (Bit inversor de la compuerta del temporizador1) se comporta como un inversor del estado lógico en la compuerta formada por el pin T1G o la salida (C2OUT) del comparador C2. Este bit habilita al temporizador para contar los pulsos cuando la compuerta esté a alto o a bajo.
- 1 - Temporizador 1 cuenta los pulsos cuando el pin T1G o el bit C2OUT estén a alto (1).
- 0 - Temporizador 1 cuenta los pulsos cuando el pin T1G o el bit C2OUT estén a bajo (0).
TMR1GE - (Bit de habilitación de la compuerta del temporizador Timer1) determina si la compuerta formada por el pin T1G o salida del comparador C2 (C2OUT) estará activa o no. Este bit es funcional sólo en caso de que el temporizador Timer1 esté encendido (el bit TMR1ON = 1). De lo contrario, este bit se ignora.
- 1 - Temporizador Timer1 está encendido sólo si la compuerta no está activa.
- 0 - Compuerta no afecta al temporizador Timer1.
T1CKPS1, T1CKPS0 - (Bits de selección del pre-escalador de señal de reloj del Temporizador1) determina el valor del divisor de frecuencias asignada al temporizador Timer1.
T1CKPS1 |
T1CKPS0 |
VALOR DEL PRE-ESCALADOR
|
0 |
0 |
1:1 |
0 |
1 |
1:2 |
1 |
0 |
1:4 |
1 |
1 |
1:8 |
T1OSCEN - (bit de habilitación del oscilador LP del Timer1)
- 1 - Oscilador LP está habilitado para el reloj del Timer1 (oscilador de bajo consumo y de frecuencia de 32.768 kHz).
- 0 - Oscilador LP está apagado.
T1SYNC - (Bit de control de sincronización de la señal de entrada) habilita la sincronización de la entrada del oscilador LP o de la entrada del pin T1CKI con el reloj interno del microcontrolador. Este bit se ignora al contar los pulsos desde el oscilador principal (el bit TMR1CS = 0).
- 1 - Entrada de reloj externa no está sincronizada.
- 0 - Entrada de reloj externa está sincronizada.
TMR1CS - (bit de selección de la fuente de reloj del temporizador Timer1)
- 1 - Cuenta los pulsos por el pin T1CKI (por el flanco ascendente 0-1)
- 0 - Cuenta los pulsos del reloj interno del microcontrolador
TMR1ON - (TMR activo, hace entrar o no en funcionamiento el Timer1).
- 1 - Habilita el temporizador Timer1.
- 0 - Deshabilita el temporizador Timer1.
En breve
Para utilizar el Timer1 apropiadamente, es necesario hacer lo siguiente:
- Como no es posible apagar el pre-escalador, su valor debe estar ajustado a los bits T1CKPS1 y T1CKPS0 del registro T1CON (Refiérase a la tabla anterior).
- Seleccionar el modo por el bit TMR1CS del registro T1CON. TMR1CS: 0= la fuente de reloj es oscilador de cuarzo interno, 1= la fuente de reloj es oscilador de cuarzo externo.
- Al configurar el bit T1OSCEN del mismo registro, el oscilador está habilitado y los registros TMR1H y TMR1L se incrementan con cada pulso de reloj. Al poner este bit a 0, se detiene el conteo.
- Al reiniciar los registros del contador o al escribir en ellos, se reinicia el pre-escalador.
- Al llenar ambos registros del temporizador, la bandera TMR1IF se pone a uno y el conteo empieza desde cero.