我用P1.2,1.3口捕获两个输入方波信号,均上升沿促发。两个捕获计数值差值得出时间差。但是计数差值很不稳定。。一段时间较为正常,一千多。一段时间突然保持在-几万。求助
#include <msp430x14x.h>
long int cap1=0;
long int cap2=0;
long int cap1_array[16];
long int cap2_array[16];
unsigned char flag_cap1=0,flag_cap2=0;
int cap_diff=0;
long int captime_array[16]; // RAM array for differences
unsigned int capture_array[16]; // RAM array for captures
unsigned char index=0,index1=0,index2=0;
unsigned int time=0;
void InitSys()
{
unsigned int iq0; //使用XT2 振荡器
BCSCTL1 &= ~XT2OFF; //打开XT2 振荡器
do
{
IFG1 &= ~OFIFG; //清除振荡器失效标志
for(iq0=0xFF;iq0>0;iq0--); //延时,等待XT2 起振
}
while ((IFG1 & OFIFG)!= 0); //判断XT2 是否起振
BCSCTL2=SELM_2+SELS+DIVS_3; //选择MCLK、SMCLK 为XT2/8
}
void main(void)
{
WDTCTL = WDTPW + WDTHOLD; // Stop watchdog timer
InitSys();
P1DIR &= ~(BIT2+BIT3); // Set 1.2,3 input dir
P1SEL |= (BIT2+BIT3); // Set P1.2,3 cap
CCTL1 |= CM_1 + SCS + CCIS_0 + CAP + CCIE; // Rising edge + CCI0A (P1.1)
CCTL2 |= CM_1 + SCS + CCIS_0 + CAP + CCIE; // + //Capture Mode + Interrupt
CCR0=10000;
TACTL = TASSEL_2 + MC_1+TAIE; // SMCLK + Continuous Mode
_EINT();//打开全局中断控制,若不需要打开,可以屏蔽本句
while(1);
}
#pragma vector=TIMERA1_VECTOR
__interrupt void TimerA(void)
{
switch (TAIV)
{
case 2:
//捕获/比较1 中断
cap1 =time*10000+TACCR1;
cap1_array[index1++]=cap1;
if (index1 == 16)
{
index1 = 0;
//P1OUT ^= 0x01; // Toggle P1.0 using exclusive-OR
}
flag_cap1=1;
break;
case 4:
//捕获/比较2 中断
cap2 =time*10000+TACCR2;
cap2_array[index2++]=cap2;
if (index2 == 16)
{
index2 = 0;
//P1OUT ^= 0x01; // Toggle P1.0 using exclusive-OR
}
flag_cap2=1;
break;
case 10:
//TAIFG 定时器溢出中断
time++;//tar增加到ccr0时产生一次中断
break;
}
if((flag_cap1==1)&&(flag_cap2==1))
{
captime_array[index++] =cap2-cap1; // record
if (index == 16)
{
index = 0;
//P1OUT ^= 0x01; // Toggle P1.0 using exclusive-OR
}
time=0;
flag_cap1=0;
flag_cap2=0;
}
}
此帖出自
小平头技术问答
一周热门 更多>