assembly AVR组件-停止时定时器1输入捕获?

o3imoua4  于 2023-01-02  发布在  其他
关注(0)|答案(1)|浏览(171)

我在atmega328上使用输入捕获模式下的Timer1来测量PDM编码信号的周期持续时间(用于根据DCC NMRA标准控制模型铁路)。x1c 0d1x捕获在引脚ICP1上信号的下降沿触发。TCNT1在每次捕获后复位,以避免16位减法(更不用说占用4个寄存器)来获得脉冲持续时间。

我的问题是

计数器停止时是否抛出TIMER1 CAPTURE中断?我无法从微控制器数据手册中推断出这一点。
如果是这样,我可以通过使第一次读取= 0x 0000来获得一个小优势。然后,我将预分频器设置为fCLK_I/O:8来启动定时器。
有没有人试过这个,可以帮上忙?
干杯,
劳拉。

sq1bmfud

sq1bmfud1#

我目前没有访问任何AVR硬件超过圣诞节,但由内存-不,输入捕获中断将不会设置时,定时器停止。
但是,如果您担心AVR上16位减法的计算负担:
1.检查生成的程序集是否有16位减法,您会惊讶地发现这需要的周期是如此之少。
1.无论如何,第1点有点无实际意义--如果我正确理解了您的要求,即只计算中断之间的时间,那么您不需要做任何减法。如果这是您需要做的,请将TCNT=0设置为TIMER1_CAPTURE ISR执行的最后一次操作。下次执行ISR时,ISR首先读取TCNT 1。现在,中断之间有时间间隔(假设TCNT 1没有溢出,则必须设置预分频器值,以确保定时器不会在脉冲/ISR之间的预期周期内溢出)。
假设avr-gcc,您可以根据需要将TCNT 1的值赋给volatile全局变量或volatile文件作用域变量:

ISR(TIMER1_CAPT_vect)
{
    x = TCNT1;
    TCNT1 = 0;
}

或者调用ISR中的其他函数,将TCNT 1作为参数(在AVR ISR中调用函数会带来性能上的挑战,但这仍然是非常常见的。

ISR(TIMER1_CAPT_vect)
{
    process_the_timer_count(TCNT1);
    TCNT1 = 0;
}

相关问题