Hempl/計時器
AT32UC3A 具有三個 16 位倒計時計時器,可以以三種不同的頻率執行,彼此獨立。當它們設定為以高頻率執行時,計時精度更高,但最長的可能延遲更短。
只有一小部分時鐘頻率可用,這些頻率從 16.5MHz 的 PBA 匯流排頻率下降。
| 除數 | 時鐘頻率 | 最長延遲 |
|---|---|---|
| PBA/2 | 8.25 MHz | 7.94 毫秒 |
| PBA/8 | 2.0625 MHz | 31.77 毫秒 |
| PBA/32 | 515.625 kHz | 0.127 秒 |
| PBA/128 | 128.906 kHz | 0.508 秒 |
除了這四種選擇之外,晶片還提供從外部 32768Hz 即時精度晶體執行任何計時器的功能。從 1.3.2 版本開始的 Mizar32 板有該元件 (X2) 的空間,可以在其中安裝。
Hempl 提供了一個 timer 庫來訪問即時計數器。
可以使用計時器 ID 0 和 1 直接訪問前兩個硬體計時器。Hempl 使用 16.5MHz 的 PBA 頻率,預設情況下,時鐘速率設定為最低可用頻率 128906Hz,計時精度約為百萬分之一秒,最大延遲略高於半秒。
可以使用第一個計時器實現等待十分之一秒的方法如下:
(tmr-delay 0 100000)
這些可用於實現高精度短延遲。
對於前兩個計時器中的任何一個,您可以設定比預設的 129kHz 更高的時鐘速率。但是,如上表所示,僅支援四個值,其中 PBA 頻率 = 16.5MHz。其他值將設定算術上最接近的可用頻率。
以下示例將計時器 1 設定為最高可能的計時精度,最大延遲為 7.94 毫秒:
(prinl (tmr-setclock 1 10000000) )
上面的程式碼將 8250000 作為輸出列印。
無法直接訪問第三個硬體計時器,而是使用它來生成四個“虛擬計時器”,它們的計時器 ID 為 tmr-virt-0 到 tmr-virt-3。這些具有較低的滴答頻率和精度——每秒十次——但可用於建立最長 35 分鐘的整數 eLua 或 142 年的浮點 eLua 延遲。
(tmr-delay tmr-virt-0 5000000) # Wait for five seconds
這些用於實現較低精度的較長延遲,但無法更改虛擬計時器的時鐘速率。
從 20120123 韌體版本開始,存在第三種計時器機制,即系統計時器 tmr.SYS_TIMER,其精度為百萬分之一秒,可用於提供高達 35 分鐘的整數 Lua 和高達 142 年的浮點 Lua 高精度延遲和計時,但您無法更改系統計時器的時鐘頻率,並且它不能用於生成中斷(見下文)。
所有三種計時器都可用於使您的程式等待指定的時間,如上面的示例所示。延遲的精度和可用的最大延遲取決於使用的計時器型別。通常,系統計時器最適合所有型別的延遲,因為它具有高精度並且可以執行長時間延遲。
有時,瞭解自某個先前時刻起經過了多少時間可能很有用,例如,測量程式碼的速度,或者當您需要在經過一定時間後做出某些決策,但還需要在等待時執行其他操作時。
此示例透過在控制檯中列印“Go!”來測量人們的反應時間,然後檢視他們需要多長時間才能按下鍵以進行響應。我們將為此使用系統計時器。
當然,如果您在它說 Go!之前按下 Enter,它會說您的反應非常快。
在 PicoLisp 中
# A reaction timer in picolisp
(de reaction-timer ()
(prinl "Welcome to the reaction timer. When I say Go!, enter a character.")
(prinl "Press q [Enter] to quit.")
(setq
timer *tmr-sys-timer*
answer "" )
(until (=T answer)
(println "Ready?")
# Wait for a random time from 2 to 5 seconds
(tmr-delay timer (+ 2000000 (rand 1 3000000)))
(println "Go!")
(setq
start-time (tmr-read timer)
answer (read) # wait for them to enter any character
end-time (tmr-read timer) )
請注意:您也可以從我們在 github 上的示例儲存庫中下載上面的程式碼 reaction.l。
請注意:目前 PicoLisp 不支援中斷處理。請參見 問題 #12。
- Atmel AT32UC3A 資料手冊 第 31 章:計時器/計數器 (TC),eLua 參考手冊中的 tmr 模組
- eLua 參考手冊中的虛擬計時器.