Vous êtes sur la page 1sur 10

6- Timers

Ing. Juan Ramon Terven Salinas 113


6 TIMERS

Los Timers son usados para generar eventos de interrupcin con gran precisin de
tiempo. Tambien se pueden usar para contar pulsos externos o medir la duracin de
eventos externos.
La familia PIC32MX posee 2 tipos de Timers, tipo A y tipo B. El
PIC32MX534F064H posee 5 timers, de los cuales el Timer1 es tipo A y los dems son
tipo B.

Caractersticas Comunes de los Timers
Todos los Timers comparten las siguientes caractersticas:
Temporizador/Contador de 16 bits.
Fuente de reloj interna o externa seleccionable por software.
Generacin de interrupcin programable.
Contador de pulsos externos cerrado (para medir duracin de eventos
externos).

Timers Tipo A
La mayora de los PIC32MX poseen por lo menos un Timer tipo A, el cual usualmente
es el Timer1.
Este Timer es distinto de los dems en las siguientes caractersticas:
Puede operar de una fuente de reloj secundario.
Puede operar de modo asncrono usando una fuente de reloj externa.
Puede operar mientras el CPU est en modo SLEEP.
Tiene prescalers de 1:1, 1:8, 1:64 y 1:256.
No soporta modo de 32 bits.

Las caractersticas del Timer tipo A lo hacen idneo para ser usado en aplicaciones
de RTC. Sin embargo si se desea realizar una aplicacin con RTC se recomienda usar el
6- Timers
Ing. Juan Ramon Terven Salinas 114
mdulo RTCC que poseen los PIC32MX. La Figura 6-1 muestra el diagrama a bloques
de un timer Tipo A.

Figura 6-1. Timer tipo A [9]
Timers Tipo B
Los timers tipo B tienen las siguientes caractersticas:
Se pueden combinar para formar un Timer de 32 bits.
Tienen prescaler de 1:1, 1:2, 1:4, 1:8, 1:16, 1:32, 1:64 y 1:256.
Puede ser disparados por un evento de ADC.

La Figura 6-2 muestra el diagrama a bloques de un Timer tipo B, la Figura 6-3 muestra
el diagrama a bloques de un Timer tipo B en modo de 32 bits.

6- Timers
Ing. Juan Ramon Terven Salinas 115

Figura 6-2. Timer tipo B [9]


Figura 6-3. Timer tipo B de 32 bits [9]

6- Timers
Ing. Juan Ramon Terven Salinas 116
Timer1
El Timer1 es tipo A, este puede funcionar como:
Contador de reloj (PBCLK) de 16 bits (temporizador de 16 bits).
Contador de pulsos externos sncronos (pin T1CK) de 16 bits.
Contador de pulsos externos asincronos de 16 bits.
Temporizador cerrado de 16 bits.

Timer1 como contador de reloj de 16 bits (temporizador)
En este modo de funcionamiento, el Timer1 cuenta los ciclos de reloj PBCLK desde
0000 hasta PR1. Cuando el valor del Timer1 (TMR1) es igual a PR1 puede generar una
interrupcin (si est habilitada la interrupcin) y reinicia el conteo.
El valor del registro de perior PR1 se puede calcular con la siguiente formula:
PSF T
Duracion
PR
PBCLK

= 1

Donde:
Duracion = duracin en segundos del conteo.
T
PBCLK
= Periodo de PBCLK
PSF = prescaler.

Esta formula tambien se puede expresar como:
IPS PSF
PBCLK
PR

= 1

Donde:
PBCLK = frecuencia del PBCLK (SYSCLK/PBDIV)
PSF = prescaler
IPS = interrupciones por segundo

Hay que tener en cuenta que el valor de PR1 no debe ser mayor que 65535 y los valores
de prescaler vlidos son: 1, 8, 64 y 256.
6- Timers
Ing. Juan Ramon Terven Salinas 117
Ejemplo 1. Timer 1 como temporizador de 16 bits
Este ejemplo usa el Timer1 para generar 10 interrupciones por segundo, en la cual
simplemente se invierte el estado del bit RD6.

Programa 6-1. Uso de Timer1 como temporizador de 16 bits
/*
EJEMPLO TIMER1
DEMOSTRACIN DE TIMER1
GENERA 10 INTERRUPCIONES POR SEGUNDO
*/
#include <p32xxxx.h>
#include <plib.h>

//Bits de configuracion
#pragma config POSCMOD = HS, FNOSC = PRIPLL, FPLLMUL = MUL_20
#pragma config FPLLIDIV = DIV_2, FPLLODIV = DIV_1
#pragma config FPBDIV = DIV_1, FWDTEN = OFF, UPLLEN = ON
#pragma config UPLLIDIV = DIV_2, FVBUSONIO = ON, FUSBIDIO = ON
#pragma config FSOSCEN = OFF, CP = OFF, FCKSM = CSECMD

//Parmametros a considerar para la duracion del Timer
//SYS_FREQ (80000000L)
//PB_DIV 1
//PRESCALER 256
//DURACION (seg) 0.1 //duracin del timer
//Valor calculador para periodo
//T1_TICK DURACION/(PBCLOCK x PRESCALER)
#define T1_TICK 31250

int main(void)
{
AD1PCFG = 0xFFFF; // configura AN pins como digitales
_TRISD6=0; // pin RD6 como salida

//Activa Timer 1
OpenTimer1(T1_ON | T1_SOURCE_INT | T1_PS_1_256, T1_TICK);

//Ajusta la interrupcin de Timer1 con prioridad de 2
IPC1bits.T1IP = 2; //prioridad 2
IPC1bits.T1IS = 1; //subprioridad 1
IFS0bits.T1IF = 0; //Limpia la bandera de interrupcion
// Activa el modo MultiVectored
INTEnableSystemMultiVectoredInt();
IEC0bits.T1IE = 1; //Activa la interrupcion T1

while(1);
}

//RUTINA DE INTERRUPCIN DE TIMER1
//Parpadea el LED conectado en RD6
void __ISR(_TIMER_1_VECTOR, ipl2) Timer1Handler(void)
{
_LATD6 = 1 - _LATD6;

//Limpia la bandera de interrupcion del Timer1
IFS0bits.T1IF = 0;
}
6- Timers
Ing. Juan Ramon Terven Salinas 118

En el programa anterior se us la funcin OpenTimer1 para configurar el Timer1.
La descripcin de esta funcin la encontramos en la librera de perifricos (ver tema
Libreras de C32 pag 62), se invita al estudiante que consulte esta librera.
Para saber mas sobre el funcionamiento del Timer1 consulte: Microchip. PIC32 Family
Reference Manual. Section 14.Timers, DS61105D, Microchip Technology Inc. 2008.

Timer de 32 bits
Para generar un Timer de 32 bits necesitamos 2 Timers tipo B de 16 bits. Se pueden
usar los pares Timer2 con Timer3 o Timer4 con Timer5.
El periodo del Timer esta formado por los 2 registros de periodo. Por ejemplo si se usa
el conjunto de Timer2 con Timer3 (Timer23) PR2 contiene los 16 bits LSB y PR3
contiene los 16 bits MSB.
La librera plib.h contiene funciones para activar Timers de 32 bits. Dichas funciones
son:
void OpenTimer23(unsigned int config, unsigned int period)
void OpenTimer45(unsigned int config, unsigned int period)
La interrupcin generada por el Timer de 32 bits es generada por el Segundo Timer, en
el caso del Timer23 la interrupcin la genera el Timer3 y en el caso del Timer45, la
interrupcin la genera el Timer5. Por lo tanto debemos configurar solamente la
interrupcin del segundo Timer.

El siguiente ejemplo muestra el uso del Timer23 para lograr una interrupcin cada
segundo.



6- Timers
Ing. Juan Ramon Terven Salinas 119
Ejemplo 2. Timer de 32 bits
Este ejemplo genera un interrupcin cada segundo usando un Timer de 32 bits formado
por el Timer2 y el Timer3

Programa 6-2. Uso de Timer23
/*
EJEMPLO TIMER DE 32 BITS
GENERA 1 INTERRUPCIN CADA SEGUNDO
*/
#include <p32xxxx.h>
#include <plib.h>

//Bits de configuracion
#pragma config POSCMOD = HS, FNOSC = PRIPLL, FPLLMUL = MUL_20
#pragma config FPLLIDIV = DIV_2, FPLLODIV = DIV_1
#pragma config FPBDIV = DIV_1, FWDTEN = OFF, UPLLEN = ON
#pragma config UPLLIDIV = DIV_2, FVBUSONIO = ON, FUSBIDIO = ON
#pragma config FSOSCEN = OFF, CP = OFF, FCKSM = CSECMD

//Parmametros a considerar para la duracion del Timer
//SYS_FREQ (80000000L)
//PB_DIV 1
//PRESCALER 256
//DURACION 1 //duracion en segundos
//T32_TICK DURACION/(1/((SYS_FREQ/PB_DIV))*PRESCALE)
#define T32_TICK 312500 //Valor para duracion de 1 segundo

int main(void)
{
AD1PCFG = 0xFFFF; // configura AN pins como digitales
_TRISD6=0; // pin RD6 como salida

//Activa Timer 2-3 para 32 bits
OpenTimer23(T2_ON | T2_PS_1_256, T32_TICK);

//Ajusta la interrupcin de Timer3 con prioridad de 2
IPC3bits.T3IP = 2; //prioridad 2
IPC3bits.T3IS = 1; //subprioridad 1
IFS0bits.T3IF = 0; //Limpia la bandera de interrupcion
// Activa el modo MultiVectored
INTEnableSystemMultiVectoredInt();
IEC0bits.T3IE = 1; //Activa la interrupcion T3

while(1);
}

//RUTINA DE INTERRUPCIN DE TIMER3
//Parpadea el LED conectado en RD6
void __ISR(_TIMER_3_VECTOR, ipl2) Timer3Handler(void)
{
_LATD6 = 1 - _LATD6;

//Limpia la bandera de interrupcion del Timer3
IFS0bits.T3IF = 0;
}

6- Timers
Ing. Juan Ramon Terven Salinas 120
Core Timer de 32 bits
Ademas de los Timers 1,2,3,4 y 5, todos los PIC32 tienen un Timer denominado
Core Timer. Este Timer es nico en el sentido de que est dentro del ncleo MIPS y es
comn en toda la familia PIC32MX.
El Core Timer es de 32 bits y es alimentado del reloj del sistema (SYSCLK) en
lugar del PBCLK y tiene un prescaler fijo de 1:2.
Por ejemplo si el PIC32MX est operando a 80MHz, el Core Timer no provee un
intervalo cercano a 110 segundos con una resolucin de 25nS.
La frmula del periodo del Core Timer est dada por:
2
1

=
SYSCLK
T
Duracion
PR

Otra diferencia del Core Timer con respecto a los dems Timers es que el valor del
periodo debe actualizarse en cada interrupcin.

La librera plib.h contiene funciones para activar el Core Timer y actualiza su valor.
Dichas funciones son:
void OpenCoreTimer(unsigned int period)
void UpdateCoreTimer(unsigned int period)

6- Timers
Ing. Juan Ramon Terven Salinas 121
Ejemplo 3. Uso del Core Timer
El siguiente ejemplo demuestra el uso del Core Timer para generar una interrupcin
cada 0.5 segundos.

Programa 6-3. Uso del Core Timer
/*
EJEMPLO DE CORE-TIMER
GENERA 1 INTERRUPCIN CADA MEDIO SEGUNDO
*/
#include <p32xxxx.h>
#include <plib.h>

//Bits de configuracion
#pragma config POSCMOD = HS, FNOSC = PRIPLL, FPLLMUL = MUL_20
#pragma config FPLLIDIV = DIV_2, FPLLODIV = DIV_1
#pragma config FPBDIV = DIV_1, FWDTEN = OFF, UPLLEN = ON
#pragma config UPLLIDIV = DIV_2, FVBUSONIO = ON, FUSBIDIO = ON
#pragma config FSOSCEN = OFF, CP = OFF, FCKSM = CSECMD

//Parmametros a considerar para la duracion del Core Timer
//SYS_FREQ (80000000L)/2
//DURACION 0.5 //duracion en segundos
//CORE_TICK DURACION/(2/SYS_FREQ)
#define CORE_TICK 0x1312D00 //Valor para duracion de 0.5 segundos

int main(void)
{
AD1PCFG = 0xFFFF; // configura AN pins como digitales
_TRISD6=0; // pin RD6 como salida

//Activa core-Timer
OpenCoreTimer(CORE_TICK);

//Ajusta la interrupcin del Core Timer (CT) con prioridad de 4
IPC0bits.CTIP = 4; //prioridad 4
IPC0bits.CTIS = 1; //subprioridad 1
IFS0bits.CTIF = 0; //Limpia la bandera de interrupcion
// Activa el modo MultiVectored
INTEnableSystemMultiVectoredInt();
IEC0bits.CTIE = 1; //Activa la interrupcion CT

while(1);
}

//RUTINA DE INTERRUPCIN DE CORE-TIMER
//Parpadea el LED conectado en RD6
void __ISR(_CORE_TIMER_VECTOR, ipl4) CoreTimerHandler(void)
{
_LATD6 = 1 - _LATD6;

//Reinicia el CoreTimer
UpdateCoreTimer(CORE_TICK);
//Limpia la bandera de interrupcion del Core Timer
IFS0bits.CTIF = 0;
}

6- Timers
Ing. Juan Ramon Terven Salinas 122
PRCTICA 5. Generador de pulsos
Disee un generador de pulsos cuadrados en un rango de 0Hz a 100kHz.
La frecuencia deseada debe introducirse con el teclado matricial y al pulsar la tecla # el
microcontrolador genera el pulso por el pin RF1, en el cual se conectar un osciloscopio
para medir la frecuencia generada.
Use un Timer de 32 bits para generar la base de tiempo del generador de tonos.

Figura 6-4. Circuito para generador de tonos

Vous aimerez peut-être aussi