Part Number: TMS320F2808
Tool/software: Code Composer Studio
I have written a code for conversion of 9 ADC channels. I have used cascaded mode of conversion. The ADC is software triggered. The trigger source is placed in a timer0 ISR which is executed for every 1msec. The timer0 is running perfectly but the ADC conversion is not happening. I tried my best to debug it but still, the problem persists. Can anyone help? The code is given below.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
#include "DSP280x_Device.h"
#include "DSP280x_Examples.h"
__interrupt void cpu_timer0_isr(void);
interrupt void adc_isr(void)
void main(void)
{
InitSysCtrl();
DINT;
InitPieCtrl();
IER = 0x0000;
IFR = 0x0000;
InitPieVectTable();
InitAdc();
AdcRegs.ADCTRL1.bit.ACQ_PS = ADC_SHCLK; //ADC Initialization to run in cascaded mode. 9 channels conversion.
AdcRegs.ADCTRL3.bit.ADCCLKPS = ADC_CKPS;
AdcRegs.ADCTRL1.bit.SEQ_CASC = 1;
AdcRegs.ADCTRL1.bit.CONT_RUN = 1;
AdcRegs.ADCTRL1.bit.SEQ_OVRD = 1;
AdcRegs.ADCCHSELSEQ1.bit.CONV00 = 0x0;
AdcRegs.ADCCHSELSEQ1.bit.CONV01 = 0x1;
AdcRegs.ADCCHSELSEQ1.bit.CONV02 = 0x2;
AdcRegs.ADCCHSELSEQ1.bit.CONV03 = 0x3;
AdcRegs.ADCCHSELSEQ2.bit.CONV04 = 0x4;
AdcRegs.ADCCHSELSEQ2.bit.CONV05 = 0x5;
AdcRegs.ADCCHSELSEQ2.bit.CONV06 = 0x6;
AdcRegs.ADCCHSELSEQ2.bit.CONV07 = 0x7;
AdcRegs.ADCCHSELSEQ3.bit.CONV08 = 0x8;
AdcRegs.ADCMAXCONV.bit.MAX_CONV1 = 0x8;
AdcRegs.ADCTRL2.bit.INT_ENA_SEQ2 = 1;
EALLOW;
SysCtrlRegs.HISPCP.all = ADC_MODCLK;
EDIS;
EALLOW;
PieVectTable.TINT0 = &cpu_timer0_isr;
PieVectTable.ADCINT = &adc_isr;
EDIS;
InitCpuTimers();
ConfigCpuTimer(&CpuTimer0, 100, 1000);
CpuTimer0Regs.TCR.all = 0x4000;
IER |= M_INT1;
PieCtrlRegs.PIEIER1.bit.INTx6 = 1;
PieCtrlRegs.PIEIER1.bit.INTx7 = 1;
EINT;
ERTM;
for(;;)
{
__asm("NOP");
}
}
__interrupt void cpu_timer0_isr(void) //Timer for every 1msec
{
AdcRegs.ADCTRL2.bit.RST_SEQ1 = 1;
AdcRegs.ADCTRL2.bit.SOC_SEQ1 = 1; // Enable software trigger for SEQ1
AdcRegs.ADCTRL2.bit.RST_SEQ2 = 1;
AdcRegs.ADCTRL2.bit.SOC_SEQ2 = 1; // Enable software trigger for SEQ2
PieCtrlRegs.PIEACK.all = PIEACK_GROUP1;
}
interrupt void adc_isr(void)
{
a[0]=AdcRegs.ADCRESULT0 >>4;
a[1]=AdcRegs.ADCRESULT1 >>4;
a[2]=AdcRegs.ADCRESULT2 >>4;
a[3]=AdcRegs.ADCRESULT3 >>4;
a[4]=AdcRegs.ADCRESULT4 >>4;
a[5]=AdcRegs.ADCRESULT5 >>4;
a[6]=AdcRegs.ADCRESULT6 >>4;
a[7]=AdcRegs.ADCRESULT7 >>4;
a[8]=AdcRegs.ADCRESULT8 >>4;
AdcRegs.ADCTRL2.bit.RST_SEQ1 = 1; // Reinitialize for next ADC sequence
AdcRegs.ADCST.bit.INT_SEQ1_CLR = 1;
AdcRegs.ADCTRL2.bit.RST_SEQ2 = 1; // Reinitialize for next ADC sequence
AdcRegs.ADCST.bit.INT_SEQ2_CLR = 1;
PieCtrlRegs.PIEACK.all = PIEACK_GROUP1; // Acknowledge interrupt to PIE
return;
}