This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

msp-exp430G2内部ADC不使能始终忙



之前的寄存器设置文件是用Grace生成的,我与其它例子比对了一下没有问题。

DEBUG的时候,第一次可以运行到nop,继续运行(第二次loop)就卡在while检测忙那里,读寄存器的值,ADC10CTL0的ENC使能的确关掉了,而ADC10BUSY始终是1。

中断处理程序里有一句while(1),没有停在那里过,说明没进过中断。

G2开发板,芯片型号G2553

  • 没看明白楼主的思路。楼主提供的这段代码是中断服务程序里的还是主程序里的?

  • Zhengguan,

      你这个程序的逻辑是什么样的呢?

    你在主程序里面先停止了ADC的转换,然后再去判断ADC的active标识符,然后在进行一个赋值操作?

    你要实现什么样的功能呢?



    谢谢

  • 在主程序里

    是对ADC10对应寄存器操作

  • ADC10只有一个数值寄存器ADC10MEM,当多通道多次采样时,为防止采样结果被覆盖,可以利用DTC(data transfer controller),将每次转换的值存到内存中,之前我已经配置存储大小,存储结束产生中断。那个赋值语句就是设置地址的意思,表示存到data地址的内存中。

    思路是先关闭ADC10,while语句的意思是等到模块不工作(不忙)再进行下一步,设置地址。然后开启模块,使能中断,进中断之后处理数据。

    现在发现进不去中断,设置断点调试发现卡在while那里,也就是说AD一直在工作,我明明让它不使能,为什么还在工作呢。

  • ADC10只有一个存储转换结果的寄存器ADC10MEM,如果是多通道多次转换模式,转换结果就会被覆盖,要通过DTC(data transfer controller)把结果放到内存里,那个赋值语句就是设置存储地址。每次转换结束,结果放到内存以后,会产生中断。

    思路是先停止AD,然后设置存储地址,开启中断,使能AD,等中断产生就处理结果。

    现在的问题就是我进不去中断,断点调试后发现我明明关了AD,但转换内核始终工作(在忙)。

  • Zhengguan,

       方便把关于系统初始化,特别是ADC的配置的语句贴出来的。

    需要确认一下,你的ADC是否是配置成repeat采样模式,同时相关的ADC中断时候正常开启。




    谢谢

  • adc配置是由grace生成的, 代码如下

    void ADC10_graceInit(void)
    {
    /* USER CODE START (section: ADC10_graceInit_prologue) */
    /* User initialization code */
    /* USER CODE END (section: ADC10_graceInit_prologue) */

    /* disable ADC10 during initialization */
    ADC10CTL0 &= ~ENC;

    /*
    * Control Register 0
    *
    * ~ADC10SC -- No conversion
    * ~ENC -- Disable ADC
    * ~ADC10IFG -- Clear ADC interrupt flag
    * ADC10IE -- Enable ADC interrupt
    * ADC10ON -- Switch On ADC10
    * REFON -- Enable ADC reference generator
    * REF2_5V -- Set reference voltage generator = 2.5V
    * ~MSC -- Disable multiple sample and conversion
    * REFBURST -- Reference buffer on only during sample-and-conversion
    * ~REFOUT -- Reference output off
    * ~ADC10SR -- Reference buffer supports up to ~200 ksps
    * ADC10SHT_1 -- 8 x ADC10CLKs
    * SREF_1 -- VR+ = VREF+ and VR- = VSS
    *
    * Note: ~<BIT> indicates that <BIT> has value zero
    */
    ADC10CTL0 = ADC10IE | ADC10ON | REFON | REF2_5V | REFBURST | ADC10SHT_1 | SREF_1;

    /*
    * Control Register 1
    *
    * ~ADC10BUSY -- No operation is active
    * CONSEQ_3 -- Repeat sequence of channels
    * ADC10SSEL_3 -- SMCLK
    * ADC10DIV_3 -- Divide by 4
    * ~ISSH -- Input signal not inverted
    * ~ADC10DF -- ADC10 Data Format as binary
    * SHS_0 -- ADC10SC
    * INCH_7 -- ADC Channel 7
    *
    * Note: ~<BIT> indicates that <BIT> has value zero
    */
    ADC10CTL1 = CONSEQ_3 | ADC10SSEL_3 | ADC10DIV_3 | SHS_0 | INCH_7;

    /* Analog (Input) Enable Control Register 0 */
    ADC10AE0 = 0xC0;

    /* Data Transfer Control Register 1 */
    ADC10DTC1 = 8;

    /* Data Transfer Start Address */
    //ADC10SA = (unsigned int)512;

    /* Software delay for REFON to settle */
    __delay_cycles(30000);

    /* enable ADC10 */
    ADC10CTL0 |= ENC;

    /* USER CODE START (section: ADC10_graceInit_epilogue) */
    /* User code */
    /* USER CODE END (section: ADC10_graceInit_epilogue) */
    }

  • Zhengguan,

      你的代码有几个小问题:

    1. ADC10CTL1设置channel的采样方式有问题,你应该选择repeat signle模式,即CONSEQ_2.因为你的程序里面只选择了一个ADC的channel,选择CONSEQ_3的意义不大。

    2.你在初始化里面的最后启动了ADC的enable信号,这样做不合适。因为你在程序里面没有设置好相应的DTC的start buffer 地址,这样启动ADC会有问题。


    所以建议你先修改采样模式,然后在初始化程序里面先禁用ADC,直接只在for(;;)程序里面去使能ADC。



    谢谢