Part Number:MSP430F5438A
void TIMEB_init( void )
{
//P4.7 为时钟输入,P4.0为上下沿捕捉
TB0CTL = TBSSEL_0 + ID_0 + TBCLR ; //TB0CLK输入,不分频,自动清0和分频参数
TB0CCTL0 = CM_3 | CAP | CCIE | CNTL_0 | CCIS_0 ; //上下沿捕捉,捕捉模式,有中断, 16位模式,P4.0输入,必须是异步捕捉
//P4.0 :1K频率的方波输入 P4DIR &= ( ~BIT0 ); // P4.0 input
P4SEL |= BIT0 ; // P4.0 配为TB0.0输入
/ /P4.7 : 156K的信号计数输入 P4DIR &= ( ~BIT7 ); // P4.0 input
P4SEL |= BIT7 ; // P4.7 配为 TB0CLK 输入
TB0CTL |= MC_2 ; //增计数模式,到65535
TB0R = 0 ; //初始化计数值
}
//TIMERB 口中断服务程序,U8_1Q中断程序
#pragma vector = TIMER0_B0_VECTOR
__interrupt void timer_b0_isr(void)
{
if( TB0CCTL0 & CCI ){ //捕捉到高电平 数据
Counter_156K = TB0CCR0 ; //保存数据
}else{ //捕捉到低电平
TB0CTL |= TBCLR ; //计数器清0
}
TB0CCTL0 &= (~CCIFG) ; //清中断标志
}
程序目的:捕捉的信号是P4.0,上下沿都捕捉,并且产生中断信号,当捕捉到P4.0的上升沿时,把此刻的P4.7输入的方波信号的计数值保存起来
结论: 有时保存的计数值会不正确,大部分是正确的。
请问什么情况下,会不正确。
我把中断程序修改成下面的程序时,计数就正确了,没发现计数错误。
//TIMERB 口中断服务程序,U8_1Q中断程序
#pragma vector = TIMER0_B0_VECTOR
__interrupt void timer_b0_isr(void)
{
if( TB0CCTL0 & CCI ){ //捕捉到高电平 数据
Counter_156K = TB0R ; //保存数据,采用了计数寄存器,而不是捕捉寄存器
}else{ //捕捉到低电平
TB0CTL |= TBCLR ; //计数器清0
}
TB0CCTL0 &= (~CCIFG) ; //清中断标志
}
请问:我修改后的中断程序,这样来捕捉计数值,可以吗?会有什么问题,谢谢
user5125120:
请问:定时器捕捉计数,P4.7作为TIMER_B的时钟输入,捕捉P4.0的上升沿和下降沿,目的是对P4.0的下降沿的时间,进行计数,请问上述中断程序写法,应该用TB0CCR0,还是用TB0R的寄存器值,请指教,谢谢
,
Cherry Zhou:
您好我们已收到您的问题并升级到英文论坛,如有答复将尽快回复您。谢谢!
,
Cherry Zhou:
user5125120 说:
结论: 有时保存的计数值会不正确,大部分是正确的。
请问什么情况下,会不正确。
您好,请问您指的正确与不正确的判断依据是什么?您是怎样判定是否正确的?
TB0CCR0 包含捕获的值。 TB0R 会简单地与此匹配,但如果保持计数的话,就不会匹配。通常建议您在使用捕捉时不要清除计数器,因为它会在值中引入错误 (太小)。 相反地,让计数器运行并减去连续捕获值,还可以将中断负载减半。