PIC32 07 Timers
PIC32 07 Timers
PIC32 07 Timers
= 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