下圖是AVR單片機(jī)通用I/O口結(jié)構(gòu)示意圖:
從圖中可以看出,每組I/O口配備三個(gè)8位寄存器,它們分別是數(shù)據(jù)方向寄存器DDRx,數(shù)據(jù)寄存器PORTx,和輸入引腳寄存器PINx(x表示端口序號(hào))。I/O口的工作方式和表現(xiàn)特征由這3個(gè)I/O口寄存器控制

數(shù)據(jù)方向寄存器DDRx用于控制I/O口的輸入輸出方向,即控制I/O口的工作方式為輸出方式還是輸入方式。
當(dāng)DDRx=1時(shí),I/O口處于輸出工作方式。此時(shí)數(shù)據(jù)寄存器PORTx中的數(shù)據(jù)通過(guò)一個(gè)推挽電路輸出到外部引腳,如下圖。AVR的輸出采用推挽電路提高了I/O口的輸出能力,當(dāng)PORTx=1時(shí),I/O引腳呈現(xiàn)高電平,同時(shí)可提供輸出20mA的電流;而當(dāng)PORTx=0時(shí),I/O引腳呈現(xiàn)低電平,同時(shí)可吸納20mA電流。因此,AVR的I/O在輸出方式下提供了比較大的驅(qū)動(dòng)能力,可以直接驅(qū)動(dòng)LED等小功率外圍器件。

當(dāng)DDRx=0時(shí),I/O處于輸入工作方式。此時(shí)引腳寄存器PINx中的數(shù)據(jù)就是外部引腳的實(shí)際電平,通過(guò)讀I/O指令可將物理引腳的真實(shí)數(shù)據(jù)讀入MCU。此外,當(dāng)I/O口定義為輸入時(shí)(DDRx=0),通過(guò)PORTx的控制,可使用或不使用內(nèi)部的上拉電阻,如下圖:

AVR單片機(jī)通用I/O端口的主要特點(diǎn)為:
雙向可獨(dú)立位控的I/O口
ATmega16的PA、PB、PC、PD四個(gè)端口都是8位雙向I/O口,每一位引腳都可以單獨(dú)的進(jìn)行定義,相互不受影響。如用戶可以在定義PA口第0、2、3、4、5、6位用于輸入的同時(shí)定義第1、7位用于輸出,互不影響。
Push-Pull大電流驅(qū)動(dòng)(最大40mA)
可控制的引腳內(nèi)部上拉電阻
每一位引腳內(nèi)部都有獨(dú)立的,可通過(guò)編程設(shè)置的,設(shè)定為上拉有效或無(wú)效的內(nèi)部上拉電阻。當(dāng)I/O口被用于輸入狀態(tài),且內(nèi)部上拉電阻被激活(有效)時(shí),如果外部引腳被拉低,則構(gòu)成電流源輸出電流(uA量級(jí))。
DDRx可控的方向寄存器。
AVR的I/O端口結(jié)構(gòu)同其它類型單片機(jī)的明顯區(qū)別是,AVR采用3個(gè)寄存器來(lái)控制I/O端口。一般單片機(jī)的I/O僅有數(shù)據(jù)寄存器和控制寄存器,而AVR還多了一個(gè)方向控制器,用于控制I/O的輸入輸出方向。由于輸入寄存器PINx實(shí)際不是一個(gè)寄存器,而是一個(gè)可選通的三態(tài)緩沖器,外部引腳通過(guò)該三態(tài)緩沖器與MCU的內(nèi)部總線連接,因此,讀PINx時(shí)是讀取外部引腳上的真實(shí)和實(shí)際邏輯值,實(shí)現(xiàn)了外部信號(hào)的同步輸入。這種結(jié)構(gòu)的I/O端口,具備了真正的讀-修改-寫(Read-Modify-Write)特性。
AVR單片機(jī)通用I/O口設(shè)計(jì)注意事項(xiàng):
數(shù)據(jù)寄存器PORTx和數(shù)據(jù)方向寄存器DDRx為讀/ 寫寄存器,而端口輸入引腳PINx為只讀寄存器。
但是需要特別注意的是,對(duì)PINx 寄存器某一位寫入邏輯“1“ 將造成數(shù)據(jù)寄存器相應(yīng)位的數(shù)據(jù)發(fā)生”0“ 與“1“ 的交替變化。
當(dāng)寄存器MCUCR 的上拉電阻禁止位PUD置位時(shí)所有端口引腳的上拉電阻都被禁止。
在 高阻態(tài)和輸出高電平 兩種狀態(tài)之間進(jìn)行切換時(shí),上拉電阻使能或輸出低電平這兩種模式必然會(huì)有一個(gè)發(fā)生。編寫程序時(shí)要注意兩者的順序。
通常,上拉電阻使能是完全可以接受的,因?yàn)楦咦锠顟B(tài)下強(qiáng)高電平輸出還是上拉輸出都是可以接受的。
如果使用情況不是這樣,可以通過(guò)置位SFIOR 寄存器的PUD 來(lái)禁止所有端口的上拉電阻。
在上拉輸入和輸出低電平之間切換也有同樣的問(wèn)題。
用戶必須選擇高阻態(tài)或輸出高電平作為中間步驟。
不論如何配置DDxn,都可以通過(guò)讀取PINxn 寄存器來(lái)獲得引腳電平
PINxn寄存器的各個(gè)位與其前面的鎖存器組成了一個(gè)同步器。
這樣就可以避免在內(nèi)部時(shí)鐘狀態(tài)發(fā)生改變的短時(shí)間范圍內(nèi)由于引腳電平變化而造成的信號(hào)不穩(wěn)定。
其缺點(diǎn)是引入了延遲。
AVR IO具備多種IO模式:
1 高阻態(tài) ,多用于高阻模擬信號(hào)輸入,例如ADC數(shù)模轉(zhuǎn)換器輸入,模擬比較器輸入
2 弱上拉狀態(tài)(Rup=20K~50K),輸入用。為低電平信號(hào)輸入作了優(yōu)化,省去外部上拉電阻,例如按鍵輸入,低電平中斷觸發(fā)信號(hào)輸入
3 推挽強(qiáng)輸出狀態(tài),驅(qū)動(dòng)能力特強(qiáng)(》20mA),可直接推動(dòng)LED,而且高低驅(qū)動(dòng)能力對(duì)稱。
使用注意事項(xiàng):
寫用PORTx,讀取用PINx
實(shí)驗(yàn)時(shí),盡量不要把管腳直接接到GND/VCC,當(dāng)設(shè)定不當(dāng),IO口將會(huì)輸出/灌入 80mA(Vcc=5V)的大電流,導(dǎo)致器件損壞。
作輸入時(shí):
1、通常要使能內(nèi)部上拉電阻,懸空(高阻態(tài))將會(huì)很容易受干擾。(表面看好像是51的抗干擾能力強(qiáng),是因?yàn)?1永遠(yuǎn)有內(nèi)部電阻上拉,)
2、盡量不要讓輸入懸空或模擬輸入電平接近VCC/2,將會(huì)消耗太多的電流,特別是低功耗應(yīng)用場(chǎng)合------CMOS電路的特點(diǎn)
3、如果先前I/O口為輸出狀態(tài),設(shè)置為輸入狀態(tài)后,必須等待1個(gè)時(shí)鐘周期后才能正確的讀到外部引腳PINx的值。
4、功能模塊(中斷,定時(shí)器)的輸入可以是低電平觸發(fā),也可以是上升沿觸發(fā)或下降沿觸發(fā)。
5、用于高阻模擬信號(hào)輸入,切記不要使能內(nèi)部上拉電阻,影響精確度。例如ADC數(shù)模轉(zhuǎn)換器輸入,模擬比較器輸入
作輸出時(shí):
采用必要的限流措施,例如驅(qū)動(dòng)LED要串入限流電阻
復(fù)位時(shí):
復(fù)位時(shí)內(nèi)部上拉電阻將被禁用。如果應(yīng)用中(例如電機(jī)控制)需要嚴(yán)格的電平控制,請(qǐng)使用外接電阻固定電平
休眠時(shí):
作輸出的,依然維持狀態(tài)不變
作輸入的,一般無(wú)效,但如果使能了第二功能(中斷使能),其輸入功能有效。例如 外部中斷的喚醒功能。
電子發(fā)燒友App
























評(píng)論