this is the program i written to generate two pulses. first pulse is of 10000ns period and any duty ratio.
second pulse-------- of 600ns width should start 150ns before with respect to turn on and 300ns with respect to turn off of main switch , each pulse of same width.
i am not getting timer2 period interrupt....if there is any other logic please help.
// my program starts here.
// header files required
#include <stdio.h>
#include <math.h>
#include "DSP281x_Device.h" // DSP281x Headerfile Include File
#include "DSP281x_Examples.h" // DSP281x Examples Include File
#define delay1 0.0450
#define delay2 0.0150
#define delay3 0.0300
interrupt void t1ufint(void);
interrupt void t1pint(void);
interrupt void t2pint(void);
void init_eva_timer1(void);
// global variables
float32 A,B,C,D,E,F,G,H;
void main(void)
{
InitSysCtrl(); // init files for adc, wd, peri_clks etc
// set HSPCLK to SYSCLKOUT / 6 (25Mhz assuming 150Mhz SYSCLKOUT)
EALLOW; // Enable PWM pins
GpioMuxRegs.GPAMUX.all = 0x00C0; // EVA T!PWM & T2PWM 7-8 pins
EDIS;
EALLOW;
SysCtrlRegs.HISPCP.all = 0x3; // HSPCLK = SYSCLKOUT/6
EDIS;
// Disable CPU interrupts and clear all CPU interrupt flags
DINT;
InitPieCtrl();
IER = 0x0000;
IFR = 0x0000;
InitPieVectTable();
EALLOW;
PieVectTable.T1PINT = &t1pint;
PieVectTable.T1UFINT = &t1ufint;
PieVectTable.T2PINT = &t2pint;
EDIS;
init_eva_timer1();
// Enable PIE group 2 interrupt 4 for T1PINT & T1UFINT
PieCtrlRegs.PIEIER2.bit.INTx4 = 1;
PieCtrlRegs.PIEIER2.bit.INTx6 = 1;
PieCtrlRegs.PIEIER3.bit.INTx1 = 1;
// Enable CPU INT2 for T1PINT & T1UFINT
IER |= M_INT2;
IER |= M_INT3;
// Enable global Interrupts and higher priority real-time debug events:
EINT; // Enable Global interrupt INTM
ERTM; // Enable Global realtime interrupt DBGM
EvaRegs.T1CON.bit.TENABLE = 1;
// IDLE loop. Just sit and loop forever:
for(;;);
}
//**********************************************************************************************
// timer1 initialization for 100khz,30% duty,up/down mode,tps =0, m=2
//**********************************************************************************************
void init_eva_timer1(void)
{
// Initialize EVA Timer 1:
// Setup Timer 1 Registers (EV A)
EvaRegs.GPTCONA.bit.TCMPOE = 0x1;
EvaRegs.GPTCONA.bit.T1PIN = 0x2; // active high
EvaRegs.GPTCONA.bit.T2PIN = 0x2;
// Set the Period for the GP timer 1 to 0x0200;
EvaRegs.T1PR = 0x007D; // Period 100khz
A=EvaRegs.T1PR;
EvaRegs.T1CMPR = 0x0020; // Compare Reg FOR 50% DUTY
B=EvaRegs.T1CMPR;
C = A*(0.5+delay3) - (B*0.5);
D = A*(0.5-delay3) - (B*0.5);
E = (B*0.5) + (A*delay1);
F = (B*0.5) - (A*delay2);
G= (A*0.5)- E;
H= (A*0.5)- C;
EvaRegs.T2PR = (int)E;
EvaRegs.T2CMPR = (int)F;
EvaRegs.EVAIMRA.bit.T1PINT = 1;
EvaRegs.EVAIFRA.bit.T1PINT = 1;
EvaRegs.EVAIMRA.bit.T1UFINT = 1;
EvaRegs.EVAIFRA.bit.T1UFINT = 1;
EvaRegs.EVAIMRB.bit.T2PINT = 1;
EvaRegs.EVAIFRB.bit.T2PINT = 1;
// Clear the counter for GP timer 1
EvaRegs.T1CNT = 0x0000;
EvaRegs.T1CON.all = 0x0802; // updown mode,
EvaRegs.T2CNT = 0x0000;
EvaRegs.T2CON.all = 0x1082; //10CE
// Start EVA ADC Conversion on timer 1 Period interrupt
// EvaRegs.GPTCONA.bit.T1TOADC = 2;
}
//**********************************************************************************************
// timer1 period interrupt ISR initialization TURN ON timer 2 for pulse of 300ns each.
//**********************************************************************************************
interrupt void t2pint(void)
{ int flag1;
flag1=((EvaRegs.GPTCONA.bit.T1STAT) & 0x1);
if(flag1==0x1)
{ EvaRegs.T2PR = (int)G;
EvaRegs.T2CMPR = (int)G+10;
EvaRegs.T2CNT = 0x0000;
}
if(flag1==0x0)
{ EvaRegs.T2PR = (int)H;
EvaRegs.T2CMPR = (int)H+10;
EvaRegs.T2CNT = 0x0000;
}
// Enable more interrupts from this timer
EvaRegs.EVAIMRB.bit.T2PINT = 1;
EvaRegs.EVAIFRB.bit.T2PINT = 1;
PieCtrlRegs.PIEACK.all = 0x0003; // Acknowledge interrupt to receive more interrupts from PIE group 2
return;
}
interrupt void t1pint(void)
{
// Set the Period for the GP timer 2;
EvaRegs.T2PR = (int)C;
EvaRegs.T2CMPR = (int)D;
EvaRegs.T2CNT = 0x0000;
// Enable more interrupts from this timer
EvaRegs.EVAIMRA.bit.T1PINT = 1;
EvaRegs.EVAIFRA.bit.T1PINT = 1;
PieCtrlRegs.PIEACK.all = 0x0002; // Acknowledge interrupt to receive more interrupts from PIE group 2
return;
}
//**********************************************************************************************
// timer1 underflow intrrupt ISR initialization to TURN ON timer 2 for pulse of 150ns and 450ns
//**********************************************************************************************
interrupt void t1ufint(void)
{
// Set the Period for the GP timer 2;
EvaRegs.T2PR = (int)E;
EvaRegs.T2CMPR = (int)F;
EvaRegs.T2CNT = 0x0000;
// Enable more interrupts from this timer
EvaRegs.EVAIMRA.bit.T1UFINT=1;
EvaRegs.EVAIFRA.bit.T1UFINT=1;
PieCtrlRegs.PIEACK.all= 0x0002; // Acknowledge interrupt to receive more interrupts from PIE group 2
return;
}