我用捕获功能测试脉宽,单片机是MSP430F5529LP(捕获管脚在P1.2和P1.3), 时钟选择的SMCLK(默认1MHZ),然后选择的捕获源是CCIXA对应的应该是P1.2,然后这是我的一段代码,不知道哪里出了问题,我捕获一个50KHZ,占空比为50%的方波一直捕获不到!
#include <msp430.h>#define uchar unsigned char
#define uint unsigned int
uint start,end,cha;
void main(){
WDTCTL = WDTPW+WDTHOLD;
P1SEL|=BIT2;
TA0CCTL1 |=CAP+CM_3+CCIS_0+SCS+CCIE;//捕获模式,上升和下降都捕获,选择CCI2A,同步,捕获中断开
TA0CTL |= TASSEL_2 + MC_2; //SMCLK=1M,连续计数模式_EINT();
LPM0;while(1);
}
#pragma vector=TIMER0_A0_VECTOR
__interrupt void TIMER0_A0_ISR(void){
switch(TA0IV) {
case 2:
if(TA0CCTL1&CCI) start=TA0CCR1; else end=TA0CCR1; cha=start-end;
break;
default:break;
}
LPM0_EXIT;
}
Fuchong Wang:
增大MCLK试试看?
没仔细算,50k——100K不小呀
Fuchong Wang:
增大MCLK试试看,也许100K也就是10us,也许很紧张呀,没仔细算,中断本身延时多少个MCLK的来着?
if(TA0CCTL1&CCI) start=TA0CCR1; else
{end=TA0CCR1; cha=start-end;
}
是不是少{}号?否则上升沿也要计算?
james may:
回复 Fuchong Wang:
已经找到原因了,是中断向量的问题。。。
pengcheng zhang1:
回复 james may:
你好,能介绍一下你是怎么解决的么,我也遇到了同样的问题
Fuchong Wang:
回复 pengcheng zhang1:
根据楼主自己的回答,
应该改成#pragma vector=TIMER0_A1_VECTOR
这玩艺是在开发环境软件包含的头文件中定义的,不是经常使用,很容易记不住混淆。记不太清楚了,好像对于不同器件定义所使用的默认规则有时候好像还不太一样,例如对于配置特别低的型号,这就可能往往引起混淆不清。
所以,作为保守态度,最好要跳转到头文件中核实一下,往往对照头文件中的注释就可确定。跳转查看的方法可以利用开发环境的功能查看定义。
一般有这样的形式:
TIMERx_Ay_VECTOR
其中x由定时器的数目定,注意是定时期的数目而不是一个定时期的CCR模块数目定
y只能为0或1,定时器的CCR0模块的中端向量地址是单独的,其它模块和定时计数器本身公用一个
yang he3:
回复 james may:
能解释一下吗,我用捕捉一直都没调出来