大家好,团队
客户提出的问题可能需要您的帮助:
void TIEB_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:1-K 频率方波输入
P4DIR &=(~BIT0);// P4.0输入
P4SEL |= BIT0;// P4.0配置为 TB0.0输入
//P4.7:156K 信号计数输入
P4DIR &=(~BIT7);// P4.0输入
P4SEL |= BIT7;// P4.7配置为 TB0CLK 输入
TB0CTL |= MC_2;//UP 计数模式,至65535
TB0R =0;//初始化计数值
}
//TIMERB 端口中断服务计划,U8_1Q 中断计划
#pragma 引导程序= TIMER0_B0_Vector
中断 void timer_b0_ISR (void)
{
IF( TB0CCTL0 & CCI ){// 捕获高级数据
counter_156K = TB0CCR0;//存储数据
}否则 //捕获的低级数据
TB0CTL |= TBCLR;//计数器被清除
}
TB0CCTL0 &=(~CCIFG);//清除中断标志
}
目的:捕获的信号为 P4.0,捕获上边缘和下边缘,并生成中断。 捕获 P4.0的上升边缘时,会保存在 P4.7中此时输入的方波信号的计数值。
结果:有时保存的计数值不正确,大部分是正确的。 客户希望知道什么时候出错。 当他们将中断程序修改为以下程序时,计数是正确的,未发现错误:
//TIMERB 端口中断服务计划,U8_1Q 中断计划
#pragma 引导程序= TIMER0_B0_Vector
中断 void timer_b0_ISR (void)
{
IF( TB0CCTL0 & CCI ){// 捕获高级数据
counter_156K = TB0R; //存储数据,而不是捕获寄存器,使用计数寄存器
}否则 //捕获的低级数据
TB0CTL |= TBCLR;//清除计数器
}
TB0CCTL0 &=(~CCIFG);//clear 中断标志
}
1.用上述修改的中断程序捕获计数值是否正常?
2. 定时器捕获计数,P4.7是 TIMER _B 的时钟输入,用于捕获 P4.0的上升和下降边缘,以计算 P4.0下降边缘的时间。 上述中断程序是否应该使用 TB0CCR0或 TB0R 的寄存器值写入?
下面是编写中断函数的另一种方法,是否有任何区别? 两者都能正常工作吗?
//TIMERB 端口中断服务计划,U8_1Q 中断计划
#pragma 引导程序= TIMER0_B0_Vector
中断 void timer_b0_ISR (void)
{
IF( TB0CCTL0 & CCI ){// 捕获高级数据
counter_156K = TB0CCR0;//数据使用捕获寄存器保存
}否则 //捕获的低级数据
TB0CTL |= TBCLR; //清除计数器
}
TB0CCTL0 &=(~CCIFG);//clear 中断标志
}
请帮您检查此案例? 谢谢。
此致,
樱桃