使用微控制器测量方波的周期

时间:2016-01-29 09:33:12

标签: microcontroller avr atmega16

我是微控制器的新手。以下代码测量方波的周期。我标记了一些我不理解的线条。代码如下:

#include <avr/io.h>
#include <avr/interrupt.h>

ISR(TIMER1_CAPT_vect)
{
    int counter_value = ICR1; //16 bit value
    PORTB = (counter_value >> 7); // What has been done here?
    TCNT1 = 0; // why this line?

}

int main(void)
{
DDRB = 0xFF;
TCCR1A = 0x00;
TCCR1B = 0b11000010;
TIMSK = 0b00100000;
sei();
while(1);
cli();
}

在这些方面实际做了什么?

1 个答案:

答案 0 :(得分:0)

ISR(TIMER1_CAPT_vect)
{
    int counter_value = ICR1; //16 bit value
    PORTB = (counter_value >> 7); // What has been done here?

PORTB是一组8个输出行。据推测,它们通过总线连接到您未提及的某些设备。甚至可能是一组LEDS来显示二进制数。

计数器的结果是16位。要获得最高有效位,请将结果向右移动以丢弃较低有效位。 (此操作失去精度,但您只有8位输出,而不是16位。)至于为什么移位只有7而不是8,或者为什么计数器的无符号值首先保存为有符号的int,我不知道我知道。我怀疑这是一个错误。我会改为PORTB = (ICR1 >> 8);

    TCNT1 = 0; // why this line?

由于我们已经记录了捕获的时间并将其发送出PORTB,我们现在想要重置定时器以进行下一次捕获。

}