Dear all,
While trying to sense the hall sensor signal in ecap1 module for speed measurement i could not get values in the capture register for the following code. Correct me in the code specifically at interrupt handling.
#include"DSP2803x_Device.h"
extern void InitSysCtrl();
extern void InitPieCtrl();
extern void InitPieVectTable();
interrupt void ecap1_isr();
void gpiosetup();
void ecapsetup();
unsigned int TSt1,TSt2,TSt3,TSt4,DutyOnTime1,DutyOffTime1,Period1,Period2,DutyOnTime2,DutyOffTime2;
void main()
{
InitSysCtrl();
gpiosetup();
DINT;
InitPieCtrl();
IER=0x0000;
IFR=0x0000;
InitPieVectTable();
EALLOW; // This is needed to write to EALLOW protected registers
PieVectTable.ECAP1_INT = &ecap1_isr;
EDIS;
ecapsetup();
IER |= M_INT4;
PieCtrlRegs.PIEIER4.bit.INTx1 = 1;
EINT; // Enable Global interrupt INTM
ERTM; // Enable Global realtime interrupt DBGM
EALLOW;
SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 1;
EDIS;
}
void gpiosetup()
{
GpioCtrlRegs.GPAPUD.bit.GPIO19=1;
GpioCtrlRegs.GPADIR.bit.GPIO19=0;
GpioCtrlRegs.GPAMUX2.bit.GPIO19=3;
//GpioCtrlRegs.GPAPUD.bit.GPIO24=1;
}
void ecapsetup()
{
EALLOW;
SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 1;
EDIS;
ECap1Regs.ECEINT.all = 0x0000; // Disable all capture interrupts
ECap1Regs.ECCLR.all = 0xFFFF;
ECap1Regs.ECCTL1.bit.CAPLDEN = 0;
ECap1Regs.ECCTL2.bit.TSCTRSTOP = 0;
ECap1Regs.ECCTL2.bit.CAP_APWM = 0;
ECap1Regs.ECCTL1.bit.CAP1POL = 0;
ECap1Regs.ECCTL1.bit.CAP2POL = 1;
ECap1Regs.ECCTL1.bit.CAP3POL = 0;
ECap1Regs.ECCTL1.bit.CAP4POL = 1;
ECap1Regs.ECCTL1.bit.CTRRST1 = 1;
ECap1Regs.ECCTL1.bit.CTRRST2 = 1;
ECap1Regs.ECCTL1.bit.CTRRST3 = 1;
ECap1Regs.ECCTL1.bit.CTRRST4 = 1;
ECap1Regs.ECCTL1.bit.CAPLDEN = 1;
ECap1Regs.ECCTL1.bit.PRESCALE = 0;
ECap1Regs.ECCTL2.bit.CONT_ONESHT = 0;
ECap1Regs.ECCTL2.bit.SYNCO_SEL = 2;
ECap1Regs.ECCTL2.bit.SYNCI_EN = 0;
ECap1Regs.ECCTL2.bit.TSCTRSTOP = 1; // Allow TSCTR to run
ECap1Regs.ECEINT.bit.CEVT1 = 1; // 4 events = interrupt
ECap1Regs.ECFLG.bit.CEVT1=1;
ECap1Regs.ECFLG.bit.INT=1;
}
// Run Time ( e.g. CEVT1 triggered ISR call)
//==========================================
// Note: here Time-stamp directly represents the Duty cycle values.
interrupt void ecap1_isr()
{
DutyOnTime1 = ECap1Regs.CAP2; // Fetch Time-Stamp captured at T2
DutyOffTime1 = ECap1Regs.CAP3; // Fetch Time-Stamp captured at T3
DutyOnTime2 = ECap1Regs.CAP4; // Fetch Time-Stamp captured at T4
DutyOffTime2 = ECap1Regs.CAP1; // Fetch Time-Stamp captured at T1
Period1 = DutyOnTime1 + DutyOffTime1;
Period2 = DutyOnTime2 + DutyOffTime2;
ECap1Regs.ECCLR.bit.CEVT1 = 1;
ECap1Regs.ECCLR.bit.INT = 1;
PieCtrlRegs.PIEACK.all = PIEACK_GROUP4;
}
Thanks in advance.
Regards,
Saravanakumar...