AVR的IO端口特性與應(yīng)用
分析上拉電阻。E的電位為0時,即D為1時,上拉電阻有效。
從與門的輸入分析,只有以下的條件同時滿足時,上拉電阻才有效
1。PUD 為0
2。DDxn 為0
3。PORTxn 為1
結(jié)論是:只有DDRxn = 0 即管腳定義為輸入狀態(tài),并且 PORTxn=1, 而且UPD設(shè)置為0時,上拉電阻才生效。
分析 Pxn 及 SLEEP。只有當(dāng) SLEEP = 0 時,可控開關(guān)2才導(dǎo)通,SD1不工作,施密特觸發(fā)器的輸入等于Pxn, 信號送到同步器后讀取。
結(jié)論:Pxn 無論在輸入或輸出狀態(tài)都能被AVR讀取。SLEEP=0時輸入才能被讀取。
AVR的IO端口的使用注意事項:
如果有引腳末被使用,建議些引腳賦予一個確定電平。最簡單的保證未用引腳具有確定電平的方法是使能內(nèi)部上拉電阻。
如果剛定義了引腳的輸入狀態(tài),就要立即回讀,可以在回讀前,插入一句 _nop()。
系統(tǒng)復(fù)位時,DDR全部為0,Port也全部為0,故上拉電阻在復(fù)位時會失效。
如何用C語言操縱AVR的IO端口(以ICCAVR為例):
舉例一:將PB0定義為輸出,且輸出為高電平
DDRB=BIT(0);//定義 PB0為輸出
PORTB|=BIT(0);// PB0 輸出高電平
舉例二:將PB0、PB1定義為輸出,且PB0輸出低電平,PB1均為高電平
DDRB|=BIT(0)|BIT(1);//定義 PB0、PB1為輸出
PORTB|=BIT(0)|BIT(1);// PB0、PB1 輸出高電平
舉例三:將PB0數(shù)據(jù)寄存器的數(shù)值翻轉(zhuǎn),即如果是1時變成0,如果是0時變成1
PORTB^=BIT(0);// PB0 輸出高電平
舉例四:將PB0、PB1數(shù)據(jù)寄存器的數(shù)值翻轉(zhuǎn),即如果是1時變成0,如果是0時變成1
PORTB^=BIT(0)|BIT(1);// PB0 輸出高電平
舉例五:將PB2、PB3定義為輸入,不帶上拉電阻
DDRB&=~(BIT(2)|BIT(3));//定義 PB2、PB3為輸入
PORTB&=~(BIT(2)|BIT(3));// 將 PORT 置0,沒有上拉電阻
舉例六:將PB2、PB3定義為輸入,帶上拉電阻。即沒有引用這些引腳時,缺省值為高電平
SFIOR&=~BIT(PUD);// SFIOR寄存器的上拉電阻控制位PUD置0,在整個代碼中,這句話可以不出現(xiàn),或僅出現(xiàn)一次即可。因為它是一個控制全部上拉電阻的控制位。
DDRB&=~(BIT(2)|BIT(3));//定義 PB2、PB3為輸入
PORTB|=BIT(2)|BIT(3);// 將 PORT 置1,滿足上拉電阻的另一個條件
舉例七:DDRB=BIT(0)|BIT(1) 與 DDRB|=BIT(0)|BIT(1) 的區(qū)別
假定在執(zhí)行上面兩句指令前,DDRB 的狀態(tài)為: 1000 0000
如果執(zhí)行 DDRB=BIT(0)|BIT(1) ,DDRB的狀態(tài)變?yōu)椋?0000 0011
如果執(zhí)行 DDRD|=BIT(0)|BIT(1),,DDRB的狀態(tài)變?yōu)椋?1000 0011那前一句會先清空以前的所有狀態(tài),后一句保留前面的狀態(tài)。
評論