2016-03-28 84 views
1

我是Arduino編程的新手,嘗試將arduino uno用作高分辨率定時器。我希望能夠在兩個上升沿中斷之間以全16MHz速率計數時鐘週期。我有一些代碼是使用具有4微秒分辨率的micros()函數的功能,我需要比這更好的代碼。這裏就是我想用百萬分之一()用於定時的示例代碼:Arduino TCNT1計數中斷之間的時鐘週期?

volatile int k = 0; 
volatile float t1 = 0; 
volatile float t2 = 0; 

void setup() { 
    // put your setup code here, to run once: 
    Serial.begin(9600); 
    attachInterrupt(digitalPinToInterrupt(2), ISR1, RISING); 
    attachInterrupt(digitalPinToInterrupt(3), ISR2, RISING); 
} 

void ISR2() 
{ 
    k = 1; 
    t1 = micros(); 
    Serial.println(1); 
} 

void ISR1() 
{ 
    k = 2; 
    t2 = micros(); 
    Serial.println(2); 
} 

void loop() 
{ 
    if (t1 != 0 && t2 != 0) { 
    if (t2 - t1 < 0) { 
     t1 = 0; 
     t2 = 0; 
    } 
    else { 
     Serial.print("tdelta "); 
     Serial.print(t2 - t1); 
     t1 = 0; 
     t2 = 0; 
     Serial.println(0); 
    } 

    } 
} 

我意識到,我的百萬分之一時機是很可能感到有些被中斷,這可能是一個問題所抵消。

任何人都可以指向正確的方向嗎?

我想我想使用timer1,因爲它是16位,我的事件應該足夠快,以在任何溢出發生之前完成。我希望找到一種簡單的方法,將第一個中斷設置爲tcnt1爲0,然後計數tcnt1時鐘週期,直到第二個中斷。我甚至不知道如何從tcnt1讀取值,所以我有辦法去。

我搜索了一些例子,但並沒有真正找到合適的例子。一切似乎都是針對定時器中斷,我認爲這不是我所追求的。

我可能缺乏很多必要的理解來使用這個tcnt1計數器,但任何幫助指向我在正確的方向將不勝感激!

謝謝

回答

2

您可以嘗試直接使用定時器寄存器。查看您的特定電路板上使用的CPU的手冊。對於兆豐它是ATmega2560-16AU。定時器寄存器的名稱是TCNT1。你可以存儲它的值:

int t1;// declare global variable somewhere 
t1 = TCNT1; //save timer value in ISRx interrupts 

一定要設置預分頻值TCCR1B.CSn和處理定時器溢出中斷,否則你將失去的時間數據:ISR(TIMER1_OVF_vect)

正如你可以在這裏閱讀精密< 1美國here能被達到。 More info如何直接與CPU定時器寄存器一起工作。

+0

非常感謝您的信息!正是我缺乏的!得到它的工作。 – jtp

相關問題