本部分介紹可編程並行介面晶元8255A&&可編程定時器、計時器晶元8253、8254,增加了一些具體系統的設計案例。 ...
-
打算整理彙編語言與介面微機這方面的學習記錄。本部分介紹可編程並行介面晶元8255A&&可編程定時器、計時器晶元8253、8254,增加了一些具體系統的設計案例。
-
參考資料
- 西電《微機原理與系統設計》周佳社
- 西交《微機原理與介面技術》
- 課本《彙編語言與介面技術》王讓定
- 小甲魚《彙編語言》
Part1 8255A
1. 有關並行介面
第一章就已經提過,外設和CPU之間不能直接進行數據交換,要增加介面電路,並行介面就是數據在多根線上同時傳送。並行介面的特點:
- 具有埠寄存器
- 與CPU和外設進行聯絡的控制端
- 中斷控制端
- 可編程器件提供多種工作方式供編程選擇。
常用的並行介面晶元是Intel 8255A。串列介面晶元是8250和8251。
2. 8255A的結構及其功能
-
PA0~PA7:埠A,連接外設
-
PC0~PC7:埠C,連接外設
-
PB0~PB7:埠B,連接外設
這幾個埠輸入還是輸出是可編程的。
-
D0~D7:數據匯流排(雙向),連接CPU
-
VCC、GND、CSfei、RDfei、WRfei耳熟能詳了
-
工作方式控制寄存器,可以OUT數據線寫,控制晶元工作方式
-
A0、A1:埠地址線,連接CPU
有四個埠,A B C埠+ 工作方式控制寄存器
CSfei A0 A1 埠 0 0 0 PA 0 0 1 PB 0 1 0 PC 0 1 1 內部控制寄存器 1 / / / 因此也可以看出8086系統中,8255A的A1接地址線A2,A0接A1,高12位參加解碼。
如果地址是偶地址,地址線A0也參加解碼,D0D7連接低八位數據線。奇地址則BHEfei參加解碼,D0D7連接高8位數據線。
-
RESET,複位端,高電平有效
設備複位應當早於CPU複位。
3. 8255A工作方式及其控制字
3.1 工作方式
-
工作方式0:無聯絡信號的輸入/輸出方式,等效於無條件輸入輸出方式,PA PB PC三個埠均可工作在工作方式0。
-
工作方式1:有聯絡信號的輸入輸出方式,相當於查詢法、中斷法。只有PA和PB可工作在工作方式1。PC口來作聯絡信號線(A組使用高四位的PC,B組使用低四位PC)
-
工作方式2:有聯絡信號的雙向方式,準雙向(半雙工),只有PA口可以工作在工作方式2。PB PC用於聯絡。
- 註意,工作方式1是單向的。
- PC可以進行位管理,也就是一位一位的賦值,而PB PA沒有這個功能
3.2 控制字
就是操作8255A內部的工作方式寄存器,類似於8259A的操作:
-
首先CSfei=0,A0 A1=1 1,選中該寄存器埠
-
D7=1,說明要進行工作方式的選擇,也就是在寫控制字
如果D7=0,8255A認為正在進行PC埠的位管理。此時D6D4無效,D3D1編碼PC的每一位。D0位表示將編碼PC的位賦予D0的值。
-
D6~D5:控制A組工作方式
編碼 方式 0 0 方式0 0 1 方式1 1 x 方式2 -
D4:設置A組的輸入輸出方向,0為輸出,1為輸入。
-
D3:控制A組的PC7~PC4的方向,0為輸出,1為輸入。
-
D2:控制B組的工作方式(只有兩種工作方式),0 方式0,1 方式1
-
D1:B組中PB口的方向,0 輸出,1 輸出
-
D0:控制B組的PC3~PC0的方向,0為輸出,1為輸入。
下麵講了P312頁的10.3:
-
A輸出,B輸入,工作在方式1。實現埠C低四位輸入的值從高4位輸出。
可知控制字 D7~D0 應為:1000_0011
-
;選中控制寄存器,寫入控制字 MOV DX, 303H MOV AL, 83H OUT DX, AL ; 選中PC埠 MOV DX, 302H IN AL, DX MOV CL,4 SHL AL,CL ; 左移4次,低四位移到高四位了 OUT DX, AL; 輸出PC埠值
3.3 工作方式1
這部分好複雜啊,但是不是很難懂。先聽一遍再慢慢梳理。
再詳細講講工作方式1。此時三個埠的信號線分成了A B兩組。PC7PC4用作A組的聯絡信號,PC3PC0用作B組聯絡信號。
A. 輸入
輸入:來看下麵的圖,先以PB埠為例,(其實PA PB兩者除了控制字其他工作方式都一樣)
-
結合下麵圖片中的時序來看。
-
數據線PB0~PB7上有數據時,還要CPU知道,而外設通過STBfei將有效數據信號(選通信號,一個負脈衝,接在PC2信號線上)到來後,此時8255A將數據拿進來存放到輸入緩衝器。
-
如果輸入緩衝器滿了,則應該告知設備不能再發送數據了,所以此時IBF信號(緩衝器滿信號,通過PC1輸出)置於高電平,告知設備。
註意A組和B組各有一個輸入緩衝器。
-
CPU一方可以通過兩種方式得知輸入緩衝器滿了。
-
查詢法:可以通過RD埠讀IBF(其實是讀PC埠狀態,看PC1),如果IBF=1,則可以實施IN指令讀走數據。IBF變低,此時8255A就可以繼續接收外設的數據。
-
中斷法:B組通過PC0-INTRB線向CPU發送中斷信號
需要當8255A處於中斷允許狀態:見上圖結構的INTEB=1則中斷允許。RESET時INTEB清0。
當IBFB和INTEB同時為1,則通過PC0發送中斷請求(1,高電平了)。CPU響應後進入中斷服務子程式讀出數據,再IRET返回。
下麵看看INTE如何編程式控制制:
MOV DX,303H MOV AL,1XXXX110B;可以當做86H,也就是無效位都當0 OUT DX,AL ;對PC2位置1,達到INTEB=1目的 MOV AL,0xxx0101B OUT DX,AL;藉助<位管理>達到目的 ...;一個小迴圈,等待中斷 ; 中斷產生,CPU響應進入服務程式 ; 讀出數據 ; IRET返回
-
PA輸入與上面類似。只不過用到的硬體是另一組。值得註意的是,A組的中斷法那一步中,輸出的INTR連接的是PC3(理論上分給了B組)。這是因為A組分到的四根C線,兩根用於方式1的輸入信號通訊(STB和IBF信號),兩根用於方式1的輸出信號通訊,已經用光了。這也是PB埠不能工作在方式2的原因,線不夠用了。
A組工作在方式1富餘的PC6和PC7,可以作為兩根單獨的IO線來使用。
還有一點,A組的中斷屏蔽觸發器INTEA設置的位管理還有一點不同:可見輸入輸出的位管理的相應位不同。
B. 輸出
輸出:先看圖
-
當CPU將數據輸出到PA埠,輸出緩衝器滿,8255A通過OBFfei埠低電平通知輸出設備緩衝器滿,同時OBFfei作為輸出設備的選通信號(STBfei)。
-
設備收到選通信號,回答ACKfei信號(一個負脈衝),8255A收到後,OBFfei就又變高了。
PC7:OBFfei
PC6:ACKfei
-
如何得知輸出緩衝器的情況?應當通過測試OBFfei信號是高電平來知道它是空的。這是查詢法。
-
中斷法則8255A通過PC3(A組)輸出INTRA高電平信號。這個信號的產生過程與前面類似:
- 編程設置INTEA為1,允許中斷。
- 當OBFfei為1(空),則向中斷控制器 8259A/CPU 發送中斷
-
與輸入對稱。空閑的PC5和PC4充當IO信號線。
3.4 工作方式二
只有PA埠可以工作在工作方式2:雙向方式。這就是方式1中A組輸入和輸出的綜合。
還剩PC0~PC2三根線,可以作為空閑IO線。
3.5 讀埠C狀態
方式0中,PC是數據埠,而在方式1和方式2中,C部分作為聯絡信號,所以讀取埠C,可以的值聯絡信號線的狀態,進而確定8255A當前的狀態。
4. 8255A與系統匯流排的連接
五種系統匯流排:8086最大模式、最小模式,8088最大模式、最小模式,PC/XT系統。
4.1 8086最小方式/最大方式
- 少了RESET,與CPU的reset相連
- 註意,上圖10.13的解碼電路少了IOR和IOW,應該加上(否則存儲器和IO的數據打架)
- 註意,上面兩個圖預設都是偶地址
4.2 PC/XT匯流排
基本相同,可以略過。
5. 8255A的應用
- A、B、C都工作在方式0輸出時,則相當於3片74LS374
- A、B、C都工作在方式0輸入時,相當於3片74LS245/74LS244。
講解了P306 例10.1。
-
假設採用A埠輸入,B埠輸出,且採取方式0。與匯流排連接關係如下:
解碼電路的地址為:0000_0010_1000_0xx,a0,同時還加上了M/IOfei
上圖少畫了RESET。
-
A:方式0輸入,B:方式0輸出
; 輸入 MOV DX,287H MOV AL,10010000B OUT DX, AL ; 輸出 MOV DX,281H IN AL,DX NOT AL;二極體的電路決定0亮1滅,所以取個反 MOV DX,285H OUT DX,AL ;如果加上延時再迴圈,就是亮滅亮滅...
P307的例10.3:
-
首先設計硬體電路:
-
解碼電路的地址:0000_0000_0010_0XX0
-
上圖缺少了IOR和IOW的解碼。應當與一下一起進入或門。
-
PA工作在方式0輸出,產生波形其實就是給0給1再加迴圈罷了。
; 設置A組方式0輸出
MOV AL,1000XXXX;可以用80H
;可以間接定址也可以直接定址
OUT 26H,AL
L2:
XOR AL,AL ;清零
OUT 20H,AL;0000輸出
MOV CX, 6
L1:
INC AL
OUT 20H, AL;0001輸出
LOOP L1
MOV AL,0FH
OUT 20H,AL;1111H
JMP L2
Part2 8253、8254
可編程計數器8253,8254的編程和應用。
1. 8253引腳功能
一個8253內部有3個16位計數器(計數器0~2),各有3個引腳:GAT0,CLK0,OUT0。
- CLK是輸入的計數時鐘信號,用來分頻,GAT用來控制是否計數,OUT 定時時間到後,輸出(或者說分頻輸出)。
- 8253對時鐘信號CLK是在下降沿同步計數的。
- 三個計數器可以級聯工作,以達到更大的分頻。
- 16位計數器可以當8位計數器,可以選擇高8位或低8位。
- 每個計數器6個工作方式。
下麵是埠的問題:每個計數器都對應1個狀態控制寄存器,所以一共3個寄存器埠,但這3個埠共用一個地址。
-
A1 A0:片內定址
-
CSfei:片選信號
CSfei A1 A0 功能 0 0 0 對計數器0操作
此時OUT寫,就是計數器0的計數初值
此時IN讀,則可以讀當前的計數值0 0 1 對計數器1操作 0 1 0 對計數器2操作 0 1 1 對內部方式控制寄存器操作 -
註意,這裡 1 1 表示選中控制寄存器,而8253內部有3個控制寄存器,所以需要額外的標誌位來確定。
-
D7 D6:
D7 D6 標誌 0 0 控制寄存器1 0 1 控制寄存器2 1 0 控制寄存器3 1 1 非法(8253)
鎖存當前狀態值(8254)
-
8253和8254的區別:
- 可接受的時鐘頻率不同,8254更大
- 8254內部有狀態寄存器(因此上面表中需要鎖存),8253沒有
- 沒有RESET.
2. 8253的內部組成與計數原理
以計數器0為例:
-
首先有一個方式控制字寄存器,可以通過數據線寫入來控制。確定工作方式。
-
計數初值寄存器CR(16位),所以數據線要寫兩次,先寫低八位,後寫高8位
-
減法計數器CE,在寫入初值後的第一個時鐘下降沿(CLK信號),8253自動將CR值打入CE,如果GATE有效,CE就對外部CLK進行減法計數
方式0~5,除了方式3,這個減法計數都是-1計數,而方式3是-2計數。
-
OL輸出鎖存器(16位):其值跟隨CE在變。可以通過IN指令將OL值讀出來(讀兩次),瞭解CE減到多少了。不過讀之前要向8253發送OL鎖存命令。讀走後OL開鎖,繼續跟著CE改變。
-
狀態寄存器:寄存該計數器當前的狀態。可以IN讀出(也需要先鎖存)。8253內部沒有這個寄存器,8254有。
小總結:A1-A0-CS 以信號1-1-0選中後,寫是寫到某個(這個某要看D7和D6)計數器的方式控制寄存器,讀讀的是計數器的狀態寄存器
3. 8253工作方式以及內部含義
-
首先D7和D6已經講過了,用於選擇計數器。
D7 D6 標誌 0 0 控制寄存器1 0 1 控制寄存器2 1 0 控制寄存器3 1 1 非法(8253)
鎖存當前狀態值(8254) -
D3 D2 D1:用於進行工作方式選擇,000101表示方式1方式5,110和111還表示方式2和方式3。(重點就是2和3)
D3 D2 D1 方式 解釋 0 0 0 0 CE減到0則停止,請求中斷 0 0 1 1 單脈衝形成 x 1 0 2 分頻器 x 1 1 3 方波產生器 1 0 0 4 選通信號產生,軟體觸發 1 0 1 5 選通信號產生,硬體觸發 -
D0:計數進位選擇,D0=1表示計數初值採取BCD格式,D0=0表示二進位格式
-
D4 D5:表示讀寫格式
D5 D4 解釋 0 0 向OL發鎖存命令,需要結合D6 D7一起選中某個計數器的OL 0 1 對低八位進行讀寫,8位計數器 1 0 對高八位進行讀寫,8位計數器 1 1 將選中的計數器設置為16位計數器
4. 8253工作方式
4.1 方式0
計數達到終值而發出中斷,舉例。假設占用300H~303H埠地址,以計數器0為例:
MOV DX,303H;方式控制寄存器
MOV AL,00110000B;選中00計數器,設置為16位計數器11,方式000,二進位計數0
OUT DX,AL;30H寫到計數器0的方式控制寄存器了
;寫信號一到來,工作方式確定,OUT引腳隨之確定,變為低電平。
;下麵向計數器0(對應埠300H)寫計數初值0005H
L2:MOV DX,300H
MOV AX,0005H
OUT DX, AL; 第二個寫信號,寫CR_LO
XCHG AH,AL
OUT DX, AL; 第三個寫信號,寫CR_H0
;初值寫完,OUT保持低電平
;CLK的上升沿時刻採集GATE信息,若為高電平,則可以計數。在下降沿時刻,CR值打入CE減法計數器。
;此後每到一個時鐘下降沿,CE-1
;CE減到0,OUT自動變為高電平,該上升沿可以向8259A提出中斷請求
;如果沒有繼續寫初值,OUT仍為高電平。
要給CR寫初值,下一定時周期才開始(意思是OUT仍保持高電平)。而CE沒有停止計數,繼續向下減。
L1:
MOV DX,303H
MOV AL,0000XXXXB
OUT DX,AL;發OL命令,鎖存OL值
MOV DX,300H
IN AL,DX;讀出OL的低八位
MOV AH,AL
IN AL,DX;讀出OL的高八位
XCHG AH,AL;高低位交換,OL此時==AX
; 這樣可以查看OL是否減到了0
; 上述過程在CPU內執行,與CE自減非同步,不好找到CE減到0的時刻,可以這麼判斷:
CMP AX,5;與初值比較,如果該結果>0,即AX>5,說明已經減到0了
JNA L1;不大於則繼續回去,鎖存查看比較
JMP L2;重新寫初值,L2在上面
如果在方式0工作期間,GATE突然降為低電平,則在上升沿採集到後的下降沿停止CE計數。GATE恢復高電平後恢復計數。這樣可以延長定時時間。
此外,在CE還未減到0時重新寫初值,也能延長定時時間。
定時器可以用於看門狗的設計,設置CR計時初值大於程式運行時間,當CPU代碼的IP指針跑飛引起死機時,就會引起中斷進入中斷服務程式,可以設置重新回到程式起始處/程式某處,重新執行。
4.2 方式1
硬體觸發的單脈衝形成。
MOV DX,303H
MOV AL,00010010B;計數器00,設置為8位計數器01,方式001,二進位計數0
OUT DX, AL;控制寄存器寫入12H,out引腳電平變高
;寫初值
MOV DX,300H
MOV AL,4
OUT DX,AL;CRL=4,初值寫完了,因為是8位計數器
;當GATE上升沿到來(觸發),CLK檢測到後的第一個下降沿,CRL0的值打入CEL0,同時OUT電平降低。!單脈衝開始!
/*註意單脈衝指的是OUT的單脈衝*/
; CLK每來一個下降沿,CE-1,減到0則OUT的低電平結束,繼續變為高電平
可以看出,GATE控制了單脈衝的形成,而初值控制了單脈衝的寬度。
4.3 方式2
分頻器,分頻脈衝形成。還是結合代碼來看。
MOV DX,303H
MOV AL,01110100B;計數器1 16位計數11,方式2 010,二進位0
OUT DX,AL; 寫入74H,OUT引腳變為高電平
MOV DX,301H
MOV AX,0006H;初值需要計算
OUT DX,AL
XCHG AH,AL
OUT DX,AL ;CR初值寫完
;若GATE為高電平,則允許計數,下一個下降沿時CR值打入CE
;此後每個周期CE-1,減到1後OUT自動變低,保持一個周期後,OUT自動變高,此時CE正好到0。
;OUT變高後,CR再次打入CE,也就是重置為6,重覆執行。
;此時是6分頻。
同理,中途GATE變低,CE停止計數,但是當GATE恢復高電平的那個上升沿時,CE重置為初值。
4.4 方式3
方波產生器。
MOV DX,303H
MOV AL,36H;00110110B
OUT DX,AL;out高電平開始
MOV DX,300H
MOV AX,0006H
OUT DX,AL
XCHG AH,AL
OUT DX,AL ;至此初值寫完
;第一個下降沿,CR0打入CE減法器,!若為偶數直接打入!,每來一個時鐘CE-2,減到0則OUT自動降低
;此時CE重置為初值,繼續自減2,再次減到0後,OUT反轉為高電平,重覆進行
;可見如果是偶數,高低電平時間相等,也就是方波了
;如果是奇數。
;奇數變為偶數(-1)再從CR打入CE,但高電平減到0時會向後保持一個周期,造成高電平比低電平多1周期:正方波(n+1)/2,負方波(n-1)/2
5. 8253的應用
傳統藝能之與匯流排的連接方法其實與前幾個硬體沒什麼不同,所以略過。
P293的9.11題。需要兩個計數通道級聯。
-
MOV DX,83H MOV AL,00010100B OUT DX,AL MOV DX,80H MOV AL,100 OUT DX,AL
-
需要級聯,將計數器1的OUT連到計數器2的CLK,計數器1的CLK接系統時鐘1MHZ
硬體連線程式管不了,需要電路上接好。
; 計數器1 MOV DX,83H MOV AL,011101000B OUT DX,AL MOV DX,81H MOV AX,1000;分頻1000 OUT DX,AL XCHG AL,AH OUT DX,AL ;計數器2 MOV DX,AL MOV DX,83H MOV AL,10010110B OUT DX,AL MOV AL,100;分頻100 OUT DX,AL