Académique Documents
Professionnel Documents
Culture Documents
59
5 TIMERS
Todos los microcontroladores poseen circuitos temporizadores (timers), los cuales son tiles para: Programar tareas con alta precisin. Contar pulsos externos. Medir intervalos de tiempo. etc.
Un timer es bsicamente 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 instruccin 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 caractersticas nicas.
5.1 Timer0
El Timer0 tiene las siguientes caractersticas: Funcionamiento como temporizador o contador de 8 o 16 bits Prescaler de 8 bits Interrupcin por desbordamiento (de FFh a 00h o de FFFFh a 0000h) Seleccin 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.
Temporizadores
60
Cuando hablamos del modo temporizador nos referimos a que medimos el tiempo transcurrido, la formula que determina el tiempo transcurrido es la siguiente:
Temporizadores Tiempo = TCY (256 valorInicial ) prescaler Para el modo de 8 bits. Tiempo = TCY (65536 valorInicial ) prescaler Para el modo de 16 bits.
61
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 instruccin TCY es 1/12x106=83.3333ns y el prescaler es 64, Cunto tiempo tarda el Timer0 en producir una interrupcin?
Tiempo = 1 (256 100) 64 832s 12 10 6
Comnmente el procedimiento es el inverso, nosotros sabemos en cuanto tiempo queremos que se produzca una interrupcin y necesitamos saber el valor inicial del temporizador; en este caso la formula es:
ValorInicial = 256
TCY
Tiempo prescaler
ValorInicial = 65536
TCY
Tiempo prescaler
Temporizadores
62
Por ejemplo suponga que se necesita producir una interrupcin 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
Si el valor sale negativo como en este caso, significa que se requiere ms prescaler o bien usar el timer en modo de 16 bits. En este ejemplo como el prescaler usado es el mximo, entonces nuestra nica opcin es usar el timer en modo 16 bits: 500 10 3 = 42098.5 83.33 10 9 256
ValorInicial = 65536
Ya obtuvimos un valor positivo y dentro del rango de 16 bits (0 a 65535), sin embargo si queremos una mejor precisin, nuestro calculo debe ser un valor entero. Probemos con prescaler de 128: 500 10 3 = 18661 = 48E 5 H 83.33 10 9 128
ValorInicial = 65536
Temporizadores
63
La Figura 5-2 muestra la funcin OpenTimer0, la cual se usa para configurar y habilitar el Timer0. La Figura 5-3 muestra la funcin WriteTimerx, con la cual podemos escribir el valor inicial al Timer usado. La funcin ReadTimerx no toma argumentos y regresa el valor actual del timer x. La funcin CloseTimerx deshabilita el timer indicado.
Temporizadores
64
Temporizadores
65
Temporizadores
66
/* Uso del Timer0 * * Se programa el Timer0 para producir una interrupcin cada 500ms */ #include <p18cxxx.h> #include <timers.h> #include <delays.h> // Prototipos de rutina de interrupcin void rsi_tmr0(void); //Cdigo para bootloader extern void _startup (void); #pragma code REMAPPED_RESET_VECTOR = 0x1000 void _reset (void) { _asm goto _startup _endasm } // Seccin de cdigo #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); // Habilitacin global de interrupciones INTCONbits.GIE = 1; while(1) { } }
Temporizadores
// Vector de Interrupcin 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 interrupcin INTCONbits.TMR0IF = 0; } Programa 5-1. Ejemplo uso de Timer0
67
Temporizadores
68
Disee 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).
Revisin: El reloj se dejar funcionando 2 horas, por cada segundo que se desfase con respecto al reloj de revisin disminuye un punto el valor de la prctica.
Punto Extra en calificacin parcial: Usar un teclado matricial en lugar de los 3 botones; para permitir cambiar las HH, MM o SS usando las teclas numricas.