#include "msp430x44x.h" // Standard Equations
#define Num_of_Results 8
static unsigned int A0results[Num_of_Results]; // These need to be global in
static unsigned int A1results[Num_of_Results]; // this example. Otherwise, the
static unsigned int A2results[Num_of_Results]; // compiler removes them because
static unsigned int A3results[Num_of_Results]; // they are not used
static unsigned int index = 0;
static unsigned long int cnt = 0;
/*************************************************************************/
void init_timerA()
{
TACTL=SSEL0+TACLR;
TACCTL0=CCIE;
TACCR0=32768;
}
/***************************************************************************/
void main(void)
{
WDTCTL = WDTPW+WDTHOLD; // Stop watchdog timer
P6SEL = 0x0F; // Ena××e A/D channel inputs
ADC12CTL0 = ADC12ON+MSC+SHT0_8+REFON+REF2_5V; // Turn on ADC12, extend sampling time
// to ××oid overflow of results
ADC12CTL1 = SHP+CONSEQ_3; // Use sampling timer, repeated sequence
ADC12MCTL0 = INCH_11+SREF_1; // ref+=××cc, channel = A0
ADC12MCTL1 = INCH_11+SREF_1; // ref+=××cc, channel = A1
ADC12MCTL2 = INCH_11; // ref+=××cc, channel = A2
ADC12MCTL3 = INCH_11+EOS; // ref+=××cc, channel = A3, end seq.
ADC12IE = 0x08; // Ena××e ADC12IFG.3
ADC12CTL0 |= ENC; // Ena××e conversions
init_timerA();
_EINT(); // Ena××e interrupts
TACTL|=MC0;
ADC12CTL0 |= ADC12SC; // Start conversion
_BIS_SR(LPM0_bits); // Enter and stay in LPM0
}
#pragma vector=ADC_VECTOR
__interrupt void adc()
{ ADC12IFG=0;
A0results[index] = ADC12MEM0; // Move A0 results, IFG is cleared
A1results[index] = ADC12MEM1; // Move A1 results, IFG is cleared
A2results[index] = ADC12MEM2; // Move A2 results, IFG is cleared
A3results[index] = ADC12MEM3; // Move A3 results, IFG is cleared
index = (index+1)%Num_of_Results; // Increment results index, modulo
cnt++;
ADC12CTL0 &=~ ENC;(后来加入的)
}
#pragma vector=TIMERA0_VECTOR
__interrupt void TIMERA0()
{ADC12IE = 0;
ADC12CTL0 &=~ ENC;
TACTL=0;
}
刚开始我想测量1秒钟ad转换的次数;用timerA定时一秒中断后停止ad转换;
但发现cnt变量一直在增加
后来我在AD中断中断停止AD,的确转换了一次,这就怪了,为什么一秒到后
cnt还不停止?
你的程序具体我没有看,说一点你注意一下是不是这个问题:序列通道多次采样,比如你要才16次,但第15次你就要将ENC复位。因为你第十六次进中断再复位的话,第十七次已经开始采样了,会多采一次。
好像是我的TIMERA坏了
用TIMERB就解决问题了
引用:
你的程序具体我没有看,说一点你注意一下是不是这个问题:序列通道多次采样,比如你要才16次,但第15次你就要将ENC复位。因为你第十六次进中断再复位的话,第十七次已经开始采样了,会多采一次。
|
|
但是如果中断执行完AD还没有转换结束,那么第16次的值就不能获得了
是否是这样的?
停止的条件的ENC↓并且EOS=1;
十五次的时候拉低,只满足一个条件,16次会正常采样,到了16次完成两个条件都满足就退出了。
你的意思是说 如果AD正在转换时,ENC为0并不能使AD停止,当本次转换完毕后才停止