5 TIMERS

Anuncio
Temporizadores
59
5 TIMERS
Todos los microcontroladores poseen circuitos temporizadores (timers), los cuales
son útiles para:
•
•
•
•
Programar tareas con alta precisión.
Contar pulsos externos.
Medir intervalos de tiempo.
etc.
Un timer es básicamente un contador el cual lo podemos habilitar para que cuente tiempo
transcurrido o que cuente pulsos externos, se le llamada temporizador cuando cuenta
ciclos de instrucción y se le llama contador cuando cuenta pulsos externos.
La familia PIC18 USB posee 4 timers: Timer0, Timer1, Timer2 y Timer3, cada uno
de los cuales tiene sus características únicas.
5.1 Timer0
El Timer0 tiene las siguientes características:
•
Funcionamiento como temporizador o contador de 8 o 16 bits
•
Prescaler de 8 bits
•
Interrupción por desbordamiento (de FFh a 00h o de FFFFh a 0000h)
•
Selección de flanco para pulsos externos
En la Figura 5-1 se muestra un diagrama simplificado del Timer0 en modo de 8 bits y en
modo de 16 bits.
Ing. Juan Ramon Terven Salinas
Temporizadores
60
Figura 5-1. Timer0 [8]
5.1.1 Timer0 como temporizador de 8 o 16 bits
Cuando se configura el Timer0 como temporizador, se dedica a contar los periodos
de instrucción (Tcy) y una vez que el contador se desborda se activa una bandera llamada
T0IF y opcionalmente se activa una interrupción. De esta manera podemos programar
rutinas con gran precisión.
Cuando hablamos del modo temporizador nos referimos a que medimos el tiempo
transcurrido, la formula que determina el tiempo transcurrido es la siguiente:
Ing. Juan Ramon Terven Salinas
Temporizadores
61
Tiempo = TCY × (256 − valorInicial ) × prescaler
Para el modo de 8 bits.
Tiempo = TCY × (65536 − valorInicial ) × prescaler
Para el modo de 16 bits.
Donde el prescaler puede ser un valor de 1, 2, 4, 8, 16, 32, 64, 128 o 256.
Por ejemplo supongamos que el valor inicial del contador en modo de 8 bits es 100 y
el periodo del ciclo de instrucción TCY es 1/12x106=83.3333…ns y el prescaler es 64,
¿Cuánto tiempo tarda el Timer0 en producir una interrupción?
Tiempo =
1
× (256 − 100) × 64 ≈ 832µs
12 × 10 6
Comúnmente el procedimiento es el inverso, nosotros sabemos en cuanto tiempo
queremos que se produzca una interrupción y necesitamos saber el valor inicial del
temporizador; en este caso la formula es:
ValorInicial = 256 −
TCY
Tiempo
× prescaler
Para el modo de 8 bits
ValorInicial = 65536 −
TCY
Tiempo
× prescaler
Para el modo de 16 bits
Ing. Juan Ramon Terven Salinas
Temporizadores
62
Por ejemplo suponga que se necesita producir una interrupción cada 500ms y TCY es
83.33ns, ¿Qué prescaler y que valor inicial debe tener el temporizador para que se
desborde en el tiempo deseado?
Lo que debemos hacer es escoger un valor para el prescaler y sustituir en la formula.
Usemos primeramente un valor de 256 para el prescaler y el timer en modo de 8 bits:
ValorInicial = 256 −
500 × 10 −3
= −23181.5
83.33 × 10 −9 × 256
Si el valor sale negativo como en este caso, significa que se requiere más prescaler o
bien usar el timer en modo de 16 bits. En este ejemplo como el prescaler usado es el
máximo, entonces nuestra única opción es usar el timer en modo 16 bits:
ValorInicial = 65536 −
500 × 10 −3
= 42098.5
83.33 × 10 −9 × 256
Ya obtuvimos un valor positivo y dentro del rango de 16 bits (0 a 65535), sin
embargo si queremos una mejor precisión, nuestro calculo debe ser un valor entero.
Probemos con prescaler de 128:
ValorInicial = 65536 −
500 × 10 −3
= 18661 = 48E 5 H
83.33 × 10 −9 × 128
Este resultado ya es positivo, dentro del rango y entero como se buscaba.
Ing. Juan Ramon Terven Salinas
Temporizadores
63
5.2 Uso de Timers en C18
La librería timers.h posee varios métodos útiles para el manejo de timers, la Tabla
5-1 muestra las funciones disponibles. La x se refiere al número de timer, en la familia
PIC18 USB puede ser un valor de 0 a 3.
Tabla 5-1. Funciones de timers.h [7]
La Figura 5-2 muestra la función OpenTimer0, la cual se usa para configurar y
habilitar el Timer0.
La Figura 5-3 muestra la función WriteTimerx, con la cual podemos escribir el valor
inicial al Timer usado.
La función ReadTimerx no toma argumentos y regresa el valor actual del timer x.
La función CloseTimerx deshabilita el timer indicado.
Ing. Juan Ramon Terven Salinas
Temporizadores
64
Figura 5-2. Función OpenTimer0 [7]
Ing. Juan Ramon Terven Salinas
Temporizadores
65
Figura 5-3. Función WriteTimerx [7]
Ing. Juan Ramon Terven Salinas
Temporizadores
66
Ejemplo 5-1. Uso de Timer0
El siguiente ejemplo muestra como usar el Timer0 para producir una interrupción
cada 500ms.
Dentro de la rutina de interrupción del Timer se cambia el estado de un bit.
Usando el mismo circuito anterior, escriba, compile y prueba el siguiente programa.
/* Uso del Timer0
*
* Se programa el Timer0 para producir una interrupción cada 500ms
*/
#include <p18cxxx.h>
#include <timers.h>
#include <delays.h>
// Prototipos de rutina de interrupción
void rsi_tmr0(void);
//Código para bootloader
extern void _startup (void);
#pragma code REMAPPED_RESET_VECTOR = 0x1000
void _reset (void)
{
_asm goto _startup _endasm
}
// Sección de código
#pragma code
void main()
{
// PORTA como salida
TRISA = 0;
// Configura pines como digitales
ADCON1 |= 0x0f;
PORTA = 0;
// Activa timer0 de 16 bits, conteo de Tcy con prescaler de 1:128
OpenTimer0 (TIMER_INT_ON & T0_SOURCE_INT & T0_16BIT & T0_PS_1_128);
WriteTimer0(0x48E6);
// Habilitación global de interrupciones
INTCONbits.GIE = 1;
while(1)
{
}
}
Ing. Juan Ramon Terven Salinas
Temporizadores
67
// Vector de Interrupción modo compatibilidad
#pragma code high_vector=0x1008
void high_interrupt (void)
{
_asm GOTO rsi_tmr0 _endasm
}
#pragma code
/****** RSI de TIMER0 *****/
#pragma interrupt rsi_tmr0
void rsi_tmr0 (void)
{
// Invierte bit RA0
LATAbits.LATA0 ^= 1;
// Reinicia el Timer0
WriteTimer0(0x48E6);
// Limpia la bandera de interrupción
INTCONbits.TMR0IF = 0;
}
Programa 5-1. Ejemplo uso de Timer0
Ing. Juan Ramon Terven Salinas
Temporizadores
68
PRÁCTICA 5. Reloj Digital
Diseñe un Reloj Digital usando el Timer0 para generar la base de tiempos.
El reloj mostrará: HH:MM:SS
El sistema tendrá 3 botones:
Boton 1: Activa cambio de hora con Boton 2 y Boton 3. Al pulsarse una vez
parpadean los segundos, al pulsarse otra vez parpadean los minutos, al
pulsarse otra vez parpadean las horas. Si se pulsa otra vez dejan de
parpadear y se desactivan los cambios con Boton 2 y Boton 3.
Boton 2: Aumenta segundos, minutos u horas (el que esté parpadeando).
El cambio de segundos y minutos va de 0 a 59.
El cambio de horas va de 0 a 23.
Boton 3: Disminuye segundos, minutos u horas (el que esté parpadeando).
Revisión:
El reloj se dejará funcionando 2 horas, por cada segundo que se desfase con
respecto al reloj de revisión disminuye un punto el valor de la práctica.
Punto Extra en calificación parcial:
Usar un teclado matricial en lugar de los 3 botones; para permitir cambiar las
HH, MM o SS usando las teclas numéricas.
Ing. Juan Ramon Terven Salinas
Descargar