使用微控制器测量方波的周期
Measuring the period of a square wave using microcontroller
我是微控制器的新手。以下代码测量方波的周期。我标记了一些我不明白的行。代码如下:
#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();
}
这些行实际上做了什么?
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,或者为什么计数器的无符号值首先保存为有符号整数,我不知道'不知道。我怀疑这是一个错误。我会做 PORTB = (ICR1 >> 8);
相反。
TCNT1 = 0; // why this line?
由于我们已经记录了捕获的时间并将其发送出去PORTB
,我们现在想要为下一次捕获重置计时器。
}
我是微控制器的新手。以下代码测量方波的周期。我标记了一些我不明白的行。代码如下:
#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();
}
这些行实际上做了什么?
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,或者为什么计数器的无符号值首先保存为有符号整数,我不知道'不知道。我怀疑这是一个错误。我会做 PORTB = (ICR1 >> 8);
相反。
TCNT1 = 0; // why this line?
由于我们已经记录了捕获的时间并将其发送出去PORTB
,我们现在想要为下一次捕获重置计时器。
}