一、主程序:
#include "DSP28_Device.h"
float ADResult;
unsigned int k=0;
float adclo;
interrupt void ADC_ISR(void);
void main(void)
{
InitSysCtrl(); //初始化系统
DINT; //关中断
IER = 0x0000;
IFR = 0x0000;
InitPieCtrl(); //初始化PIE控制寄存器
InitPieVectTable(); //初始化PIE参数表
InitEv();
InitAdc(); //初始化ADC
adclo=0;
PieCtrl.PIEIER1.bit.INTx6=1;
EALLOW;
PieVectTable.ADCINT=&ADC_ISR;
EDIS;
IER |= M_INT1; // Enable INT14 which is connected to CPU-Timer 2:
EINT; // Enable INTM
ERTM; // Enable DBGM
EvaRegs.T1CON.bit.TENABLE=1;
for(;;)
{
}
}
interrupt void ADC_ISR(void)
{
ADResult=((AdcRegs.RESULT0>>4)*3)/4095.0+adclo;
PieCtrl.PIEACK.all=0x0001;
AdcRegs.ADC_ST_FLAG.bit.INT_SEQ1_CLR=1;
AdcRegs.ADCTRL2.bit.RST_SEQ1=1; //在这里设置断点
EINT;
}
二、ad初始化程序:
void InitAdc(void)
{
unsigned int i;
AdcRegs.ADCTRL1.bit.RESET=1;
NOP;
AdcRegs.ADCTRL1.bit.RESET=0;
AdcRegs.ADCTRL1.bit.SUSMOD=3;
AdcRegs.ADCTRL1.bit.ACQ_PS=0;
AdcRegs.ADCTRL1.bit.CPS=0;
AdcRegs.ADCTRL1.bit.CONT_RUN=0;
AdcRegs.ADCTRL1.bit.SEQ_CASC=1;
AdcRegs.ADCTRL3.bit.ADCBGRFDN=3;
for(i=0;i<10000;i++) NOP;
AdcRegs.ADCTRL3.bit.ADCPWDN=1;
for(i=0;i<5000;i++) NOP;
AdcRegs.ADCTRL3.bit.ADCCLKPS=15;
AdcRegs.ADCTRL3.bit.SMODE_SEL=1;
AdcRegs.MAX_CONV.bit.MAX_CONV=7;//15;
AdcRegs.CHSELSEQ1.bit.CONV00=0;
AdcRegs.ADC_ST_FLAG.bit.INT_SEQ1_CLR=1;
AdcRegs.ADC_ST_FLAG.bit.INT_SEQ2_CLR=1;
AdcRegs.ADCTRL2.bit.EVB_SOC_SEQ=0;
AdcRegs.ADCTRL2.bit.RST_SEQ1=0;
AdcRegs.ADCTRL2.bit.INT_ENA_SEQ1=1;
AdcRegs.ADCTRL2.bit.INT_MOD_SEQ1=0;
AdcRegs.ADCTRL2.bit.EVA_SOC_SEQ1=0;
AdcRegs.ADCTRL2.bit.EXT_SOC_SEQ1=0;
AdcRegs.ADCTRL2.bit.RST_SEQ2=0;
AdcRegs.ADCTRL2.bit.SOC_SEQ2=0;
AdcRegs.ADCTRL2.bit.INT_ENA_SEQ2=0;
AdcRegs.ADCTRL2.bit.INT_MOD_SEQ2=0;
AdcRegs.ADCTRL2.bit.EVB_SOC_SEQ2=0;
AdcRegs.ADCTRL2.bit.SOC_SEQ1=0;
}
三、EV初始化程序:
void InitEv(void)
{
EvaRegs.T1CON.bit.TMODE=2;
EvaRegs.T1CON.bit.TPS=1;
EvaRegs.T1CON.bit.TENABLE=0;
EvaRegs.T1CON.bit.TCLKS10=0;
EvaRegs.GPTCONA.bit.T1TOADC=2;
EvaRegs.EVAIMRA.bit.T1PINT=1;
EvaRegs.EVAIFRA.bit.T1PINT=1;
EvaRegs.T1PR=0x927B;//定时37499,周期1ms
EvaRegs.T1CNT=0;
}
回复 楼主 为爱一拼 的帖子
我是新手的,看了一下你的程序,可能我的回答也是错的,请原谅。。。
EvaRegs.T1CON.bit.TENABLE=0; // 你没有启动定时器吧,应该使能定时器操作
EvaRegs.T1CON.bit.TCLKS10=0; // 那个TCLKS不是这样写的吧
TI关于2812的例程,你参考下里边adc_soc这个程序
-
v110.rar
(2012-5-16 23:25 上传)
1.65 MB, 下载次数: 63
interrupt void ADC_ISR(void)
{
ADResult=((AdcRegs.RESULT0>>4)*3)/4095.0+adclo;
PieCtrl.PIEACK.all=0x0001;
AdcRegs.ADC_ST_FLAG.bit.INT_SEQ1_CLR=1;
AdcRegs.ADCTRL2.bit.RST_SEQ1=1; //在这里设置断点
EINT;
}
需要添加清标志位的语句。看看ADC 例程
回复 4楼 安_然 的帖子
谢谢版主 AdcRegs.ADC_ST_FLAG.bit.INT_SEQ1_CLR=1; 我的标志位已经清除了 我的问题在于AdcRegs.ADCTRL2.bit.EVA_SOC_SEQ1=0;这里本应该置1的,来允许EVA启动触发SEQ1,而我没有使能,改后就可以了 谢谢了
回复 板凳 hljshzhang 的帖子
谢谢历程 经过对比我发现是我AdcRegs.ADCTRL2.bit.EVA_SOC_SEQ1=0;这里本应该置1的,来允许EVA启动触发SEQ1,而我却置0
回复 沙发 johnsonfck 的帖子
EvaRegs.T1CON.bit.TENABLE=0; 你好,这里就是为了暂时停止T1计数,发生中断时才计数
EvaRegs.T1CON.bit.TCLKS10=0; 我的开发板历程中有定义是这样的,这里也没错
我的错误在于AdcRegs.ADCTRL2.bit.EVA_SOC_SEQ1=0;这里本应该置1的,来允许EVA启动触发SEQ1,而我却置0,谢谢你了,大家一起进步