註: 本文為中文翻譯,原文請見底下網址:
http://www.mikroe.com/eng/chapters/view/4/chapter-3-i-o-ports/
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 3: I/O Ports
特性與功能
微控制器其中一個重要的特性是用來跟周邊連線的 input/output 腳位。在目前的情況下,PIC16F887 一共有 35 支 GPIO 腳位 (general purpose I/O pins),對大多數的應用來說是相當足夠的。
類似暫存器,為了讓 I/O 腳位的運作可以配合內部 8 位元的組織,所有腳位分成 A, B, C, D 和 E 等 5 個群組。它們都有一些共同的特點:
● 出於實際的理由,許多 I/O 腳位有 2 到 3 種功能。如果某個腳位用作其它的功能,它可能就不能當作 GPIO 使用,而且
● 每個 port 都有它的 "衛星 (satellite)",亦即對應的 TRIS 暫存器: TRISA, TRISB, TRISC 等,這些 "衛星" (TRISx) 決定 port 的演出/角色 (performance) 而不是 port 的內容。
透過清除 TRIS 暫存器的某個位元 (bit = 0),對應的 port 腳位會被設置成輸出。同樣的,透過設定 TRIS 暫存器某個位元 (bit = 1),對應的 port 腳位會被設置成輸入。這個規則很容易記憶: 0 等於 Output,1 等於Input。
譯註: 如果沒有特別的聲明,本書提到的「設定某個位元」指的將是「把某個位元設定為 1」,而「清除某個位元」指的將是「把某個位元清除為 0」
Port A 與 TRISA 暫存器
Port A 是一個 8 位元寬雙向的 port。TRISA 和 ANSEL 暫存器控制 Port A 的腳位。Port A 所有腳位均可當作 digital inputs/outputs 使用,其中 5 支腳位也可以當作 analog inputs 使用 (以 AN 表示)。
Fig. 3-2 Port A and TRISA Register
類似用來決定哪些腳位為 inputs 哪些為 outputs 的 TRISA 暫存器,ANSEL 暫存器恰當的位元決定 port A 哪些腳位當作 analog inputs 或 digital inputs/outputs。
● RA0 = AN0(取決於 ANSEL 暫存器的 ANS0 位元);
● RA1 = AN1(取決於 ANSEL 暫存器的 ANS1 位元);
● RA2 = AN2(取決於 ANSEL 暫存器的 ANS2 位元);
● RA3 = AN3(取決於 ANSEL 暫存器的 ANS3 位元); 及
● RA5 = AN4(取決於 ANSEL 暫存器的 ANS4 位元);
這個 port 的每個腳位都有一個與內建周邊設備有關的附加功能。這些附加功能將在後面的章節描述。本章只涵蓋 RA0 腳位的附加功能,因為它只與 Port A 有關。
ULPWU 單元 (Ultra Low Power Wake-up Unit)
微控制器常用於必須定期運作而且仰賴電池完全獨立的設備,在這種情況下,最小功率消耗是其中一個優先考慮的事情。典型的應用為:溫度計 (thermometers),火警偵測器和類似的應用。降低振盪頻率 (clock frequency) 是一個減少功率消耗的方法,對於這個問題,一個最方便的辦法是讓時脈慢下來 (使用 32 KHz 的石英晶體,而非 20 MHz)。
將微控制器設置為睡眠模式是減少功率消耗的另一步。然而,即使同時採用了兩項措拖,另一個問題也會隨之浮現:要如何喚醒微控制器並且把它設置為正常模式。顯然需要有一個外部訊號在某些腳位上產生狀態變化。因此,問題仍然存在。這個訊號必須由額外的電子產生,而該者卻會導致整個設備產生高功率的消耗。
理想的解決方法是由微控制本身定期喚醒自己,這不是完全不可能的。這個電路顯示在右圖 (Fig. 3-3 ULPWU Unit)。
運作原理很簡單:
某個腳位會被設置為 output 並且給它邏輯 1 的狀態。這會導致電容充電。在這之後,同個腳位緊接著設置為 input。腳位的邏輯狀態變化啟用了中斷,而微控制接著設定成睡眠模式 (Sleep mode)。之後,除了等待電容通過輸入腳位放電外沒有什麼別的事要做。當放電導致腳位轉換狀態時,會產生一個中斷,而微控制器會繼續在正常模式下執行程式。整個過程就這樣一直重複...
理論上這是一個完美的解決方案。問題是,能以這種方式產生中斷的所有腳位都是數位腳位,而且當其電壓不趨近 Vdd (1) 或 Vss (0) 的限制值時,它們的放電電流相對地大。在這種情況下,電容放電的時間很短,因為電流高達數百 micro 安培 (microamperes)。這就是為什麼要設計能夠讓電壓下降速度放慢的超低功耗 ULPWU 電路。ULPWU 的輸出會產生中斷,而它的輸入則連接到微控制器的一支腳位,即 RA0 這支腳位。參考右圖 (R=200 歐姆而 c = 1nF),放電時間約為 30 毫秒,而微控制器的總耗電量為 1000 倍慢 (幾百個 nano 安培)。
Port B 與 TRISB 暫存器
Port B 是一個 8 位元寬雙向的 port。TRISB 暫存器決定 port B 的腳位功能。
Fig. 3-5 Port B and TRISB register
類似 Port A,在 TRISB 暫存器一個邏輯 1 會把 port B 恰當的腳位設為 input,反之亦然。這個 port 有 6 支腳位可以當作 analog inputs (AN)。ANSEL 暫存器決定這些腳位為 analog inputs 或是 digital inputs/outputs:
● RB0 = AN12(取決於 ANSEL 暫存器的 ANS12 位元);
● RB1 = AN10(取決於 ANSEL 暫存器的 ANS10 位元);
● RB2 = AN8(取決於 ANSEL 暫存器的 ANS8 位元);
● RB3 = AN9(取決於 ANSEL 暫存器的 ANS9 位元);
● RB4 = AN11(取決於 ANSEL 暫存器的 ANS11 位元); 及
● RB5 = AN13(取決於 ANSEL 暫存器的 ANS13 位元)
Port B 的每支腳位都有一個與內建周邊設備有關的附加功能,這將在後面的章節解釋。
● Port B 所有腳位都內建提升電阻 (pull up resistor),這使得它們非常適合連接按鈕 (push-buttons)、開關 (switches) 和光耦合器 (optocouplers)。為了讓這些電阻連接到微控制器的 ports,必須設定好 WPUB 暫存器對應的位元 (Weak Pull-Up port B register)。[1]
[1] 除了 WPUB 暫存器,還有個位元影響 pull-up resistors 的配置,那便是 OPTION_REG 暫存器的 RBPU (Port B Pull-Up enable bit) 位元。這個元位是一般用途的位元,因為它影響 Port B 所有 pull-up resistors 的配置。
因為是高阻抗 (幾千歐姆),當腳位設置為 output 時,這些 "虛擬的 (virtual)" 的電阻不會有什麼影響,但是當腳位設置為 input 時,這些電阻會配合腳位,相得益彰。因此,它們連接到 CMOS 邏輯電路的輸入。否則的話,因為高輸入阻抗的關係,它們將處於浮接狀態 (floating)。
● 如果 pull-up resistor 有啟用,Port B 每個設置為 input 的腳位可在邏輯狀態改變時引發中斷。為了啟用腳位引發中斷,必須設定 IOCB 暫存器恰當的位元。
由於有這些功能,port B 的腳位通常用於檢查 keyboard 上的按鈕 (push-buttons),因為它們會準確無誤地登記任何按按鈕的事件 (button press)。因此,就不需要投入所有時間 "掃瞄" 這些腳位。
當 X, Y 和 Z 腳位設置為 output 且狀態為邏輯 1 時,只需要在任何按按鈕 (button press) 事件到達後等待中斷請求即可。透過在這些 output 上設定 0 和 1,便可以檢查哪個按鈕被按下。
Pin RB0/INT
RB0/INT 是一個真正的外部中斷來源腳位。它可以設置成對上升緣 (raising edge, 0 到 1 的轉變) 或對下降緣 (falling edge, 1 到 0 的轉變)的訊號做出反應。OPTION_REG 暫存器的 INTEDG 位元用來選擇上升緣或下降緣訊號。
RB6 與 RB7 腳位
你可能已經注意到,PIC16F887 微控制器沒有任何供燒錄程式 (寫 program 到 ROM 中) 的特殊腳位。其實 PIC16F887 有燒錄腳位,只不過在正常情況下是當作 GPIO 使用 (燒錄程式的時候,Port B 的 RB6 是clock,而 RB7 則是 data transfer)。此外,也有必要提供電壓源 Vdd (5V) 和 Vss (0V) 和燒錄 FLASH 記憶體的電壓 Vpp (12-14V)。在燒錄過程中,Vpp 的電壓供應給 MCLR 腳位。關於這個過程的所有細節,以及這些電壓中哪個比較先供應,這已經離題了,燒錄工具 (programmer) 會負責處理。重點是程式可以載入到微控制器,即便微控制器已經焊接到目標設備上。正常情況下,已經載入的程式也可以以同樣的方式更改。這個功能稱為 ICSP(In-Circuit Serial Programming)。得提前計劃使用它。
這並不複雜!只需要安置一個 4-pin 的 connector 到目標設備上,以便供應必要的燒錄電壓給微控制器。為了讓這些電壓不會干擾其他電子設備,得設計一些電路切斷這些干擾(使用電阻或 jumpers)。
這些電壓會供應到微控制器安置的 socket pins 上。
Port C 與 TRISC 暫存器
Port C 是一個 8 位元寬雙向的 Port。TRISC 暫存器決定 port C 的腳位功能。類似其它 ports,TRISC 暫存器裏一個邏輯 1 設置恰當的腳位為 input。
Fig. 3-12 Port C and TRISC Register
這個 port 的所有附加功能將於稍後解釋。
Port D 與 TRISD 暫存器
Port D 是一個 8 位元寬雙向的 Port。TRISD 暫存器決定 port D 的腳位功能。TRISD 暫存器裏一個邏輯 1 設置恰當的腳位為 input。
Fig. 3-13 Port D and TRISD Register
Port E 與 TRISE 暫存器
Port E 是一個 4 位元寬雙向的 Port。TRISE 暫存器決定 port E 的腳位功能。類似其它的 port,TRISE 暫存器裏一個邏輯 1 設置恰當的腳位為 input。RE3 是個例外,它只能當 input 用而且其 TRIS 位元永遠為 1。
類似 port A 與 B,在這種情況下 port E 的 3 支腳位可設置為 analog input。ANSELH 暫存器決定腳位是作 analog input (AN) 或 digital inputs/outputs 之用:
● RE0 = AN5(取決於 ANSEL 暫存器的 ANS5 位元);
● RE1 = AN6(取決於 ANSEL 暫存器的 ANS6 位元); 及
● RE2 = AN7(取決於 ANSEL 暫存器的 ANS7 位元)。
ANSEL 與 ANSELH 暫存器
ANSEL 和 ANSEL 暫存器用於設置 I/O 腳位的模式,以決定作為 analog input 或 digital inputs/outputs。
Fig. 3-15 ANSEL and ANSELH Registers
使用規則為:
要把某個腳位設置為 analog input,ANSEL 或 ANSELH 暫存器恰當的位元必須設定為 1。要把腳位設置為 digital inputs/outputs,恰當的位元必須清除為 0。
ANSEL 暫存器的狀態對 digital output 的功能沒有影響。任何企圖對設置為 analog input 腳位的讀取動作,結果將得到 0。
Fig. 3-16 ANSEL and ANSELH Configuration
簡單的說:
即便充分學習了這些 Ports 的全部知識,你可能也不會去寫一支完全高效率利用這些 ports 的程式。不過,這些 Ports 可能是微控制器裏最簡單的模組。底下是它們的使用方法:
● 在設計一個設備的時候,挑選微控制器與周邊設備通訊的 port。如果你只打算使用 digital inputs/outputs,想用哪個 port 任君選擇。如果你打算使用 analog inputs,那麼就選擇支援 analog inputs(AN0 - AN13)的適當的 port ;
● 每支腳位均可設置為 input 或 output。TRISA, TRISB, TRISC, TRISD 和 TRISE 暫存器決定 PORTA, PORTB, PORTC, PORTD, PORTE 的行為 ;
● 如果你使用一些 analog inputs。在程式前頭設置好 ANSEL 與 ANSELH 適當的位元;
● 如果你使用開關 (switches) 和按鈕 (push butons) 作為輸入訊號源,把它們連接到 port B 的腳位,因為它們有提升電阻 (pull-up resistors)。這些電阻的啟用由 OPTION_REG 暫存器的 RBPU 位元決定,而個別電阻的啟用則是由 WPUB 暫存器決定;及
● 當腳位狀態有所變化的時,通常需要盡快做出反應。然而,倒是不需要為了會改變狀態的腳位特別撰寫程式。只要把這類輸入連接到 PORTB 的腳位,然後啟用電壓轉態的中斷,這麼一來就簡單多了。 IOCB 和 INTCON 暫存器負責這些事。
沒有留言:
張貼留言
注意:只有此網誌的成員可以留言。