雖然資料匯流排,位址匯流排是微處理機,借以控制週邊電路硬體的電路及記憶體共同組成電腦的資料通訊骨幹。AVR微控器內部包含了微處理器,以及週邊硬體電路,並且已由匯流排串接成為一個完整的電腦。AVR微控器的輸出入埠已經是週邊電路。但是,我們仍然可以選用其中一個輸出入埠,接到外部八位元線路,把自己當成微處理機,把這八位元線路當成資料匯流排,姑且稱之為外部資料匯流排。再選用另一個輸出入埠的三位元提供位址編碼,作為位址匯流排,此外再找一位元做為讀取控制線RD,一位元做為寫出控制線WR。即可擴充為8個輸出埠,每埠能夠監控8位元,總共即可控制64個輸出旗標,監視64個輸入旗標。
1. 擴充輸出入埠實作實驗:本實驗,我們實作以PortD輸出入埠,做為資料匯流排,PORTB4:6三位元輸出為位址匯流,PORTE3讀取控制線RD,PORTE4寫入控制線WR。 三位元位址匯流排可以解出8個輸出入埠,實作上我們選用3解8的輸出腳
• 硬體配線:參考以上的電路方塊圖,
◦ 電源及接地:
▪ 麵包板電源:電源接電源供應器5V,地接電源供應器的地,電源與地間接10μF電解質電容。
▪ 各顆IC電源:的電源接到麵包板的5V電,GND拉到麵包板的地,IC電源接腳與地接腳間跨接0.01μF陶瓷電容。
◦ 正式配線前IC元件檢測:指撥開關電路可以提供輸位輸入測試訊號,TEN BAR LED電路則可以提供輸出訊號的顯示。
各顆IC元件測試電路
▪ 74LS245三態測試:DIR接腳接HI,
接到指撥開關電路偵測點,
接到TENBAR LED輸入點。確認檢查
接Low時:指標開關撥動時,LED暗亮隨之變動。
接Hi時:指標開關撥動時不影響LED暗亮。
▪ 74LS374正反器測試:Out 接腳接Low,
接到指撥開關電路偵測點,留下一個指撥開關接到Clock,
接到TEN BAR LED輸入點。撥動設定
指撥開關設定輸,接到Clock的指撥開關則可提供上升緣變化。
• Clock 接Hi/Low不變時:指標開關撥動時不影響LED暗亮。
• Clock 由Low變HI後:
LED暗亮隨之改變成指標開關
設定值。
• Clock 由HI變Low:不影響
LED暗亮。
▪ 74LS138解碼器測試:三個致能腳接成
接到三個指撥開關電路偵測點量取
接到TEN BAR LED輸入點。
• 以指撥開關設定
從000到111,對應不亮的LED應該由
逐一對應變化。
▪ 74LS00 -1/4 NAND GATE測試:1A,1B2A,2B3A,3B4A,4B 分別接到八個指撥開關電路偵測點,找四個LED輸入點接到 1Y,2Y,3Y,4Y。
• 撥動指撥開關設定NAND GATE的兩輸入nA,nB 分別為00,01,10,11對應的輸出nY 應該是1,0,0,0
▪ 74LS04 -1/4 NOT GATE測試:1A,2A,3A,4A,5A,6A 分別接到六個指撥開關電路偵測點,找六個LED輸入點接到 1Y,2Y,3Y,4Y,5Y,6Y。
• 撥動指撥開關設定NOT GATE的輸入 nA 分別為0,1對應的輸出 nY 應該是1,0。
◦ 正式配線資料匯流排:PORTD各位元(藍色粗線),被分別接到74LS245的輸出端以接收來自外部硬體訊號輸入,同時接到74LS374的輸入端各
腳。
◦ 位址匯流排解碼:PORTB2:0三條線位址匯流排,接到74LS138的
做為解碼器位址線。解碼輸出線
每個輸出線可控一組輸出埠,一組輸入埠。
▪ 選到的線
為Low,即0,反向後為1,任何訊號與它AND後,可以維持其訊號的1/0,也就是充許與他AND的訊號通過。
▪ 沒選到線
為Hi,即1,反向後為0,任何訊號與它AND後,永遠為0,不受與他AND的訊號影響,即不通過。
▪ AND改NAND: NAND等於AND閘輸出後反向,由於NAND邏輯IC比AND邏輯IC容易製造也容易取得,常以NAND代AND。
◦ 輸入讀取RD控制:74LS138所解出的
線過反向之後,與PE4 輸入控制線RD,接到同一顆NAND閘的兩端,以控制PE3 RD訊號是否可通到第i 顆74LS245三態開關的致能閘,以控制74LS245是否允許外部訊號進入PortD。
◦ 輸出寫入WR控制:74LS138所解出的
線過反向之後,與PE4 輸出控制線WR,接到另一顆NAND閘的兩端,再經反向後接到第 i 顆74LS374正反器的栓鎖時脈,以提供74LS374上昇緣栓鎖訊號將PortD的訊號鎖入74LS374正反器。其中反向閘是為了接NAND輸出的下降緣轉為上升緣。
◦ 擴充輸出埠對外電路:74LS374的
為擴充輸出埠的對外接腳,可以接到前一個單元的TEN-BAR LED的8顆LED控制接腳。
◦ 擴充輸入埠對外電路:
為擴充輸入埠的對入接腳,可以接到前一個單元的指撥開關的8個偵測接腳。
◦ 配線測試:逐級測試邏輯電路訊號HI/LOW的正確性
▪ 電源:由麵包板,到各顆IC,以其地為地,量電源電壓是否為5V。
• 擴充輸入埠讀入函式ExtPort_get()撰寫:函式可以指定由編號第幾中號擴充輸入埠讀取一個BYTE的值。依據前面由匯流排讀取指定週邊的時序圖,我們知道要先向位址匯流排輸出位址,再由RD控制線輸出控制訊號打開對應的74LS254三態,讓外部資料可進到資料匯流排,最後再由PortD讀取輸入資料後回應給呼叫者。
◦ 函式原型及輸出入
原型
char ExtPort_get(charExt_Num)
輸入傳參
char Ext_Num:擴充輸入埠編號
回傳,char八位元字元,讀回值。
◦ 驅動函式式程式虛擬碼
呼叫REGPUT()設定PortD為輸入(DATA匯流排輸入)
呼叫REGFPT()設定PORTB2:0為輸出。(住址匯流排輸出)
呼叫REGFPT()設定PORTE3為輸出。(RD控制線輸出)
呼叫REGFPT()由PORTB2:0送出住址。
呼叫REGFPT() 由PORTE3 送出RD旗標為1。
呼叫REGGET() 讀取PortD輸入值
呼叫REGFPT() 由PORTE3 送出RD旗標為0。
將讀得值回傳。
◦ 暫存器及旗標直接讀寫式虛擬碼
寫入DDRA設定PortD為輸入(DATA匯流排輸入)
呼叫巨集bits_put()設定PORTB2:0為輸出。(住址匯流排輸出)
呼叫巨集bits_put()設定PORTE3為輸出。(RD控制線輸出)
呼叫巨集bits_put()由PORTB2:0送出住址。
呼叫巨集bits_put() 由PORTE3 送出RD旗標為1。
讀取PINA暫存器取得PortD輸入值
呼叫巨集bits_put()由PORTE3 送出RD旗標為0。
將讀得值回傳。
◦ 函式測試:
▪ 測試程式:撰寫一個程式,會呼叫ExtPort_get()讀取擴充輸入埠八位元值,再以printf()送到超級終端機顯示。
▪ 實際測試:撥動五種不同組合之指標開關,記錄其各位元1/0,以及其顯示之對應數值,並分析檢討其正確性。
• 擴充輸出埠寫出函式ExtPort_put()撰寫:函式可以指定由編號第幾號擴充輸出埠寫出一個BYTE的值。依據前面由匯流排寫出指定週邊的時序圖,我們知道要先輸出輸入埠住址,再輸出Rd控制線使外部資料可通過74254進到匯流排,再由PortD讀取後
回應給呼叫者。
◦ 函式原型及輸出入
原型
void ExtPort_put(charEx_Num, char data)
輸入傳參
char Ex_Num:擴充輸出埠編號
char data:輸出值
回傳,void。
◦ 驅動函式式虛擬碼
呼叫REGPUT()設定PortD為輸出(DATA匯流排輸出)
呼叫REGFPT()設定PORTB2:0為輸出。(住址匯流排輸出)
呼叫REGFPT()設定PORTE3為輸出。(WR控制線輸出)
呼叫REGFPT()由PORTB2:0送出住址。
呼叫REGFPT()由PORTE3 送出WR旗標為0。
呼叫REGPUT()由PortD輸出值
呼叫REGFPT()由PORTE3 送出WR旗標為1,產生上升緣栓鎖資料。
◦ 暫存器及旗標直接讀寫式虛擬碼
寫入DDRA暫存器設定PortD為輸出(DATA匯流排輸出)
呼叫巨集bits_put()設定PORTB2:0為輸出。(住址匯流排輸出)
呼叫巨集bits_put()設定PORTE3為輸出。(WR控制線輸出)
呼叫巨集bits_put()由PORTB2:0送出住址。
呼叫巨集bits_put() 由PORTE3 送出WR旗標為0。
寫入PortD暫存器由PortD輸出值
呼叫巨集bits_put()由PORTE3 送出WR旗標為1,產生上升緣栓鎖資料。
◦ 函式測試:
▪ 測試程式:撰寫一個程式,會以printf()提供提示,並以scanf()讀到待輸出值,再呼叫ExtPort_put()擴充輸出埠送出八位元值。
▪ 實際測試:輸入五種不同的值,記錄其值,以及以1/0記錄,輸出埠對應各LED各位元的亮滅,並分析檢討其正確性。
• 實測:
◦ 測試程式:撰寫一個程式,會呼叫ExtPort_get()讀取擴充輸入埠八位元值,再以printf()送到超級終端機顯示,同時再呼叫ExtPort_put()擴充輸出埠送出八位元值。 實際測試:撥動五種不同組合之指標開關,記錄其各位元1/0,以及其顯示之對應數值,以及LED亮滅。