AVR單片機(學習ing)—(四)、ATMEGA16的定時/計數(shù)器—01
四、ATMEGA16的定時/計數(shù)器
四—(01)、四位顯示秒表試驗
首先懷念一下咱們的體育課,再體育課或者田徑比賽的時候,老師會經常使用秒表來記錄同學們的成績。在此,來進行一個秒表的設計。(說實話,這個秒表真的太貴了,不過只是實驗,純屬娛樂)
使用INT0鍵進行計時的開始/停止,使用S1鍵作為計時值得清楚,并且采用6位數(shù)碼管的右四位進行顯示。
定時器T0被用作掃描4位數(shù)碼管(采用溢出中斷,每1ms中斷一次),而定時器T1則用來計時(咱們用的秒表用來顯示四位,兩位小數(shù),也就是每計時10ms中斷溢出一次)。
1、預分頻器和多路選擇器
ATMEGA16有兩個8位定時/計數(shù)器(T/C0、T/C2)和一個16位定時/計數(shù)器(T/C1)。
ATMEGA16的定時器/計數(shù)器時鐘是可選擇的。其時鐘部分包括預分頻器和一個多路選擇器。預分頻器課被認為是一個有多級輸出的分頻器。ATMEGA16用一個10位的計數(shù)器把輸入的時鐘分為4種可選擇的分頻輸出。多路選擇器可設置使用其中一個分頻輸出,或者不適用分頻輸出和使用外部引腳輸入時鐘。
看圖看真相:(其中只有0和1的,2的同理啊~好像那個0和1共用一個,具體我給忘記了,自己看datasheet~)
2、8 位定時器/ 計時器0
T/C0 是一個通用的單通道8 位定時器/ 計數(shù)器模塊。其主要特點如下:
? 單通道計數(shù)器
? 比較匹配發(fā)生時清除定時器( 自動加載)
? 無干擾脈沖,相位正確的PWM
? 頻率發(fā)生器
? 外部事件計數(shù)器
? 10 位的時鐘預分頻器
? 溢出和比較匹配中斷源 (TOV0 和 OCF0)
Figure 27為8位定時器/計數(shù)器的簡化框圖(說實話,我也看不懂啊~~)
寄存器:
T/C(TCNT0)和輸出比較寄存器(OCR0)為8位寄存器。中斷請求(圖中簡寫為Int.Req. ) 信
號在定時器中斷標志寄存器TIFR 都有反映。 所有中斷都可以通過定時器中斷屏蔽寄存器
TIMSK 單獨進行屏蔽。圖中沒有給出TIFR 和TIMSK。
T/C可以通過預分頻器由內部時鐘源驅動,或者是通過T0 引腳的外部時鐘源來驅動。時鐘
選擇邏輯模塊控制使用哪一個時鐘源與什么邊沿來增加( 或降低)T/C 的數(shù)值。如果沒有
選擇時鐘源T/C 就不工作。時鐘選擇模塊的輸出定義為定時器時鐘clkT0。
雙緩沖的輸出比較寄存器OCR0 一直與T/C 的數(shù)值進行比較。比較的結果可用來產生
PWM波,或在輸出比較引腳OC0上產生變化頻率的輸出。比較匹配事件還將置位比較標志OCF0。此標志可以用來產生輸出比較中斷請求。
定義:
本文的許多寄存器及其各個位以通用的格式表示。小寫的“n” 取代了T/C 的序號,在此即
為0。小寫的“x” 取代了輸出比較單元通道,在此即為通道A。但是在寫程序時要使用精
確的格式,例如使用TCNT0 來訪問T/C0 計數(shù)器值,等等。
T/C 時鐘源:
T/C 可以由內部同步時鐘或外部異步時鐘驅動。時鐘源是由時鐘選擇邏輯決定的,而時鐘
選擇邏輯是由位于T/C 控制寄存器TCCR0 的時鐘選擇位CS02:0 控制的。
計數(shù)器單元:
8位T/C的主要部分為可編程的雙向計數(shù)單元。 Figure 28 即為計數(shù)器和周邊電路的框圖。
根據(jù)不同的工作模式,計數(shù)器針對每一個clkT0 實現(xiàn)清零、加一或減一操作。clkT0 可以由
內部時鐘源或外部時鐘源產生,具體由時鐘選擇位CS02:0 確定。沒有選擇時鐘源時
(CS02:0 = 0) 定時器即停止。但是不管有沒有clkT0,CPU 都可以訪問TCNT0。CPU 寫操
作比計數(shù)器其他操作( 如清零、加減操作) 的優(yōu)先級高。
計數(shù)序列由T/C 控制寄存器 (TCCR0) 的WGM01 和WGM00 決定。計數(shù)器計數(shù)行為與輸
出比較OC0 的波形有緊密的關系。有關計數(shù)序列和波形產生的詳細信息請參考P72“ 工作
模式” 。
T/C溢出中斷標志TOV0根據(jù)WGM01:0 設定的工作模式來設置。TOV0可以用于產生CPU
中斷。
輸出比較單元:
8位比較器持續(xù)對TCNT0和輸出比較寄存器OCR0進行比較。一旦TCNT0等于OCR0,比
較器就給出匹配信號。在匹配發(fā)生的下一個定時器時鐘周期輸出比較標志OCF0 置位。若
此時OCIE0 = 1 且SREG 的全局中斷標志I 置位,CPU 將產生輸出比較中斷。執(zhí)行中斷
服務程序時OCF0 自動清零,或者通過軟件寫”1” 的方式來清零。根據(jù)由WGM21:0 和COM01:0 設定的不同的工作模式,波形發(fā)生器利用匹配信號產生不同的波形。同時,波
形發(fā)生器還利用max 和bottom 信號來處理極值條件下的特殊情況
Figure 29 為輸出比較單元的方框圖。
使用PWM 模式時OCR0 寄存器為雙緩沖寄存器;而在正常工作模式和匹配時清零模式
雙緩沖功能是禁止的。雙緩沖可以將更新OCR0 寄存器與top 或bottom 時刻同步起來,
從而防止產生不對稱的PWM 脈沖,消除了干擾脈沖。
訪問OCR0 寄存器看起來很復雜,其實不然。使能雙緩沖功能時,CPU 訪問的是OCR0
緩沖寄存器;禁止雙緩沖功能時CPU 訪問的則是OCR0 本身。(好了,你笨上就這么多吧,我還是看書上的排版比較好啊~~datasheet真的好大啊~``)
3、8位定時/計數(shù)器0的寄存器
1)T/C 控制寄存器- TCCR0
? Bit 7 – FOC0: 強制輸出比較
FOC0僅在WGM00指明非PWM模式時才有效。但是,為了保證與未來器件的兼容性,在
使用PWM 時,寫TCCR0 要對其清零。對其寫1 后,波形發(fā)生器將立即進行比較操作。
比較匹配輸出引腳 OC0 將按照COM01:0 的設置輸出相應的電平。要注意FOC0 類似一
個鎖存信號,真正對強制輸出比較起作用的是COM01:0 的設置。
FOC0不會引發(fā)任何中斷,也不會在利用OCR0作為TOP的CTC模式下對定時器進行清零
的操作。
讀FOC0 的返回值永遠為0。
? Bit 6, 3 – WGM01:0: 波形產生模式
這幾位控制計數(shù)器的計數(shù)序列,計數(shù)器的最大值TOP,以及產生何種波形。T/C 支持的
模式有:普通模式,比較匹配發(fā)生時清除計數(shù)器模式(CTC),以及兩種PWM 模式,詳見
Table 38 與P72“ 工作模式” 。
? Bit 5:4 – COM01:0: 比較匹配輸出模式
這些位決定了比較匹配發(fā)生時輸出引腳OC0 的電平。如果COM01:0 中的一位或全部都
置位, OC0 以比較匹配輸出的方式進行工作。同時其方向控制位要設置為1 以使能輸出
驅動器。
當OC0 連接到物理引腳上時, COM01:0 的功能依賴于WGM01:0 的設置。Table 39 給
出了當WGM01:0 設置為普通模式或CTC 模式時COM01:0 的功能。
? Bit 2:0 – CS02:0: 時鐘選擇
用于選擇T/C 的時鐘源。
如果T/C0 使用外部時鐘,即使T0 被配置為輸出,其上的電平變化仍然會驅動記數(shù)器。
利用這一特性可通過軟件控制記數(shù)(這里應該注意一下下~~~)。
2)T/C0計數(shù)寄存器—TCNT0
通過T/C 寄存器可以直接對計數(shù)器的8 位數(shù)據(jù)進行讀寫訪問。對TCNT0 寄存器的寫訪問
將在下一個時鐘阻止比較匹配。在計數(shù)器運行的過程中修改TCNT0 的數(shù)值有可能丟失一
次TCNT0 和OCR0 的比較匹配。
3)輸出比較寄存器—OCR0
輸出比較寄存器包含一個8 位的數(shù)據(jù),不間斷地與計數(shù)器數(shù)值TCNT0 進行比較。匹配事
件可以用來產生輸出比較中斷,或者用來在OC0 引腳上產生波形。
4)中斷屏蔽寄存器—TIMSK
? Bit 1 – OCIE0: T/C0 輸出比較匹配中斷使能
當OCIE0 和狀態(tài)寄存器的全局中斷使能位I 都為”1” 時,T/C0 的輸出比較匹配中斷使能。
當T/C0 的比較匹配發(fā)生,即TIFR 中的OCF0 置位時,中斷服務程序得以執(zhí)行。
? Bit 0 – TOIE0: T/C0 溢出中斷使能
當TOIE0 和狀態(tài)寄存器的全局中斷使能位I 都為”1” 時,T/C0 的溢出中斷使能。當T/C0
發(fā)生溢出,即TIFR 中的TOV0 位置位時,中斷服務程序得以執(zhí)行。
5)定時/計數(shù)器中斷標志寄存器—TIFR
? Bit 1 – OCF0: 輸出比較標志0
當T/C0 與OCR0( 輸出比較寄存器0) 的值匹配時,OCF0 置位。此位在中斷服務程序里
硬件清零,也可以對其寫1 來清零。當SREG 中的位I、OCIE0(T/C0 比較匹配中斷使能
) 和OCF0 都置位時,中斷服務程序得到執(zhí)行。
? Bit 0 – TOV0: T/C0 溢出標志
當T/C0 溢出時, TOV0 置位。執(zhí)行相應的中斷服務程序時此位硬件清零。此外, TOV0
也可以通過寫1 來清零。當SREG 中的位I、TOIE0(T/C0 溢出中斷使能) 和TOV0 都置
位時,中斷服務程序得到執(zhí)行。在相位修正PWM 模式中,當T/C0 在0x00 改變記數(shù)方
向時, TOV0 置位(這里我還真的不會~~)。
下面的是個補充:具體我也不知道~因為我也沒有用過,回頭用了再來更新,哈。
4、16位定時/計數(shù)器T/C1
16位的T/C 可以實現(xiàn)精確的程序定時( 事件管理)、波形產生和信號測量。其主要特點如下
? 真正的16 位設計( 即允許16 位的PWM)
? 2 個獨立的輸出比較單元
? 雙緩沖的輸出比較寄存器
? 一個輸入捕捉單元
? 輸入捕捉噪聲抑制器
? 比較匹配發(fā)生時清除寄存器( 自動重載)
? 無干擾脈沖,相位正確的PWM
? 可變的PWM 周期
? 頻率發(fā)生器
? 外部事件計數(shù)器
? 4 個獨立的中斷源(TOV1、 OCF1A、OCF1B 與ICF1)
先看看圖吧:
寄存器:
定時器/ 計數(shù)器TCNT1、輸出比較寄存器OCR1A/B 與輸入捕捉寄存器ICR1 均為16 位
寄存器。訪問16 位寄存器必須通過特殊的步驟,詳見P85“ 訪問16 位寄存器” 。T/C 控
制寄存器TCCR1A/B 為8 位寄存器,沒有CPU 訪問的限制。中斷請求( 圖中簡寫為
Int.Req.) 信號在中斷標志寄存器TIFR1 都有反映。所有中斷都可以由中斷屏蔽寄存器
TIMSK1 單獨控制。圖中未給出TIFR1 與TIMSK1。
T/C可由內部時鐘通過預分頻器或通過由T1引腳輸入的外部時鐘驅動。引發(fā)T/C數(shù)值增加(
或減少) 的時鐘源及其有效沿由時鐘選擇邏輯模塊控制。沒有選擇時鐘源時T/C 處于停止
狀態(tài)。時鐘選擇邏輯模塊的輸出稱為clkT1。
雙緩沖輸出比較寄存器OCR1A/B 一直與T/C 的值做比較。波形發(fā)生器用比較結果產生
PWM或在輸出比較引腳OC1A/B輸出可變頻率的信號。參見P91 “輸出比較單元” 。比較匹
配結果還可置位比較匹配標志OCF1A/B,用來產生輸出比較中斷請求。
當輸入捕捉引腳ICP1 或模擬比較器輸入引腳( 見P189 “ 模擬比較器” ) 有輸入捕捉事件
產生( 邊沿觸發(fā)) 時,當時的T/C 值被傳輸?shù)捷斎氩蹲郊拇嫫鞅4嫫饋怼]斎氩蹲絾卧?br/>括一個數(shù)字濾波單元( 噪聲消除器) 以降低噪聲干擾。
在某些操作模式下, TOP 值或T/C 的最大值可由OCR1A 寄存器、ICR1 寄存器,或一
些固定數(shù)據(jù)來定義。在PWM 模式下用OCR1A 作為TOP 值時, OCR1A 寄存器不能用
作PWM 輸出。但此時OCR1A 是雙向緩沖的, TOP 值可在運行過程中得到改變。當需
要一個固定的TOP 值時可以使用ICR1 寄存器,從而釋放OCR1A 來用作PWM 的輸出。