AVR單片機(jī)IO口結(jié)構(gòu)和上拉和下拉電阻的作用
五、AVR單片機(jī)IO口(千呼萬(wàn)喚始出來(lái))
本文引用地址:http://www.ex-cimer.com/article/201811/394646.htm端口引腳配置
DDxn PORTxn PUD (in SFIOR) I/O 上拉電阻 說(shuō)明
0 0 X 輸入 No 高阻態(tài) (Hi-Z)
0 1 0 輸入Yes 被外部電路拉低時(shí)將輸出電流
0 1 1 輸入 No 高阻態(tài)(Hi-Z)
1 0 X 輸出 No 輸出低電平 ( 漏電流)
1 1 X 輸出 No 輸出高電平 ( 源電流)
//////////////////////////////////////////
輸入狀態(tài):
一、上拉輸入狀態(tài):
1、在IO口線懸空時(shí)讀入PINxn的值為1,狀態(tài)穩(wěn)定
2、在IO口線外接輸入信號(hào)時(shí)讀入PINxn的值隨外部信號(hào)高低電平變化而變化
二、高阻輸入狀態(tài):
1、在IO口線懸空時(shí)讀入PINxn的值為0,且極易受到干撓,狀態(tài)很不穩(wěn)定
2、外接上拉電阻,在IO口線外接輸入信號(hào)時(shí)讀入PINxn的值隨外部信號(hào)高低電平變化而變化(等同于內(nèi)接上拉電阻)
輸出狀態(tài):
在輸出狀態(tài)下,PORTxn=0則輸出為低電平,PORTxn=1則輸出為高電平
1、輸出低電平,IO口線懸空時(shí)讀入PINxn的值為0
2、輸出低電平,IO口線連接VCC或強(qiáng)上拉(指上拉阻值很小,相當(dāng)于直接連接VCC,能提供足夠的上拉電流)時(shí)讀入PINxn的值為1
3、輸出高電平,IO口線懸空時(shí)讀入PINxn的值為1
4、輸出高電平,IO口線連接GND或強(qiáng)下拉(指下拉阻值很小,相當(dāng)于直接連接GND,能吸收足夠的下拉電流)時(shí)讀入PINxn的值為0
由于無(wú)論如何配置DDRxn,我們都可以讀取PINxn值,綜上所述,我們?cè)谧x取PINxn的值時(shí),要想獲得正確且穩(wěn)定的值,
應(yīng)該選擇在內(nèi)部上拉輸入或高阻輸入且外部上拉這兩種方式中進(jìn)行。當(dāng)然在選擇內(nèi)部上拉輸入且外部也上拉的方式也是
可以的,只是內(nèi)部和外部都加上拉(重復(fù)上拉)沒(méi)有什么意義。
還有一點(diǎn)就是我們?cè)谧x取軟件賦予的電平時(shí),讀PINxn值之前,要插入一個(gè)NOP。
也就是說(shuō)在IO口輸出邏輯電平之后再讀入這個(gè)輸出的值中間應(yīng)插入一個(gè)NOP。
AVR的真正雙向IO結(jié)構(gòu)就復(fù)雜多了,單是控制端口的寄存器也有4個(gè)
PORTx.DDRx,PINx,SFIOR(PUD位),不過(guò)功能也強(qiáng)勁多了
作為通用數(shù)字I/O 使用時(shí),所有AVR I/O 端口都具有真正的讀- 修改- 寫(xiě)功能。
這意味著用SBI 或CBI 指令改變某些管腳的方向( 或者是端口電平、禁止/ 使能上拉電阻) 時(shí)不會(huì)無(wú)意地改變其他管腳的方向( 或者是端口電平、禁止/ 使能上拉電阻)。
輸出緩沖器具有對(duì)稱(chēng)的驅(qū)動(dòng)能力,可以輸出或吸收大電流,直接驅(qū)動(dòng)LED。
所有的端口引腳都具有與電壓無(wú)關(guān)的上拉電阻。
并有保護(hù)二極管與VCC 和地相連。
* (很多數(shù)字器件都有保護(hù)二極管,在低功耗應(yīng)用時(shí)要考慮保護(hù)二極管的電流倒灌的影響)
每個(gè)端口都有三個(gè)I/O 存儲(chǔ)器地址:
數(shù)據(jù)寄存器 –PORTx
數(shù)據(jù)方向寄存器–DDRx
端口輸入引腳 –PINx。
數(shù)據(jù)寄存器PORTx和數(shù)據(jù)方向寄存器DDRx為讀/ 寫(xiě)寄存器,而端口輸入引腳PINx為只讀寄存器。
但是需要特別注意的是,對(duì)PINx 寄存器某一位寫(xiě)入邏輯"1“ 將造成數(shù)據(jù)寄存器相應(yīng)位的數(shù)據(jù)發(fā)生"0“ 與“1“ 的交替變化。
當(dāng)寄存器MCUCR 的上拉禁止位PUD置位時(shí)所有端口引腳的上拉電阻都被禁止。
在( 高阻態(tài)) 三態(tài)({DDxn, PORTxn} = 0b00) 輸出高電平({DDxn, PORTxn} = 0b11) 兩種狀態(tài)之間進(jìn)行切換時(shí),
上拉電阻使能({DDxn, PORTxn} = 0b01) 或輸出低電平({DDxn,PORTxn} = 0b10) 這兩種模式必然會(huì)有一個(gè)發(fā)生。
通常,上拉電阻使能是完全可以接受的,因?yàn)楦咦璀h(huán)境不在意是強(qiáng)高電平輸出還是上拉輸出。
如果使用情況不是這樣子,可以通過(guò)置位SFIOR 寄存器的PUD 來(lái)禁止所有端口的上拉電阻。
在上拉輸入和輸出低電平之間切換也有同樣的問(wèn)題。
用戶必須選擇高阻態(tài)({DDxn,PORTxn} = 0b00) 或輸出高電平({DDxn, PORTxn} = 0b10) 作為中間步驟。
評(píng)論