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