打印

ADC用TI的官方例程总是转换一两次之后就停了,求可能原因

[复制链接]
761|17
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
沙发
jimmhu| | 2016-8-17 22:28 | 只看该作者
你是怎么看出来不能转换的?

使用特权

评论回复
板凳
jimmhu| | 2016-8-17 22:34 | 只看该作者
楼主试过单步调试了吗?

使用特权

评论回复
地板
火山LF|  楼主 | 2016-8-17 22:50 | 只看该作者
jimmhu 发表于 2016-8-17 22:34
楼主试过单步调试了吗?

试过单步调试了

使用特权

评论回复
5
dirtwillfly| | 2016-8-18 10:40 | 只看该作者
不好意思啊,刚看到这个帖子。
adc是怎么初始化的?

使用特权

评论回复
6
火山LF|  楼主 | 2016-8-18 11:29 | 只看该作者
dirtwillfly 发表于 2016-8-18 10:40
不好意思啊,刚看到这个帖子。
adc是怎么初始化的?
#include <msp430.h> 
#include "driverlib.h"


void main(void)
{
    // stop watchdog
    WDT_A_hold(WDT_A_BASE);

    PMM_unlockLPM5();
    // 设置内部DCO频率为1MHz
    CS_setDCOFreq(CS_DCORSEL_0,CS_DCOFSEL_0);
    // 设置SMCLK时钟源来自DCO
    CS_initClockSignal(CS_SMCLK,CS_DCOCLK_SELECT,CS_CLOCK_DIVIDER_1);


    GPIO_setAsOutputPin(
            GPIO_PORT_P1,
            GPIO_PIN0
            );

        //Set P1.0 as Output Low.
        /*

         * Select Port 1
         * Set Pin 0 to output Low.
         */
        GPIO_setOutputLowOnPin(
            GPIO_PORT_P1,
            GPIO_PIN0
            );
        //Set P1.1 as Ternary Module Function Output.
        /*

         * Select Port 1
         * Set Pin 1 to output Ternary Module Function, (A1, C1, VREF+, VeREF+).
         */


        GPIO_setAsPeripheralModuleFunctionOutputPin(
            GPIO_PORT_P1,
            GPIO_PIN1,
            GPIO_TERNARY_MODULE_FUNCTION
            );


        //Initialize the ADC12B Module
        /*
         * Base address of ADC12B Module
         * Use internal ADC12B bit as sample/hold signal to start conversion
         * USE MODOSC 5MHZ Digital Oscillator as clock source
         * Use default clock divider/pre-divider of 1
         * Not use internal channel
         */
        ADC12_B_initParam initParam = {0};
        initParam.sampleHoldSignalSourceSelect = ADC12_B_SAMPLEHOLDSOURCE_SC;
        initParam.clockSourceSelect = ADC12_B_CLOCKSOURCE_ADC12OSC;
        initParam.clockSourceDivider = ADC12_B_CLOCKDIVIDER_1;
        initParam.clockSourcePredivider = ADC12_B_CLOCKPREDIVIDER__1;
        initParam.internalChannelMap = ADC12_B_NOINTCH;
        ADC12_B_init(ADC12_B_BASE, &initParam);

        //Enable the ADC12B module
        ADC12_B_enable(ADC12_B_BASE);

        /*
         * Base address of ADC12B Module
         * For memory buffers 0-7 sample/hold for 64 clock cycles
         * For memory buffers 8-15 sample/hold for 4 clock cycles (default)
         * Disable Multiple Sampling
         */
        ADC12_B_setupSamplingTimer(ADC12_B_BASE,
                                   ADC12_B_CYCLEHOLD_16_CYCLES,
                                   ADC12_B_CYCLEHOLD_4_CYCLES,
                                   ADC12_B_MULTIPLESAMPLESDISABLE);

        //Configure Memory Buffer
        /*
         * Base address of the ADC12B Module
         * Configure memory buffer 0
         * Map input A1 to memory buffer 0
         * Vref+ = AVcc
         * Vref- = AVss
         * Memory buffer 0 is not the end of a sequence
         */
        ADC12_B_configureMemoryParam configureMemoryParam = {0};
        configureMemoryParam.memoryBufferControlIndex = ADC12_B_MEMORY_0;
        configureMemoryParam.inputSourceSelect = ADC12_B_INPUT_A1;
        configureMemoryParam.refVoltageSourceSelect =
            ADC12_B_VREFPOS_AVCC_VREFNEG_VSS;
        configureMemoryParam.endOfSequence = ADC12_B_NOTENDOFSEQUENCE;
        configureMemoryParam.windowComparatorSelect =
            ADC12_B_WINDOW_COMPARATOR_DISABLE;
        configureMemoryParam.differentialModeSelect =
            ADC12_B_DIFFERENTIAL_MODE_DISABLE;
        ADC12_B_configureMemory(ADC12_B_BASE, &configureMemoryParam);

        ADC12_B_clearInterrupt(ADC12_B_BASE,
                               0,
                               ADC12_B_IFG0
                               );

        //Enable memory buffer 0 interrupt
        ADC12_B_enableInterrupt(ADC12_B_BASE,
                                ADC12_B_IE0,
                                0,
                                0);

        while(1)
        {
            __delay_cycles(5000);

            //Enable/Start sampling and conversion
            /*
             * Base address of ADC12B Module
             * Start the conversion into memory buffer 0
             * Use the single-channel, single-conversion mode
             */
            ADC12_B_startConversion(ADC12_B_BASE,
                                    ADC12_B_MEMORY_0,
                                    ADC12_B_SINGLECHANNEL);

            __bis_SR_register(LPM0_bits + GIE);     // LPM0, ADC12_B_ISR will force exit
            __no_operation();                       // For debugger
        }



}


#if defined(__TI_COMPILER_VERSION__) || defined(__IAR_SYSTEMS_ICC__)
#pragma vector=ADC12_VECTOR
__interrupt
#elif defined(__GNUC__)
__attribute__((interrupt(ADC12_VECTOR)))
#endif
void ADC12_ISR(void)
{
    switch(__even_in_range(ADC12IV,12))
    {
    case  0: break;                         // Vector  0:  No interrupt
    case  2: break;                         // Vector  2:  ADC12BMEMx Overflow
    case  4: break;                         // Vector  4:  Conversion time overflow
    case  6: break;                         // Vector  6:  ADC12BHI
    case  8: break;                         // Vector  8:  ADC12BLO
    case 10: break;                         // Vector 10:  ADC12BIN
    case 12:                                // Vector 12:  ADC12BMEM0 Interrupt


        if(ADC12_B_getResults(ADC12_B_BASE, ADC12_B_MEMORY_0) >= 0x7ff)
        {
            //Set P1.0 LED on
            /*

             * Select Port 1
             * Set Pin 0 to output high.
             */
            GPIO_setOutputHighOnPin(
                GPIO_PORT_P1,
                GPIO_PIN0
                );
        }
        else
        {
            //Set P1.0 LED off
            /*

             * Select Port 1
             * Set Pin 0 to output high.
             */
            GPIO_setOutputLowOnPin(
                GPIO_PORT_P1,
                GPIO_PIN0
                );
        }
//        __bic_SR_register_on_exit(LPM0_bits);   // Exit active CPU
        break;                              // Clear CPUOFF bit from 0(SR)
    case 14: break;                         // Vector 14:  ADC12BMEM1
    case 16: break;                         // Vector 16:  ADC12BMEM2
    case 18: break;                         // Vector 18:  ADC12BMEM3
    case 20: break;                         // Vector 20:  ADC12BMEM4
    case 22: break;                         // Vector 22:  ADC12BMEM5
    case 24: break;                         // Vector 24:  ADC12BMEM6
    case 26: break;                         // Vector 26:  ADC12BMEM7
    case 28: break;                         // Vector 28:  ADC12BMEM8
    case 30: break;                         // Vector 30:  ADC12BMEM9
    case 32: break;                         // Vector 32:  ADC12BMEM10
    case 34: break;                         // Vector 34:  ADC12BMEM11
    case 36: break;                         // Vector 36:  ADC12BMEM12
    case 38: break;                         // Vector 38:  ADC12BMEM13
    case 40: break;                         // Vector 40:  ADC12BMEM14
    case 42: break;                         // Vector 42:  ADC12BMEM15
    case 44: break;                         // Vector 44:  ADC12BMEM16
    case 46: break;                         // Vector 46:  ADC12BMEM17
    case 48: break;                         // Vector 48:  ADC12BMEM18
    case 50: break;                         // Vector 50:  ADC12BMEM19
    case 52: break;                         // Vector 52:  ADC12BMEM20
    case 54: break;                         // Vector 54:  ADC12BMEM21
    case 56: break;                         // Vector 56:  ADC12BMEM22
    case 58: break;                         // Vector 58:  ADC12BMEM23
    case 60: break;                         // Vector 60:  ADC12BMEM24
    case 62: break;                         // Vector 62:  ADC12BMEM25
    case 64: break;                         // Vector 64:  ADC12BMEM26
    case 66: break;                         // Vector 66:  ADC12BMEM27
    case 68: break;                         // Vector 68:  ADC12BMEM28
    case 70: break;                         // Vector 70:  ADC12BMEM29
    case 72: break;                         // Vector 72:  ADC12BMEM30
    case 74: break;                         // Vector 74:  ADC12BMEM31
    case 76: break;                         // Vector 76:  ADC12BRDY
    default: break;
    }
}


就是官方的例程,前面的时钟是我配给uart,怕有干扰,就删掉uart的函数了

使用特权

评论回复
7
火山LF|  楼主 | 2016-8-18 16:20 | 只看该作者
dirtwillfly 发表于 2016-8-18 10:40
不好意思啊,刚看到这个帖子。
adc是怎么初始化的?

群主大人,我单步调试后,发现程序停在了这个地方,如图所示,从ADC的中断出来后,程序就一直停在箭头所指的地方,等待唤醒。


我的问题是:为什么会一直停在是 __bis_SR_register(LPM0_bits + GIE); 这个地方,而不会进入while循环?进入不了while循环就没有开始采样的条件,所以就不会进行采样中断去唤醒MCU。

代码已经在原帖的回帖中贴出。

麻烦指导一下,谢谢。

使用特权

评论回复
8
dirtwillfly| | 2016-8-18 16:44 | 只看该作者
本帖最后由 dirtwillfly 于 2016-8-18 17:17 编辑
火山LF 发表于 2016-8-18 16:20
群主大人,我单步调试后,发现程序停在了这个地方,如图所示,从ADC的中断出来后,程序就一直停在箭头所 ...

调试的时候你可以把进入低功耗状态注释掉。。。。
或者用几个NOP指令代替

使用特权

评论回复
9
dirtwillfly| | 2016-8-18 16:45 | 只看该作者
本帖最后由 dirtwillfly 于 2016-8-18 17:17 编辑

单步调试遇到进入低功耗状态,还有延时循环等等,不要和编译器耗着,会很久的,该跳过跳过,或者注释掉

使用特权

评论回复
10
火山LF|  楼主 | 2016-8-18 17:13 | 只看该作者
dirtwillfly 发表于 2016-8-18 16:45
单步调试遇到进入低功耗状态,还有延时循环等等,不要和编译器耗着,会很久的,该跳过跳过,或者注销掉 ...

群主,我试了一下的确是这样子的,不会卡死。

我还犯了一个错误,说了你肯定会打死我了,我还是不说了

此时此刻的心情无比沉重

感谢群主大大,送你(づ。◕‿‿◕。)づ

使用特权

评论回复
11
Brand2| | 2016-8-19 11:11 | 只看该作者
什么原因造成的

使用特权

评论回复
12
火山LF|  楼主 | 2016-8-19 16:01 | 只看该作者
Brand2 发表于 2016-8-19 11:11
什么原因造成的

不进入低功耗模式就很正常了

使用特权

评论回复
13
dirtwillfly| | 2016-8-19 16:34 | 只看该作者
火山LF 发表于 2016-8-19 16:01
不进入低功耗模式就很正常了

使用特权

评论回复
14
smilingangel| | 2016-8-19 22:21 | 只看该作者
这个转换后的数据的要及时读出来的

使用特权

评论回复
15
lzbf| | 2016-8-19 22:23 | 只看该作者
不是硬件的问题吗?

使用特权

评论回复
16
lzbf| | 2016-8-19 22:27 | 只看该作者
忘了需不要清除标志了。

使用特权

评论回复
17
火山LF|  楼主 | 2016-8-19 22:38 | 只看该作者
smilingangel 发表于 2016-8-19 22:21
这个转换后的数据的要及时读出来的

在while循环中我都清了buf的,然后读出来

使用特权

评论回复
18
火山LF|  楼主 | 2016-8-19 22:39 | 只看该作者
lzbf 发表于 2016-8-19 22:27
忘了需不要清除标志了。

不是会自动清吗?

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

88

主题

816

帖子

16

粉丝