AVR單片機i/o(輸入/輸出)端口詳解
輸入/輸出端口(I/O端口)是單片機所能依賴進行控制的唯一通道,如果把單片機內(nèi)核比作人的大腦,那I/O端口就相當于人的五官和四肢,負責著信息的獲取和動作的執(zhí)行,如果沒有I/O端口單片機本身就變得毫無意義,因此很有必要來詳細了解它們的內(nèi)部結(jié)構(gòu)。ATMega16的端口為具有可選上拉電阻的雙向I/O端口,下面是其中某一位I/O口的內(nèi)部結(jié)構(gòu)圖(來自于Datasheet)。
在上圖中,Pxn就是這一位的輸入/輸出端口,也就是單片機的某個外部引腳。它通過PORTxn寄存器和數(shù)據(jù)總線(DATA BUS)相連。前面示例中對PORTxn的賦值其實就是通過數(shù)據(jù)總線來寫這個寄存器實現(xiàn)的。在圖中還可以看到,在Pxn和PORTxn之間實際上還串有一個門控位,如果要讓PORTxn的結(jié)果輸出至Pxn,那這個門控位必須得打開,而該門控位的受控信號來自于DDxn(DDRx中的一位)寄存器。通過數(shù)據(jù)總線對該寄存器位寫1,就可打開門控位,讓輸出信號直接輸出至引腳Pxn。這也正是為什么單片機引腳要處于輸出狀態(tài)就必須要給DDRx方向寄存器賦值1的原因所在。如果給DDxn賦值0,則門控位斷開,引腳Pxn不能做為輸出,只能做為輸入。但輸入信號可以取自兩個地方,一個是直接從外部引腳Pxn來?。▓D中的下半部分),實際上是把外部引腳的信號鎖存到PINxn寄存器中來讀取;另一個則是從輸出寄存器PORTxn來?。▓D中門控位控制信號為RRx的地方)。一般稱“從外部引腳(PINxn)來取”為讀引腳,稱“從寄存器PORTxn來取”為讀端口寄存器。
從圖中還可以看出,在引腳Pxn的上方,有一個受控于MOS管的上拉電阻。而MOS管又同時受到PUD位、DDxn位和PORTxn位的共同控制。當引腳做為輸入時(DDxn=0),在給PORTxn賦值1后,通過PUD就可以控制引腳是否使用上拉電阻。當PUD位為0時,上拉電阻有效,否則相反。PUD存在于寄存器SFIOR中的第2位,見下圖。
下面幾個圖給出了以端口A為代表的三個寄存器配置的具體情況:
從圖中可以看出,PORT和DDR兩個寄存器為可讀可寫的,而PIN寄存器為只讀的。對于寄存器中每一位的操作,在IAR開發(fā)環(huán)境中可以直接引用,這在第二個示例中已經(jīng)闡述過了。下表給出了這幾個寄存器組合配置的具體情況:
在使用I/O端口時還有幾點需要說明一下:
1、作為通用數(shù)字I/O使用時,所有I/O端口都具有真正的讀――修改――寫的功能。
2、不論如何配置DDxn,都可以通過讀取PINxn寄存器來獲得引腳電平。
3、讀取軟件賦予的引腳電平時,需要在賦值指令和讀取指令之間至少有一個時鐘周期的間隔(可插入一條nop指令)。
4、如果某些引腳未被使用,建議還是給這些引腳賦予一個確定電平。
5、復(fù)位時,上拉電阻將被禁用,各引腳為高阻態(tài)。
6、穩(wěn)定狀態(tài)條件下每個I/O端口可以承受的拉電流或灌電流為:VCC=5V時為20mA、VCC=3V時為10mA。
7、所有端口拉電流或灌電流的總和不能超過400mA,且端口A、B、C、D各自的拉電流或灌電流總和不能超過200mA(在DIP封裝方式下,端口B、C、D可達300mA)。
除了通用數(shù)字I/O功能之外,大多數(shù)端口引腳都還具有第二功能,這也就是所謂的端口復(fù)用。因為單片機的引腳畢竟是有限的,而且在大多數(shù)時候做為通用數(shù)字I/O口的引腳不一定全部用完,所以不必為單片機再實現(xiàn)其它功能而單獨制作引腳。比如A/D(模/數(shù))轉(zhuǎn)換,就可不必再單獨為單片機做輸入引腳,而直接把這個功能附屬在PORTA的I/O口上就可以了。這樣PORTA的八個引腳就有了第二功能,即做為A/D轉(zhuǎn)換的信號輸入端。當然,在某個時刻只能使用其中的一種功能,不可能兩種功能同時使用,所以才稱之為復(fù)用。這里要注意,所謂的第二功能只是一種說法,有些單片機的引腳復(fù)用的很厲害,可以實現(xiàn)兩種以上的功能。
要實現(xiàn)引腳的第二功能,其端口內(nèi)部結(jié)構(gòu)較為復(fù)雜,這里就不再進行深入探討了,以下僅給出ATMega16單片機引腳復(fù)用的第二功能。
要實現(xiàn)端口的第二功能,當然還必須得有相關(guān)的寄存器來進行選擇控制。不同的第二功能所配置的寄存器不同,配置方式也不一樣,因此要根據(jù)實際情況來確定。引腳第二功能的具體使用會在后續(xù)的相關(guān)討論中進行詳細講述
評論