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

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

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

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
























評論