第八節(jié):PIC系列單片機(jī)I/O口結(jié)構(gòu)
PIC16C5X的所有I/O端的結(jié)構(gòu)都是相同的,如圖1.10所示:
所有I/O端皆可置成輸入或輸出態(tài)。輸入無(wú)鎖存,所以外部輸入信號(hào)應(yīng)保持到讓CPU讀入為止。輸出鎖存。
I/O端的輸入/輸出狀態(tài)由對(duì)應(yīng)的I/O控制寄存器"TRIS f"控制,當(dāng)"TRIS f"將"1"置入I/O控制器時(shí)Q1和Q2都處于截止態(tài),所以I/O端即呈高阻態(tài)(輸入態(tài))。當(dāng)執(zhí)行 I/O讀指令(如MOVF 6,W),把當(dāng)前I/O端的狀態(tài)讀入數(shù)據(jù)總線。當(dāng)"TRIS f"將"0"置入I/O控制器時(shí),Q1和Q2的導(dǎo)通情況將要由數(shù)據(jù)鎖存器Q端的狀態(tài)來(lái)決定。當(dāng)寫入數(shù)據(jù)為"1"時(shí),Q端為低電平0,則Q1導(dǎo)通,I/O輸出為高電平。反之,當(dāng)寫入數(shù)據(jù)為"0"時(shí),Q端為"1",則Q2導(dǎo)通,I/O端輸出為低電平。I/O讀寫時(shí)序如圖1.11所示:
注:本圖顯示了PORTB口的一個(gè)寫入→讀出的連續(xù)動(dòng)作。I/O腳電平的建立時(shí)間=0.25TCY-TPD,其中TCY為指令周期,所以對(duì)于高速振蕩來(lái)說(shuō),連續(xù)的寫入→讀出可能會(huì)有問(wèn)題,兩者中間應(yīng)有延遲。
I/O口使用注意事項(xiàng):
a、I/O方向轉(zhuǎn)置的問(wèn)題
某時(shí)候可能需要一個(gè)I/O口一會(huì)做輸入,一會(huì)又做輸出。這就是I/O方向的轉(zhuǎn)置。
在編寫這種I/O轉(zhuǎn)置程序時(shí)必須注意,有些指令如位設(shè)置指令(BSF、BCF)寫I/O口時(shí)是先從I/O讀入其狀態(tài),執(zhí)行位操作后再將結(jié)果寫回去覆蓋原來(lái)的內(nèi)容(輸出的結(jié)果放在I/O口的數(shù)據(jù)鎖存器)。舉個(gè)例說(shuō):"BSF 6,5"這條指令的目的是要把B口的第6位置為高電平"1"。執(zhí)行這條指令時(shí),先把整個(gè)B口當(dāng)前的狀態(tài)內(nèi)容讀入到CPU,把第6位置成"1"后再把結(jié)果(8個(gè)位)重新輸出到B口。如果B口中的有一個(gè)I/O端是需要方向轉(zhuǎn)置的(比如說(shuō)bit1),而這時(shí)是處于輸入態(tài),那么B口的狀態(tài)值重新寫入后,B口的數(shù)據(jù)鎖存器1(見(jiàn)圖1.9相對(duì)于B口bit1的鎖存器)的鎖存值就是當(dāng)前B口Bit1的狀態(tài)。這可能和先前Bit1作為輸出時(shí)所鎖存的值不同,所以當(dāng)Bit1再轉(zhuǎn)置成輸出態(tài)時(shí),出現(xiàn)在bit1端的狀態(tài)就可能和先前的輸出態(tài)不同了。
b、I/O的"線或"和"線與"
從圖1.10看出:PIC I/O端輸出電路為CMOS互補(bǔ)推挽輸出電路。 因此與其他這類電路一樣,當(dāng)某個(gè)PICI/O端設(shè)置為輸出狀態(tài)時(shí),不能與其他電路的輸出端接成"線或"或"線與"的形式。否則可能引起輸出電流過(guò)載,燒壞PIC。
如需要與其他電路接成"線或"電路時(shí),PIC I/O端必須置于"0"狀態(tài)或輸入狀態(tài)并外接上拉電阻。如需要接成"線與"電路時(shí),則PIC I/O端必須置于"1"狀態(tài)或輸入狀態(tài),并外接下拉電阻。電阻的阻值根據(jù)實(shí)際電路和PIC I/O端最大電流來(lái)選定。
c、I/O口的連續(xù)操作
一條寫I/O的指令,對(duì)I/O真正寫操作是發(fā)生在指令的后半周期(參照?qǐng)D1.11)。而讀I/O的指令卻是在指令的周期開(kāi)始就讀取I/O端狀態(tài)。所以當(dāng)你連續(xù)對(duì)一個(gè)I/O 端寫入再讀出時(shí),必須要讓I/O端上的寫入電平有一個(gè)穩(wěn)定的時(shí)間,否則讀入的可能是前一個(gè)狀態(tài),而不是最新的狀態(tài)值。一般推薦在兩條連續(xù)的寫,讀I/O口指令間至少加一條NOP指令。
例: MOVWF 6 ; 寫I/O
NOP ; 穩(wěn)定I/O電平
MOVF 6,W ; 讀I/O
d、噪聲環(huán)境下的I/O操作
在噪聲環(huán)境下(如靜電火花),I/O控制寄存器可能因受干擾而變化。比如I/O口可能會(huì)從輸入態(tài)自己變成輸出態(tài),對(duì)于這種情形,WDT也是無(wú)法檢測(cè)出來(lái)的。因此如果你的應(yīng)用環(huán)境是較惡劣的,建議你每隔一定的間隔,都重新定義一下I/O控制寄存器。