This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

f2812 interrupt problem

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;                
}