2011年6月7日 星期二

Chapter 4

註: 本文為中文翻譯,原文請見底下網址:

http://www.mikroe.com/eng/chapters/view/5/chapter-4-timers/

TOC Introduction Ch. 1 Ch. 2 Ch. 3 Ch 4. Ch. 5 Ch. 6 Ch. 7 Ch. 8 Ch. 9 App. A App. B App. C

Chapter 4: Timers

PIC16F887 微控制器的計時器 (timers) 用簡短一句話就可以描述,總共有 3 個完全獨立的計時器/計數器 (timers/counters),標記為 TMR0, TMR1 和 TMR2。不過事情沒那麼簡單。

TMR0 計時器

實際上 TMR0 計時器的應用很廣。很少程式不用到它。它非常方便,而且很容易用來撰寫產生任意期間的脈衝的程式或副程式 (subroutine)、測量時間,或是計數外部脈衝 (事件),幾乎沒有什麼限制。

TMR0 計時器模組是 8 位元的計時器/計數器,具有下列特性:

● 8 位元計時器/計數器;

● 8 位元 prescaler (與 Watchdog timer 共享);

● 可程式的內部或外部時脈來源 (Programmable internal or external clock sources);

● 溢位中斷 (Interrupt on overflow); 及

● 可程式選擇的外部時脈邊緣 (Programmable external clock edge selection)。

下圖表示 TMR0 計時器的電路,包含決定其運作的所有位元。這些位元儲存在 OPTION_REG 暫存器裏。

image
Fig. 4-1 Timer TMR0

OPTION_REG 暫存器

image
Fig. 4-2 OPTION_REG Register

image

image

PSA 位元的功能顯示於底下兩張圖:

image
Fig. 4-3 The function of the PSA bit 0

image
Fig. 4-4 The function of the PSA bit 1

可以看出,PSA 位元的邏輯狀態決定 prescaler 指派給 TMR0 或是 watchdog timer。

另外,值得一提的是:

● 當 prescaler 指派給 TMR0 時,任何對 TMR0 暫存器的寫入動作將會清除 prescaler;

● 當 prescaler 指派給 watchdog timer 時,CLRWDT 指令將同時清除 prescaler 與 WDT;

● 當 TMR0 作為計時器用時,對 TMR0 的寫入動作不會讓脈衝計數立即開始,而會有兩個指令週期的延遲。因此,有必要調整寫到 TMR0 的值;

● 當微控制器被設成睡眠模式時,振盪器便會關閉。因為沒得計數脈衝,所以就不會發生溢位 (overflow)。這就是為什麼 TMR0 溢位不能將微控制器從睡眠模式中喚醒的原因;

● 當用作不含 prescaler 的外部時脈計數器時 (external clock counter),最小的脈衝長度或兩個脈衝之間的間歇必須是 2 Tosc + 20 nS. Tosc 是振盪訊號週期 (oscillator signal period);

● 當用作含 presacler 的外部計數器時,最小的脈衝長度或兩個脈衝之間的間歇必須是 10nS;

● 8 位元 prescaler 暫存器不提供給使用者,這表示不能直接讀寫 prescaler 暫存器;

當從 TMR0 將 prescaler 指派給 watchdog timer 時,必須按下列指令次序執行以免發生重置 (reset):

● 同樣的,當從 WDT 將 prescaler 指派給 TMR0 時,必須按下列指令次序執行以免發生重置:

為了恰當地使用 TMR0,必須:

要選擇模式:

● 計時器模式是藉由 OPTION_REG 暫存器的 T0CS 來選擇。 (T0CS: 0=timer, 1=counter);

● 使用的時候,必須藉由清除 OPTION_REG 暫存器的 PSA 位元將 prescaler 指派給 TMR0。prescaler 比率 (Prescaler rate) 的設定是透過 OPTION_REG 暫存器的 PS2-PS0 位元,及

● 使用中斷時,必須設定 INTCON 暫存器的 GIE 與 TMR0IE 位元。

要測量時間:

● 重設 TMR0 暫存器或寫入已知的值到 TMR0;

● 經過時間 (單位是毫秒,當使用 4 MHz 石英晶體時) 的獲得方式是透過讀取 TMR0 暫存器,及

● 每當 TMR0 暫存器溢位時,INTCON 暫存器的 TMR0IF 旗號便會自動豎起來,如果中斷有啟用,會引發中斷。

要計數脈衝:

● 位於 RA4 腳位,要計數的脈衝極性 (polarity) 的選擇是透過設定 OPTION_REG 暫存器的 T0SE 位元 (T0SE: 0=負向緣, 1=正向緣); 及

● 脈衝數可從 TMR0 暫存器中取得。如同計時器模式,presacler 和中斷的用法是一樣的。

TMR1 計時器

TMR1 模組是一個 16 位元的計時器/計數器,這意味著它由兩個暫存器組成 (TMR1L 和TMR1H)。在一個循環裏它總共可以計算 65535 個脈衝,亦即從 0 算起可以算 65535 次。

image
Fig. 4-5 Timer TMR1

類似 TMR0,可以在任何時刻讀寫 TMR1 暫存器的值。如果發生溢位,就會產生中斷。

TMR1 模組可以當計時器或計數器使用。然而,與 TMR0 有一點不同,TMR1 的計時器和計數器有額外的功能。

T1CON 暫存器的部份位元控制著 TMR1 的運作。

image
Fig. 4-6 Timer TMR1 Overview

TMR1 Prescaler

計時器 TMR1 具有一個完全獨立的 prescaler,允許對時脈輸入 (clock input) 做 1, 2, 4 或 8 倍的除率。prescaler 不能直接讀寫。然而,在對 TMR1H 或 TMR0L 暫存器進行寫入動作時,prescaler 計數器會自動清除為 0。

TMR1 振盪器

RC0/T1OSO 和 RC1/T1OSI 腳位用於登記來自周邊電子設備的脈衝,不過它們還有附加功能。如下圖所示,它們同時設置成額外低功率石英晶體 (LP quartz, Low Power quartz) 的輸入 (RC1) 和輸出 (RC0)。

這個附加功能主要是為低頻運作 (最高 200 KHz) 而設計的,更精確的地說,用於 32.768 KHz 的石英晶體。這種晶體用在石英手錶,因為它很容易獲得一秒鐘的長脈衝,只需要除以這個頻率就行。

由於這個振盪器不依賴內部時脈,即使在睡眠模下它也可以運作。啟用它的方法是藉由設定 T1CON 暫存器的 T1OSCEN 位元。為了確保正確啟動振盪器,使用者必須提供一些軟體延遲 (幾微秒的時間)。

image 下表顯示適合石英振盪器的建議電容值。這些值不用完全準確。但是,一般的規則是:電容的容量愈高,穩定性就愈高。

image

 

TMR1 閘門

TMR1 閘門來源 (Timer1 gate source) 是可用軟體設定的 (software configurable),可以是 T1G 腳位或比較器 C2 (comparator C2) 的輸出。這個閘門 (gate) 允許計時器使用 T1G 腳位的邏輯狀態變化或比較器  C2 的類比事件直接計算外部事件的時間。參考 Fig. 4‑4 Timer TMR1 Overview,為了算出訊號持續的時間,啟用這個閘門並計算通過它的脈衝數就足夠了。

TMR1 計時模式

為了選擇這種模式,必須清除 T1CON 的 TMR1CS 位元。在這之後,16 位元的 TMR1 暫存器便會在每個來自內部振盪器的脈衝來臨時遞增計數。如果使用的是 4 MHz 的石英晶體,它會每微秒遞增一次。

在這種模式下,T1SYNC 位元的設定不會影響計時,因為它算的是內部時鐘脈衝。由於整個微控制器都使用這些脈衝,所以沒有必要進行同步。

image
Fig. 4-8 TMR1 in timer mode

在睡眠模式下,微控制器的時鐘振盪器不會運作,所以計時器溢位不會引發任何中斷。

TMR1 振盪器

在睡眠模式下,微控制器的功耗會降到最低水平。關鍵是停止振盪器。無論如何,要設定計時器為這種模式很簡單 –在程式裏寫個 SLEEP 指令即可。問題是要在何時喚醒微控制器,因為只有中斷才可以做到這一點。由於微控制器 "睡著了",所以中斷必須由外部電子設備觸發。它可以很複雜,假如有必要以固定的時間間隔喚醒微控制器的話..

image
Fig. 4-9 Timer TMR1 Oscillator

為了解決這個問題,一個能夠在睡眠模式下運作且完全獨立低功耗的石英振盪器便內建於 PIC16F887 微控制器。簡單地說,以前是獨立的電路,現在已內建在微控制器裏,而且指派給 TMR1 計時器。這顆振盪器的啟用方法是藉由設定 T1CON 暫存器的 T1OSCEN 位元。在這之後,T1CON 的 TMR1CS 位元則是用來決定 TMR1 使用這顆振盪器的脈衝。

● 這顆振盪器的訊號是藉由清除 T1SYNC 位元來與微控制器的時脈同步。在這種情況下,計時器不能在睡眠模式下運作。你想知道為什麼嗎?這是因為同步電路使用的是微控制器的時脈!及

● TMR1 暫存器溢位中斷可能會啟用,這類中斷在睡眠模式下也可以引發。

TMR1 計數模式

設定 TMR1CS 位元, TMR1 便當作計數器使用。這表示 TMR1 會在 T1CKI 外部時脈上升緣遞增。如果 T1CON 暫存器的 T1SYNC 控制位元被清除,外部時脈輸入將以它們的方式與微控制器同步。換句話說,TMR1 會與微控制器系統時脈同步,並被稱為同步計數器。

當微控制器以這種方式運作而且被設置在睡眠模式下時,即使外部時脈輸入到輸入腳位 TMR1H 和 TMR1L 暫存器也不會遞增。簡單的說,由於微控制器在睡眠模式下不運作,就沒有時脈可以同步。然而,如果有外部時脈輸入到這些腳位,prescaler 將繼續運作,因為 prescaler 不過是一個除頻器 (frequency divider)。

image
Fig. 4-11 Counter Mode

image 當 Input 腳位為 1 時,計數器會登記並且遞增。重要的是要知道,在上升緣第一次遞增之前,至少要有一個下降緣。參考左圖,圖中的箭頭表示計數器的遞增。

 

 

 

 

T1CON 暫存器

image
Fig. 4-12 T1CON Register

image

為了適當地使用 TMR1,有必要執行下列操作:

● 因為不可能關閉 prescaler,所以必須使用 T1CON 的 T1CKPS1 和 T1CKPS0 位元調整好預除率 (prescaler rate);

● 模式的選擇必須由 T1CON 暫存器的 TMR1CS 位元決定 (TMR1CS:0 表示使用石英振盪器,1 表示使用外部時脈);

● 藉由設定同一個暫存器的 T1OSCEN 位元,TMR1 會被打開,並且 TMR1H 和 TMR1L 暫存器會在每個時脈輸入時遞增。清除這個位元計數便會停止;

● prescaler 的清除辦法是透過對計時器進行寫入動作;及

● 填滿 TMR1 兩個暫存器的內容後,TMR1IF 旗號會豎起,而且計數將從 0 開始。

TMR2 計時器

TMR2 是一個 8 位元寬的計時器,它以一種非常特殊的方式在運作。

image
Fig. 4-13 Timer TMR2

來自石英振盪器的脈衝首先經過 prescaler,預除率 (prescaler rate) 可以透過組合 T2CKPS1 和 T2CKPS0 兩個位元而改變,prescaler 的輸出然後用於遞增 TMR2 暫存器,從 00h 開始。TMR2 和 PR2 的值會不斷的比較,而 TMR2 暫存器也會繼續遞增,直到其值與 PR2 的值匹配為止。當一個匹配 (match) 發生的時候,TMR2 暫存器會自動清除為 00h,TMR2 計時器的 postscaler 便遞增,而且其輸出將用來產生一個中斷,假如有啟用的話。

TMR2 和 PR2 暫存器都是可讀寫的。可以透過清除 TMR2ON 位元停止計數,這有助於省電。

用作一個特殊的選項,TMR2 重置的當下也可以用於決定序列通訊 baud rate 的同步。

TMR2 計時器受 T2CON 暫存器的許多位元控制。

image
Fig. 4-14 T2CON Register

image

在使用 TMR2 計時器的時候,必須知道與 TMR2 的暫存器有關的許多獨特的細節:

● 在開啟電源後,PR2 暫存器其值為 FFh;

● 寫入 TMR2 會使得 prescaler 和 postscaler 都被清除

● 寫入 T2CON 暫存器會使得 prescaler 和 postscaler 都被清除; 及

● 不管在任何一種重置 (reset),prescaler 和 postscaler 也會被清除。

0 意見: