Professional Documents
Culture Documents
=
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:
prescaler T
Tiempo
al ValorInici
CY
= 256
Para el modo de 8 bits
prescaler T
Tiempo
al ValorInici
CY
= 65536
Para el modo de 16 bits
Temporizadores
Ing. Juan Ramon Terven Salinas
62
Por ejemplo suponga que se necesita producir una interrupcin cada 500ms y T
CY
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:
5 . 23181
256 10 33 . 83
10 500
256
9
3
=
al ValorInici
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:
5 . 42098
256 10 33 . 83
10 500
65536
9
3
=
al ValorInici
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:
H E al ValorInici 5 48 18661
128 10 33 . 83
10 500
65536
9
3
= =
Este resultado ya es positivo, dentro del rango y entero como se buscaba.
Temporizadores
Ing. Juan Ramon Terven Salinas
63
5.2 Uso de Timers en C18
La librera timers.h posee varios mtodos tiles para el manejo de timers, la Tabla
5-1 muestra las funciones disponibles. La x se refiere al nmero 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 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
Ing. Juan Ramon Terven Salinas
64
Figura 5-2. Funcin OpenTimer0 [7]
Temporizadores
Ing. Juan Ramon Terven Salinas
65
Figura 5-3. Funcin WriteTimerx [7]
Temporizadores
Ing. Juan Ramon Terven Salinas
66
Ejemplo 5-1. Uso de Timer0
El siguiente ejemplo muestra como usar el Timer0 para producir una interrupcin
cada 500ms.
Dentro de la rutina de interrupcin 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 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
Ing. Juan Ramon Terven Salinas
67
// 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
Temporizadores
Ing. Juan Ramon Terven Salinas
68
PRCTICA 5. Reloj Digital
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.