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忽然变大,不知道原因。但前两次采样是好的。
有时间的朋友帮忙看看,不胜感激。初学者,求助啊。
定义哪里少了个定义light 就是采样值。 我也是初学者,没有官方的例子么 秋风扫落叶 发表于 2012-8-30 19:55 static/image/common/back.gif
我也是初学者,没有官方的例子么
没有啊,刚接触这芯片。从别人那拿过来玩的。
页:
[1]