在用MSP430F2132的ADC10模块的DTC功能的问题
[P][FACE=宋体]在用MSP430F2132IPW的ADC10模块,使用模块的DTC功能,在RAM[/FACE]里已经看到DTC传送的10[/font]个AD[/font]数据,但不知是什么因原因,ADC10IFG[/font]信号就是不能置位,导致定时1S[/font]的看门狗复位程序。[/font][/P][P][FACE=宋体]手册上说明:当装载ADC10MEM完成或DTC传送完毕后ADC10IFG置位,响应中断后自动复位。[/FACE][/P][P][FACE=宋体]现将程序附上,各位帮我看看。[/FACE][/P][P][FACE=宋体]//ADC10初始化[/FACE][/P][P][FACE=宋体]void ADC_init(void)[/FACE][/P][P][FACE=宋体]{ [/FACE][/P][P][FACE=宋体] ADC10AE0 |= BIT0; //A0_VIOUT[/FACE][/P][P][FACE=宋体] ADC10CTL0 = SREF_2 + //使用外部基准(VeREF+ toVSS)[/FACE][/P][P][FACE=宋体] ADC10SHT_3 + //采样保持时间= 64 xADC10CLKs = 64 us[/FACE][/P][P][FACE=宋体] ADC10ON + ADC10IE; //启动ADC10模块并置中断使能[/FACE][/P][P][FACE=宋体] ADC10CTL1 = ADC10DIV_0 + // ADC10CLK = SMCLK / 1 = 1 MHz[/FACE][/P][P][FACE=宋体] ADC10SSEL_3; // ADC10CLK时钟为SMCLK (1 MHz)[/FACE][/P][P][FACE=宋体] _EINT();[/FACE][/P][P][FACE=宋体]}[/FACE][/P][P][FACE=宋体] [/FACE][/P][P][FACE=宋体]// ADC10中断程序[/FACE][/P][P][FACE=宋体]#pragmavector=ADC10_VECTOR[/FACE][/P][P][FACE=宋体]__interruptvoid ADC10_ISR(void)[/FACE][/P][P][FACE=宋体]{[/FACE][/P][P][FACE=宋体] _NOP();[/FACE][/P][P][FACE=宋体] ADC10_Buf = ADC10MEM;[/FACE][/P][P][FACE=宋体]}[/FACE][/P][P][FACE=宋体] [/FACE][/P][P][FACE=宋体]// ADC_read 使用DTC功能做10次采样平均值[/FACE][/P][P][FACE=宋体]unsigned intADC_read ()[/FACE][/P][P][FACE=宋体]{ [/FACE][/P][P][FACE=宋体][SIZE=9pt] [/FACE][SIZE=9pt]_NOP();[/SIZE][/SIZE][/P][P][FACE=宋体] unsigned int i=0;[/FACE][/P][P][FACE=宋体] ADC10CTL0 |= MSC; //设置重复采样 [/FACE][/P][P][FACE=宋体] ADC10CTL1 &= (~INCH_15); //通道设置清零[/FACE][/P][P][FACE=宋体] ADC10CTL1 &= (~CONSEQ_3); //清转换次序[/FACE][/P][P][FACE=宋体] ADC10CTL1 |= INCH_0 + CONSEQ_2; //INCH_0设置新的单通道重复采样模式 [/FACE][/P][P][FACE=宋体] ADC10DTC1 = 10; //DTC设置:传送10次AD转换结果[/FACE][/P][P][FACE=宋体] ADC10SA = ADC_Val_ADR; //DTC基址0X200 [/FACE][/P][P][FACE=宋体] //启动转换[/FACE][/P][P][FACE=宋体] ADC10CTL0 &= (~ADC10IFG); //清ADC中断旗号[/FACE][/P][P][FACE=宋体] ADC10CTL0 |= ENC + ADC10SC; //使能并启动转换[/FACE][/P][P][FACE=宋体] RESET_WATCHDOG;[/FACE][/P][P][FACE=宋体] [COLOR=red]while (!(ADC10CTL0& ADC10IFG)); //[/FACE][COLOR=red]等待[/COLOR][COLOR=red]DTC[/COLOR][COLOR=red]完成(总等不到[/COLOR][COLOR=red]ADC10IFG,导致看门狗复位[/COLOR][COLOR=red])[/COLOR] [/COLOR][/P][P][FACE=宋体] ADC10CTL0 &= ~ENC; //停止ADC[/FACE][/P][P][FACE=宋体] //求ADC_Val数组中的最大、最小值[/FACE][/P][P][FACE=宋体] ADCVal_Min = ADCVal_Max = ADC_Val[0];[/FACE][/P][P][FACE=宋体] for(i = 1;i<10;i++)[/FACE][/P][P][FACE=宋体] {[/FACE][/P][P][FACE=宋体] if (ADCVal_Max < ADC_Val[i])[/i][/FACE][/P][P][i][FACE=宋体] {[/FACE][/i][/P][P][i][FACE=宋体] ADCVal_Max = ADC_Val[i];[/i][/FACE][/i][/P][P][i][i][FACE=宋体] }[/FACE][/i][/i][/P][P][i][i][FACE=宋体] if (ADCVal_Min > ADC_Val[i])[/i][/FACE][/i][/i][/P][P][i][i][i][FACE=宋体] {[/FACE][/i][/i][/i][/P][P][i][i][i][FACE=宋体] ADCVal_Min = ADC_Val[i];[/i][/FACE][/i][/i][/i][/P][P][i][i][i][FACE=宋体] }[/FACE][/i][/i][/i][/P][P][i][i][i][FACE=宋体] }[/FACE][/i][/i][/i][/P][P][i][i][i][FACE=宋体] ADC10_Buf = ADC_Val[0]; //求和[/FACE][/i][/i][/i][/P][P][i][i][i][FACE=宋体] for(i = 1;i<10;i++)[/FACE][/i][/i][/i][/P][P][i][i][i][FACE=宋体] {[/FACE][/i][/i][/i][/P][P][i][i][i][FACE=宋体] ADC10_Buf += ADC_Val[i];[/i][/FACE][/i][/i][/i][/P][P][i][i][i][FACE=宋体] } [/FACE][/i][/i][/i][/P][P][i][i][i][FACE=宋体] ADC10_Buf = ((ADC10_Buf - ADCVal_Min -ADCVal_Max)/8); //求平均值 [/FACE][/i][/i][/i][/P][P][i][i][i][FACE=宋体] return ADC10_Buf;[/FACE][/i][/i][/i][/P][P][i][i][i][FACE=宋体]}[/FACE][/font][/i][/i][/i][/P]