zzq963254 发表于 2013-7-17 19:12:10

关于MSP430的ADC DTC传输问题

#include"msp430g2553.h"

void wait_ref_ready()//等待ADC参考源设置完成
{
//与_EINT()功能一致,打开总中断
__enable_interrupt();                     // Enable interrupts.
TACCR0 = 30;                              // Delay to allow Ref to settle
TACCTL0 |= CCIE;                        // 打开TACCR0中断
TACTL = TASSEL_2 | MC_1;                  // TACLK = SMCLK, Up mode.
LPM0;                                     // Wait for delay.
TACCTL0 &= ~CCIE;                         // 关闭TACCR0中断
__disable_interrupt();                  //关闭总中断   
}

void main(void)
{
unsigned int loop,sample;
unsigned int Sum;
unsigned int *pointer;
pointer = 0x00;

//关闭看门狗
WDTCTL = WDTPW + WDTHOLD;               // Stop WDT
//单通道重复采样,选择A1通道采样
ADC10CTL1 = CONSEQ_2 + INCH_2;            // Repeat single channel, A1
//选择参考源Vref+,Vss。16个转换时钟,参考源开启,2.5V,ADC10模块开启,打开ADC中断
ADC10CTL0 =SREF_1+ ADC10SHT_2 + REFON + MSC + REF2_5V+ ADC10ON + ADC10IE; // ADC10ON, interrupt enabl
wait_ref_ready();
//采样32次
ADC10DTC1 = 0x20;                         // 32 conversions
//P1.1作为采样通道
ADC10AE0 |= 0x04;                         // P1.1 ADC option select
//P1.0设置为输出
P1DIR |= 0x01;                            // Set P1.0 to output direction
P1OUT = 0x01;   //灯亮
for (;;)
{
   
    Sum = 0x00;
    //关闭ADC使能开关
    ADC10CTL0 &= ~ENC;
    //等待ADC10模块不忙
    while (ADC10CTL1 & BUSY);               // Wait if ADC10 core is active
    ADC10SA = 0x200;                        // Data buffer start
    //启动ADC转换
    ADC10CTL0 |= ENC + ADC10SC;             // Sampling and conversion start
    //进入低功耗模式LPM0,开总中断
    __bis_SR_register(CPUOFF + GIE);      // LPM0, ADC10_ISR will force exit
   for(loop = 0; loop < 0x20; loop++)
    {
       sample=*(pointer+0x200+loop);
//       if(sample > MAX) sample =MAX ;
//       if(sample < MIN) sample =MIN ;
//       Sum += (sample & 0x03ff);   
       Sum += sample;
    }
    Sum = Sum/2;
    if(Sum > 0x1ff)
       P1OUT &= 0xfe;   //灯灭
    else
       P1OUT |=0x01;    //灯亮
   
}
}

// ADC10 interrupt service routine
#pragma vector=ADC10_VECTOR
__interrupt void ADC10_ISR(void)
{
__bic_SR_register_on_exit(CPUOFF);      // Clear CPUOFF bit from 0(SR)
}


#pragma vector=TIMER0_A0_VECTOR
__interrupt void ta0_isr(void)
{
TACTL = 0;    //关闭计数器,退出LPM0模式
LPM0_EXIT;                              // Exit LPM0 on return
}


请教各位大神,我的程序哪里出问题了,为什么P1.1口电平总是VCC,导致sample一直为1024?就算P1.1接GND也是一样。。。
页: [1]
查看完整版本: 关于MSP430的ADC DTC传输问题