2016-01-29 24 views
0

我是微控制器新手。以下代码测量方波的周期。我标出了一些我不明白的内容。代码如下:使用微控制器测量方波的周期

#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

您找到的答案很容易在网上的文档和其他网站上找到。如果你不知道这些代码是什么意思,那很明显你没有编写代码,在这种情况下,如果你没有正确地研究,你不能指望Stackoverflow的人帮忙。 SO不是教室。这是一个人们自愿帮助其他人陷入困境的地方。请阅读关于什么。有关于它的信息页面。 –

+0

我同意Blurry Sterk。我建议你阅读中断的文档。然后从简单的例子开始,使用定时器中断产生你自己的信号,如[在此描述](http://www.protostack.com/blog/2010/09/timer-interrupts-on-an-atmega168/)。此外,此代码使用计时器中断来测量信号的周期。计时器中断对于创建一个有用。对于测量GPIO中断更合适。当引脚电压变高时,进入中断程序,启动定时器并退出中断。下次读取计时器值并重新启动计时器。 – ursusd8

+1

我的首选方法是读取自由运行计时器计数器并减去以前的值。这消除了进行任何调整的需要。 –

回答

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

PORTB是一组8条输出线。据推测,他们通过总线连接到你没有提到的某个设备。甚至可能是一组LED显示二进制数字。

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

TCNT1 = 0; // why this line? 

既然我们已经记录了拍摄的时间和发送出去PORTB,我们现在要复位定时器用于下一捕捉。

}