This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

430f5529测方波频率的问题——定时器在中断时停止吗?

//P1.2输入方波,测出频率,并在1602上显示

#include <msp430.h>
#include"LCD1602.h"

#define uint unsigned int

#define MCLK 1048.576


uint lastCCR1=0;
uint time=0;

uint l=0;
uchar str[10 ];

void PRNT_MCLK(uint time)
{
l=10*MCLK/time;
str[0]=48+l/10000;
str[1]=48+(l%10000)/1000;
str[2]=48+(l%1000)/100;
str[3]=48+(l%100)/10;
str[4]='.';
str[5]=48+l%10;
str[6]='k';
displaystring(1,0,7,str);//在第0行第0列开始显示str字符串
}

//这段把k对应的频率进行显示

void main(void) {

WDTCTL = WDTPW | WDTHOLD; // Stop watchdog timer
//*****初始化LCD602********************************

init_1602( );
//******信号捕获**************************************
TA0CTL = TASSEL_2+ MC_2 + TACLR; // SMCLK, 连续模式, clear TAR
TA0CCTL1=CM_1+CCIS_0+CAP+CCIE;//上升沿捕获

P1DIR&=~BIT2;
P1SEL=BIT2;  //P1.2输入一定频率的方波


uchar tip[ ]={"Frequency:"};
uchar unit[2]={"Hz"};
displaystring(0,0,10,tip);
displaystring(1,7,2,unit);//这几句显示描述语,无关紧要,也没有问题


__enable_interrupt(); //开启总中断
while(1);
}


#pragma vector=TIMER0_A1_VECTOR
__interrupt void TIMER0_A1_ISR(void)
{
switch(__even_in_range(TA0IV,14))
{
case 2:
time=A*65536+TA0CCR1-lastCCR1;//k为两次上升沿之间的计数值

PRNT_MCLK(time);//显示频率

lastCCR1=TA0CCR1;

break;


case 14:A++;break;//连续模式下,记录TAR溢出次数
default:break;
}
}

lcd1602.h就不给出了,那个没问题,主要问题在于频率只能测几百HZ到30kHz,而且lcd显示的数字变化厉害(比如在28.0和14.0间快速跳动)。

想问一下各位我这样写的程序有没有问题,问什么测量范围那么小?要怎么改进?

此外我不知道定时器中断时,计时器还计数吗?比如说进入了case 2,那case 2里面的程序段执行时间的长短会怎样影响time值的测量?