Arduino 中的定時器暫存器


在之前的文章中,我們使用了 TimerOne 庫向 Arduino 新增定時器中斷。但是,如果我們希望在沒有第三方庫的情況下生成定時器中斷怎麼辦?在這種情況下,您將需要直接處理 Arduino 中的定時器暫存器。在本文中,我們將僅介紹與定時器操作相關的暫存器並解釋其意義。我們還將提供 ATmega328(用於 Arduino Uno)資料手冊的頁碼,您可以在其中找到有關這些暫存器的詳細資訊。

您可以在此處找到資料手冊 -https://ww1.microchip.com/downloads/en/DeviceDoc/Atmel7810-Automotive-Microcontrollers-ATmega328P_Datasheet.pdf

TCCRxA 和 TCCRxB

這些是定時器控制暫存器。x 代表定時器編號。如果您使用的是 Timer0,則將關注 TCCR0A 和 TCCR0B 暫存器。TCCR0A 暫存器(主要是 WGM00 和 WGM01 位,以及來自 TCRR0B 暫存器的 WGM02 位)控制計數器的計數順序。

請檢視下面的圖片 -

通常,使用正常模式或 CTC 模式之一。在正常模式下,您不關心確切的時間間隔。如果您有一個 8 位計數器,則將其值設定為 0,等待其達到 0xFF(對於 16 位則為 0xFFFF),然後生成中斷。在 CTC(比較匹配時清除定時器)模式下,當計數器的值達到 OCRA 暫存器中設定的值時,會生成中斷。這使您可以更好地控制時間間隔。

TCCR0B 的 CS00、CS01 和 CS02 位用於設定時鐘的預分頻器。請參見下圖 -

TCNTx

此暫存器是實際計數發生的地方。它通常初始化為 0。其值與輸出比較暫存器(在 CTC 模式下)進行比較,當值匹配時,會生成中斷。

OCRxA

此暫存器儲存生成所需延遲所需的刻度數。TCNTx 的值不斷與 OCRxA 進行比較,當值匹配時,會生成中斷

TIMSKx

通常,這裡只有 0CIE0A 位很重要。它必須設定為 1 以在 TCNT 暫存器值達到 OCRA 值時啟用中斷。

更新於: 2021 年 5 月 29 日

5K+ 次檢視

啟動您的 職業生涯

透過完成課程獲得認證

開始學習
廣告

© . All rights reserved.