2016-01-29 23 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,我們現在要復位定時器用於下一捕捉。

}