求教关于TIMERA的捕获问题

wangtong0819   2008-11-27 11:33 楼主
使用的芯片是413
采用TA1的捕获模式从P1.2口测量频率周期,在测试板上使用按键模拟待测脉冲信号,结果发现按一次键会发生很多次捕获中断,为查明中断源有查TAIV,结果令人差异。代码如下:
#include "msp430x41x.h"
unsigned int m=1,l=1,o=1,p=1,q=1,s=1;

void initsys()
{
// clock initialization;
WDTCTL = WDTPW + WDTHOLD;
do
{
IFG1 &=~OFIFG; //clear OFIFG interrupt;
for (i = 0xff; i>0; i--);
}

while ((IFG1 & OFIFG) != 0);
SCFI0 |= FN_2; // Set DCO operating range
FLL_CTL0 |= XCAP18PF; // Set load capacitance for xtal
FLL_CTL1 = FLL_DIV_8; // ACLK = 32768 / 8
SCFQCTL = 31; // (31+1) x 32768 = 1,048,576 hz

// interrupt ena××e initialization;
_BIS_SR(GIE);
IE1 = NMIIE;

// Digital I/O initialization;
P1DIR = 0xfb;// P1.2 input,others output;
P1SEL = 0xc4;//P1.2,P1.6,P1.7 Peripheral module function;

// Timer_A initialization
TACTL = TACLR; // clear TAR;
TACCTL1 = CM0 + CCIS_0 + SCS + CAP + CCIE;//capture on rising edges;
//CCI1A input,Synchronous capture;
//Capture mode,interrupt ena××e;
}

/////////////////////////////////
//
// main program
//
/////////////////////////////////
void main( void )
{
initsys();
_EINT();
IE2=BTIE;
TACTL = TASSEL_1 + ID_3 + MC_2;
while(1)
;

}



/////////////////////////////
///// TimerA interrupt //////
/////////////////////////////

#pragma vector=TIMERA1_VECTOR
__interrupt void Timer_A(void)
{
switch(TAIV)
{
case 0:m++;
case 2:s++;
case 4:l++;
case 6:o++;
case 8:p++;
case 10:q++;
default:break;
}
}
按一次键之后,查询m,s,l,o,p,q的值发现m=1,其他五个变量的值都相等,且没有规律。请问各位这会是什么原因呢?

回复评论 (5)

大家帮帮忙哦 是不是我阐述的不清?
点赞  2008-11-27 13:44
程序没仔细看。“结果发现按一次键会发生很多次捕获中断”按键本来就会带来抖动,不知道你有没有滤波,没有滤波的话出现多次捕获也是正常的。
点赞  2008-11-27 15:02
引用:

使用的芯片是413
采用TA1的捕获模式从P1.2口测量频率周期,在测试板上使用按键模拟待测脉冲信号,结果发现按一次键会发生很多次捕获中断,为查明中断源有查TAIV,结果令人差异。代码如下:
#include "msp430x41x.h"
unsigned int m=1,l=1,o=1,p=1,q=1,s=1;

void initsys()
{
// clock initialization;
WDTCTL = WDTPW + WDTHOLD;
do
{
IFG1 &=~OFIFG; //clear OFIFG interrupt;
for (i = 0xff; i>0; i--);
}

while ((IFG1 & OFIFG) != 0);
SCFI0 |= FN_2; // Set DCO operating range
FLL_CTL0 |= XCAP18PF; // Set load capacitance for xtal
FLL_CTL1 = FLL_DIV_8; // ACLK = 32768 / 8
SCFQCTL = 31; // (31+1) x 32768 = 1,048,576 hz

// interrupt ena××e initialization;
_BIS_SR(GIE);
IE1 = NMIIE;

// Digital I/O initialization;
P1DIR = 0xfb;// P1.2 input,others output;
P1SEL = 0xc4;//P1.2,P1.6,P1.7 Peripheral module function;

// Timer_A initialization
TACTL = TACLR; // clear TAR;
TACCTL1 = CM0 + CCIS_0 + SCS + CAP + CCIE;//capture on rising edges;
//CCI1A input,Synchronous capture;
//Capture mode,interrupt ena××e;
}

/////////////////////////////////
//
// main program
//
/////////////////////////////////
void main( void )
{
initsys();
_EINT();
IE2=BTIE;
TACTL = TASSEL_1 + ID_3 + MC_2;
while(1)
;

}



/////////////////////////////
///// TimerA interrupt //////
/////////////////////////////

#pragma vector=TIMERA1_VECTOR
__interrupt void Timer_A(void)
{
switch(TAIV)
{
case 0:m++;
case 2:s++;
case 4:l++;
case 6:o++;
case 8:p++;
case 10:q++;
default:break;
}
}
按一次键之后,查询m,s,l,o,p,q的值发现m=1,其他五个变量的值都相等,且没有规律。请问各位这会是什么原因呢?
按键本身在闭合或断开时就会产生跳动.测量结果一点不值得吃惊.
点赞  2008-11-28 15:27
#pragma vector=TIMERA1_VECTOR
__interrupt void Timer_A(void)
{
switch(TAIV)
{
case 0:m++;
case 2:s++;
case 4:l++;
case 6:o++;
case 8:p++;
case 10:q++;
default:break;
}
}

注意每个Case后都要break,
点赞  2009-3-9 10:23
switch语句不对,按键本身有抖动,当然会出发多次捕获。
点赞  2009-3-9 11:28
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复