402261102 发表于 2012-8-30 16:18:36

msp430的AD定时采样问题,只能采样两次怎么回事?

玩MSP430才一两天,今天写了个程序,就是AD定时采样电压,用的定时器A。但是当定时器第三次采样的时候,num值就跳到212左右了。找不到原因,请帮忙看看。每次采样前小灯状态变化。
#include<msp430g2433.h>

#define uint8 unsigned char
#define uint16 unsigned int

uint8 time_flag;
uint16 num;
void Sample (void);

void main(void)
{

WDTCTL = WDTPW+WDTHOLD;
/******TIMER0*******/
P1DIR |= BIT6;
P1OUT &= ~BIT6;
P2DIR |=BIT2;
P2OUT & ~BIT2;
_DINT();
// Setup DCO and VLO
   BCSCTL1 = CALBC1_1MHZ;                // Use 1Mhz cal data for DCO
   DCOCTL = CALDCO_1MHZ;               // Use 1Mhz cal data for DCO
   BCSCTL3 = LFXT1S_2;                   // Use VLO for ACLK12k
   
   _DINT();
   CCTL0=CCIE;
   TACCR0=240;//20ms
   TACTL=TASSEL_1+TACLR+MC_1;
   _EINT();
//LPM3;
while(1)
{
if(time_flag)
{
    Sample();
    time_flag=0;
   if(light>150)
      P1OUT ^= BIT6;//报警LED变化
}
}

#pragma vector=TIMER0_A0_VECTOR   //20ms
__interrupt void Timer0_A0 (void)
{
TACTL=TASSEL_1+TACLR+MC_0;
num++;
if(num==5)
{
    num=0;
    P2OUT ^= BIT2;//采样LED变化
    time_flag =1;
}
TACTL=TASSEL_1+TACLR+MC_1;
//LPM3_EXIT;
}

void Sample (void)//10位ADC采样函数
{
//TACTL=TASSEL_1+TACLR+MC_0;关定时器
unsigned volatile int i;
ADC10CTL0 = ADC10ON + REF2_5V+REFON +ADC10SHT_1 + MSC + ADC10IE + SREF_1;
                                        // ADC on, ref = 1.5V, sampling = 8 clocks
                                        // NOTE: REF takes 30us to settle, But
                                        // because of other instructs
                                        // no need for additional delay loop
ADC10CTL1 = INCH_7 + CONSEQ_2;      // Channel A6, repeat single channel mode
ADC10DTC1 = 4;                                 // Do 4 conversions
ADC10SA = (unsigned int) &light;

i = 6;                              // Delay for OA settling
do i--;
while (i != 0);
ADC10CTL0 |= ENC + ADC10SC;         // Enable and start conversions
ADC10CTL0 &= ~ENC;                  // Clear ENC to stop conversions
//TACTL=TASSEL_1+TACLR+MC_0;开定时器
}


主要问题是当第三次进入中断后time_flag置1,进入采样,执行采样函数后,num变为200多。即使在采样函数中把定时器关了也不行。
用仿真器单步仿真,发现第三次采样时ADC10CTL0 &= ~ENC后,num忽然变大,不知道原因。但前两次采样是好的。

有时间的朋友帮忙看看,不胜感激。初学者,求助啊。

402261102 发表于 2012-8-30 16:19:51

定义哪里少了个定义light 就是采样值。

秋风扫落叶 发表于 2012-8-30 19:55:20

我也是初学者,没有官方的例子么

402261102 发表于 2012-8-31 10:55:18

秋风扫落叶 发表于 2012-8-30 19:55 static/image/common/back.gif
我也是初学者,没有官方的例子么

没有啊,刚接触这芯片。从别人那拿过来玩的。
页: [1]
查看完整版本: msp430的AD定时采样问题,只能采样两次怎么回事?