Anda di halaman 1dari 8

INTERRUPCIONES

Fuera de lazo main, en la parte donde declaramos variables debemos poner el puntero de
nuestras interrupciones.

Interrupcin Puntero IER PIEIER1.bit.INTxN


TIMER0 __interrupt void M_INT1 7
cpu_timer0_isr(void);
TIMER1 __interrupt void M_INT13 -
cpu_timer1_isr(void);
TIMER2 __interrupt void M_INT14 -
cpu_timer3_isr(void);
ADCA1 __interrupt void adca1_isr(void); M_INT1 1
ADCB1 __interrupt void adcb1_isr(void); M_INT1 2
ADCC1 __interrupt void adcc1_isr(void); M_INT1 3
ADCD1 __interrupt void adcd1_isr(void); M_INT1 6

Antes de configurar nuestro programa con interrupciones en el lazo de configuracin main


deben estar las siguientes lneas de comandos:
//deshabilita interrupciones para luego iniciar el control de interrupciones
DINT;

// Inicializa PIE control.


InitPieCtrl();

// deshabilita interrupciones y limpiar banderas


IER = 0x0000;//deshabilita interrupciones
IFR = 0x0000;//limpia banderas

// Inicializa el vector de interrupciones


InitPieVectTable();//Contiene los punteros de las rutinas de
interrupciones (ISR)

TIMERS

Para configurar nuestro vector de interrupcin usaremos una de las siguientes lneas de
comando, esto depende de nuestra aplicacin. (Esto en el lazo main)

PieVectTable.TIMER0_INT = &cpu_timer0_isr;
PieVectTable.TIMER1_INT = &cpu_timer1_isr;
PieVectTable.TIMER2_INT = &cpu_timer2_isr;

Luego de escoger nuestro vector de interrupciones iniciaremos el cputimer para iniciar los
perifricos.

InitCpuTimers();

Ahora configuraremos nuestro timer


ConfigCpuTimer(&CpuTimer(#timer),frecuencia micro,tiempo en us)
Ejemplo:

ConfigCpuTimer(&CpuTimer1,60,200);//f=5Khz

Ahora activaremos nuestro timer

CpuTimer0Regs.TCR.all = 0x4001;

Activamos los vectores de interrupciones (revisar manual pg. 88-89)


IER |= M_INT1;//canal para timer0
IER |= M_INT13;//canal para timer1

Ahora activaremos PIE

PieCtrlRegs.PIEIER1.bit.INTx7 = 1;

Ejemplo de configuracin del IER y PieCtrlRegs.PIEIER1.bit.INTx para el timer0

Nota: Solo existen la configuracin de PIE desde el canal1 hasta el 12 (revisar manual pg.
88)

Por ultimo activaremos las interrupciones.


EINT; // Activo las interrupciones globales INTM
ERTM; // Interrupciones globales a tiempo real DBGM

Ejemplo practico

//Encendido y apagado de 2 leds temporizados.

#include "F28x_Project.h"
#include "math.h"

//iniciar punteros de interrupcin

__interrupt void cpu_timer0_isr(void);


__interrupt void cpu_timer1_isr(void);

void main(void)
{
// PASO1:iniciar el control del sistema

InitSysCtrl();

// PASO2: Inicializar puertos


EALLOW;//Modo de proteccion de configuracion
InitGpio();
GPIO_SetupPinMux(12, GPIO_MUX_CPU1, 0);
GPIO_SetupPinMux(13, GPIO_MUX_CPU1, 0);
GPIO_SetupPinOptions(12, GPIO_OUTPUT, GPIO_PUSHPULL);
GPIO_SetupPinOptions(13, GPIO_OUTPUT, GPIO_PUSHPULL);
EDIS;//fin de modo proteccion

//PASO3: deshabilitar interrupciones para luego iniciar el control de


interrupciones
DINT;

// Inicializar PIE control.


InitPieCtrl();

// deshabilitar interrupciones y limpiar banderas


IER = 0x0000;
IFR = 0x0000;

// Inicializar el vector de interrupciones


InitPieVectTable();//Contiene los punteros de las rutinas de
interrupciones (ISR)

// Timer 0 usado para interrupcion


EALLOW;
PieVectTable.TIMER0_INT = &cpu_timer0_isr;
PieVectTable.TIMER1_INT = &cpu_timer1_isr;
EDIS;

// PASO 4: Inicializar los perifericos


InitCpuTimers(); // Inicializo el CPU del timer
//queremos una frecuencia de 5Khz lo que es equivalente a 200uS
//En este caso configuraremos el cpu a 60MHz con un periodo de 200uS
//ConfigCpuTimer(&CpuTimer0, Frecuencia del cpu en MHz, periodo en uS);
ConfigCpuTimer(&CpuTimer0, 10, 200);//f=5Khz
ConfigCpuTimer(&CpuTimer1, 60, 500);//f=60hz

CpuTimer0Regs.TCR.all = 0x4001; // el bit TSS debe estar en 0 para q el


timer no se detenga
CpuTimer1Regs.TCR.all = 0x4001;
// Paso 5. Activar las interrupciones

// Activo CPU INT1 que esta conectado al cpu timer 0:


IER |= M_INT1;//triangular
IER |= M_INT13;//senoidal

// Activo TINT0 en el PIE: Grupo 1 __interrupt 7


PieCtrlRegs.PIEIER1.bit.INTx7 = 1;

// Activo las interrupciones globales y la interrupcion global a tiempo real


EINT; // Activo las interrupciones globales INTM
ERTM; // Interrupciones globales a tiempo real DBGM

// Fin de configuracion

while(1){

}
}

//vector de interrupcion
__interrupt void cpu_timer0_isr(void)
{
CpuTimer0.InterruptCount++;
GPIO_WritePin(12,1);
GPIO_WritePin(13,0);
PieCtrlRegs.PIEACK.all = PIEACK_GROUP1;
}

__interrupt void cpu_timer1_isr(void)


{
CpuTimer1.InterruptCount++;
GPIO_WritePin(12,0);
GPIO_WritePin(13,1);

PieCtrlRegs.PIEACK.all = PIEACK_GROUP1;

}
AD
Para configurar nuestro vector de interrupcin usaremos una de las siguientes lneas de
comando, esto depende de nuestra aplicacin. (Esto en el lazo main)

PieVectTable.ADCA1_INT = &adca1_isr
PieVectTable.ADCB1_INT = &adcb1_isr
PieVectTable.ADCC1_INT = &adcc1_isr
PieVectTable.ADCD1_INT = &adcd1_isr

1. Configuraremos nuestro conversor


Nota: se recomienda hacer una subrutina.

EALLOW;

//Escribir configuraciones
AdcaRegs.ADCCTL2.bit.PRESCALE = 6; //poner ADCCLK divider to/4 revisar
pg. (1215)
AdcSetMode(ADC_ADCA, ADC_RESOLUTION_12BIT, ADC_SIGNALMODE_SINGLE);

//Set pulse positions to late


AdcaRegs.ADCCTL1.bit.INTPULSEPOS = 1;

//power up the ADCs


AdcaRegs.ADCCTL1.bit.ADCPWDNZ = 1;

//Tiempo de espera para encender el covnersor


Delay(1000);

EDIS;

2. Ahora tendremos una configuracin general

Uint16 acqps;

//determine minimum acquisition window (in SYSCLKS) based on


resolution
if(ADC_RESOLUTION_12BIT == AdcaRegs.ADCCTL2.bit.RESOLUTION){
acqps = 14; //75ns
}
else { //resolution is 16-bit
acqps = 63; //320ns
}

//Seleccion del canal ADCA


//ADCA
EALLOW;

AdcaRegs.ADCINTFLGCLR.bit.ADCINT1 = 1;
AdcaRegs.ADCSOC0CTL.bit.CHSEL = 0; //seleccin del canal
AdcaRegs.ADCSOC0CTL.bit.ACQPS = acqps; //sample window is acqps + 1
SYSCLK cycles
AdcaRegs.ADCSOC0CTL.bit.TRIGSEL = 0; //trigger modo software
AdcaRegs.ADCINTSEL1N2.bit.INT1SEL = 0; //end of SOC1 will set INT1 flag
AdcaRegs.ADCINTSEL1N2.bit.INT1E = 1; //enable INT1 flag
AdcaRegs.ADCINTFLGCLR.bit.ADCINT1 = 1; //make sure INT1 flag is cleared
EDIS;
3. Para finalizar configuraremos el puntero de interrupcin

while(AdcaRegs.ADCINTFLG.bit.ADCINT1 == 0);//Lazo mientras no haya


terminado la conversin no pasa a la siguiente instruccin.
AdcaResult0 = AdcaResultRegs.ADCRESULT0;//toma el dato en el buffer de la
conversin, ADCRESULTx donde x es el nmero del canal del conversor
AdcaRegs.ADCINTFLGCLR.bit.ADCINT1 = 1; //clear INT1 flag
PieCtrlRegs.PIEACK.all = PIEACK_GROUP1;
AdcaRegs.ADCSOCFRC1.all = 0x0003;

Ejemplo

En el siguiente ejemplo realizaremos la conversin AD cuando exista un cambio


de estado en la entrada del conversor.
Usaremos un trigger por software.

#include "F28x_Project.h"

void Delay(float delay);


void ConfigureADC(void);
void SetupADCSoftware(void);
interrupt void adca1_isr(void);
int AdcaResult0;

void main(void) {

InitSysCtrl();

EALLOW;
InitGpio();
GPIO_SetupPinMux(12, GPIO_MUX_CPU1, 0);
GPIO_SetupPinMux(13, GPIO_MUX_CPU1, 0);
GPIO_SetupPinOptions(12, GPIO_OUTPUT, GPIO_PUSHPULL);
GPIO_SetupPinOptions(13, GPIO_OUTPUT, GPIO_PUSHPULL);
EDIS;

DINT;

InitPieCtrl();

IER = 0x0000;
IFR = 0x0000;

InitPieVectTable();
EALLOW;
PieVectTable.ADCA1_INT = &adca1_isr; //funcion para ADCA interrupt
1
EDIS;
//Configurar el ADCs y encenderlo
ConfigureADC();

//Iniciar configuracion d ADC


SetupADCSoftware();
//Activar las interrupciones globales
IER |= M_INT1; //Activar interrupciones del grupo 1
EINT; // Activo las interrupciones globales INTM
ERTM; // Interrupciones globales a tiempo real DBGM
//Activar PIE interrupcion
PieCtrlRegs.PIEIER1.bit.INTx1 = 1;
//activar la bandera de conversion
AdcaRegs.ADCSOCFRC1.all = 0x0003;

while (1)
{

GPIO_WritePin(12,0);
GPIO_WritePin(13,1);

Delay(AdcaResult0);
GPIO_WritePin(12,1);
GPIO_WritePin(13,0);

Delay(AdcaResult0);

void Delay(float delay) {


while (delay--);

void ConfigureADC(void)
{
//Escribir configuraciones
AdcaRegs.ADCCTL2.bit.PRESCALE = 6; //poner ADCCLK divider to/4 revisar
pg. (1215)
AdcSetMode(ADC_ADCA, ADC_RESOLUTION_12BIT, ADC_SIGNALMODE_SINGLE);

//Set pulse positions to late


AdcaRegs.ADCCTL1.bit.INTPULSEPOS = 1;

//power up the ADCs


AdcaRegs.ADCCTL1.bit.ADCPWDNZ = 1;

//Tiempo de espera para encender el covnersor


Delay(1000);

EDIS;
}

void SetupADCSoftware(void)
{
Uint16 acqps;

//determine minimum acquisition window (in SYSCLKS) based on


resolution
if(ADC_RESOLUTION_12BIT == AdcaRegs.ADCCTL2.bit.RESOLUTION){
acqps = 14; //75ns
}
else { //resolution is 16-bit
acqps = 63; //320ns
}

//Seleccion del canal ADCA


//ADCA
EALLOW;

AdcaRegs.ADCINTFLGCLR.bit.ADCINT1 = 1;
AdcaRegs.ADCSOC0CTL.bit.CHSEL = 0; //seleccin del canal
AdcaRegs.ADCSOC0CTL.bit.ACQPS = acqps; //sample window is acqps + 1
SYSCLK cycles
AdcaRegs.ADCSOC0CTL.bit.TRIGSEL = 0; //trigger modo software
AdcaRegs.ADCINTSEL1N2.bit.INT1SEL = 0; //end of SOC1 will set INT1 flag
AdcaRegs.ADCINTSEL1N2.bit.INT1E = 1; //enable INT1 flag
AdcaRegs.ADCINTFLGCLR.bit.ADCINT1 = 1; //make sure INT1 flag is cleared
EDIS;
}

interrupt void adca1_isr(void)


{

while(AdcaRegs.ADCINTFLG.bit.ADCINT1 == 0);
AdcaResult0 = AdcaResultRegs.ADCRESULT0;
AdcaRegs.ADCINTFLGCLR.bit.ADCINT1 = 1; //clear INT1 flag
PieCtrlRegs.PIEACK.all = PIEACK_GROUP1;
AdcaRegs.ADCSOCFRC1.all = 0x0003;
}

Anda mungkin juga menyukai