2017-06-02 23 views
2

我發現,當我使用定時器1 micros()功能停止正常運行。我認爲:TCCR1B打破微型()

  1. Arduino的內部功能(除了PWM其上我不使用銷9. 10)使用計時器0
  2. micros()功能實際上不依靠定時器(但米利斯一樣)

如果我稱之爲setup() TCCR1B |= (1 << CS11) | (1 << CS10);

微功能將在約0.25秒後開始報告零星值。例如。之後,micros()會以非常低的速率增加,並且往往會倒退。

我正在測試一個Arduino Uno。

我也試着檢查被調用的定時器中斷是否可能太重。除了一些整數數學和一個數字寫法之外,它沒有做任何事情。

回答

1

根據數據表,第93頁的「帶PWM的8位定時器/計數器0」和第111頁的「帶PWM的16位定時器/計數器1」共享相同的預分頻器模塊,但定時器/計數器可以有不同的預分頻器設置,下面的描述適用於T/C1和T/C0。

所以它可能不是一個與時鐘選擇交互,但你只有64個時鐘來執行中斷並退出它。進入和退出中斷有一些開銷。 DigitalWrite並沒有你想象的那麼快。因此,如果不計算指令時鐘週期,我想我會追求上一條語句的思路 - 通過設置一個標誌來減輕中斷的負載,然後退出。處理主循環中的標誌。當你談到微秒時,迅速擺脫ISR尤其重要。僞代碼:

volatile uint8_t timerflag = 0; 
ISR <timer1_whatever> 
{ 
    timerflag = 1; 
} 

back in main loop: 
if (timerflag == 1) 
{ 
    <do something> 

    timerflag = 0; // reset for next interrupt 
} 

確保您timeflag被聲明爲揮發,因爲它正在改變中斷內部和外界中斷檢查。

+0

謝謝JLH!同時我也發現這是一箇中斷太重的問題。實際上,即使我在一些if語句之後附加一個'return'來突破函數,它仍然會溢出。我想使用計時器來控制步進電機(我想擁有「音調」之類的東西,但也能夠知道所執行步驟的確切數量)。試圖削減脂肪(並可以考慮更快的digitalWrite).. –

+1

我設法解決我的問題,切換到使用Timer2的FlexiTimer2庫。 –