在线情况
楼主
  • 头像
  • 级别
    • 积分19
    • 经验632
    • 文章26
    • 注册2011-10-10
    在用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]
    微控网感谢您的参与
    在线情况
    2
    • 头像
    • 级别
      • 积分19
      • 经验632
      • 文章26
      • 注册2011-10-10
          昨天在调试程序时发现,在“[LINE-HEIGHT=21px][COLOR=rgb(255, 0, 0)][BGCOLOR=rgb][SIZE=14px]while (!(ADC10CTL0& ADC10IFG));[/SIZE][/BGCOLOR][/COLOR][/LINE-HEIGHT]”设置断点,程序暂停时发现寄存器ADC10DTC0的ADC10TB被置位,但在整个程序中并没有对寄存器ADC10DTC0进行操作。修改程序,在启动ADC前将寄存器ADC10DTC0清零,程序在ADC过程中自复位的现象得到改善,但故障没有根本排除。[P]    现在很怀疑是不是还有其他的寄存器被改写,为什么会出现寄存器被改写的现象。IAR时5.31,仿真器是从论坛买的。[/P][P]    另外,在程序中使用结构变量有什么好处或坏处?[/P]
      微控网感谢您的参与
      在线情况
      3
      • 头像
      • 级别
        • 积分19
        • 经验632
        • 文章26
        • 注册2011-10-10
        时间久了,差点忘了这档事。[P]上述程序没问题。原因是过流检测触发了NMI,处理好NMI中断后,程序正常运行。[/P]
        微控网感谢您的参与
        在线情况
        4
        • 头像
        • 级别
        • 门派
        • 职务总版主
        • 声望+9
        • 财富5
        • 积分3065
        • 经验390701
        • 文章6744
        • 注册2006-03-07
        我也好久没有看这430了,你的程序贴出来我看了几眼很难入脑。太久没弄了。
        [COLOR=#0000ff]欢迎发贴分享设计心得、开源DIY...[/COLOR]
        Powered by LeadBBS 9.2 .
        Page created in 0.1719 seconds with 5 queries.