实验一 中断特性及8259应用编程实验
一、
实验目的
1、
掌握8259中断控制器的工作原理
2、
掌握8259可编程中断控制器的应用编程
3、
掌握8259级连方式编程
二、
实验设备
1、
TDN86/88实验系统
2、
排线、导线若干
三、
实验内容及步骤
1、8259A可编程中断控制器介绍及资源说明
8259A可以管理8级中断,可以将中断源优先级排队,辨别中断源,提供中断矢量。在级连使用时,可以构成64级中断系统。
8259A的编程,就是根据需求,向8259A芯片中写入初始化命令字ICW1-ICW4以及操作命令字OCW1-OCW3。
系统提供了两片8259A芯片,一片是与控制系统公用,(在实验板的左下方),级连时作为主片,口地址为20h,21h,另一片在实验板中上方,口地址为00h,01h。
中断源用实验板中的R-S触发器(在实验板的右侧)产生,四个引脚,kk1+,kk1-,kk2+,kk2-。
2、8259A编程说明
a)、8259A初始化编程
b)、系统的8259A初始化参数:
ICW1:13h,ICW2:08h,ICW3:不用,ICW4:0Dh
即单片、要ICW4、向量从8开始,缓冲方式、正常EOI。
c)、系统的8259A的0号,4号中断被系统使用,(时钟和串口使用),
编程的时候,不要用它们,也不要屏蔽它们。其他中断都可以使用。
d)、由于系统加载程序是从0000:2000开始,所以中断服务程序的地址
偏移量要注意处理一下,偏移量加上2000 h。
3、
实验一:单片8259A的中断实验
a)、实验线路图:
b)、程序流程图
(由于用的是系统的8259A片,系统已经初始化过了,这个程序不
用再次初始化了)
c)、参考程序8259A1.asm
STACK SEGMENT STACK
DW
64 DUP(?)
STACK ENDS
CODE SEGMENT
ASSUME
CS:CODE
start:
PUSH
DS
;设置irq7中断服务程序地址
;中断服务地址放在0000:003c-0000:003f
MOV
AX,0000H
MOV
DS,AX
MOV
AX,OFFSET IRQ7
ADD
AX,2000H
MOV
SI,003CH
MOV
[SI],AX
MOV
AX,0000H
MOV
SI,003EH
MOV
[SI],AX
CLI
POP
DS
;读IMR,去掉对irq7的屏蔽,再写入 IMR
IN
AL,21H
AND
OUT
21H,AL
;设置中断服务次数
MOV
CX,000AH
A1:
CMP
CX,0000H
JNZ
A2
;10次服务后,重设IMR,屏蔽Irq7
IN
AL,21H
OR
AL,80H
OUT
21H,AL
STI ;开中断
HLT ;处理器暂停,等待PC机操作
A2:
STI ;循环,等待中断
JMP
A1
;中断服务中,调用bios 显示功能,显示7和于一个空格,中断次数减一
IRQ7
proc near
MOV
AX,0137H
INT
10H
MOV
AX,0120H
INT
10H
DEC
CX
;正常EOI,通知8259A此次服务结束
MOV
AL,20H
OUT
20H,AL
CLI
IRET
IRQ7 endp
CODE ENDS
END START
d)、实验步骤:
1)、接好试验线路
2)、编写修改程序,编译连接,加载到0000:2000
3)、运行程序g=0000:2000
4)、按动KK2开关,屏幕上将有“7 ”显示,直到10次,按“停止”结束程序,返回控制。
4、
实验二:单片8259,两个外部中断,试验中断优先级
a)、实验线路图:
b)、程序思路:
设置irq6,irq7中断服务地址,重新初始化8259A,主程序不停的显示“MAIN ”;响应中断后,中断服务程序会显示“6 ”和“7 ”。
要实现中断抢先,8259A中不能屏蔽该中断,cpu要响应中断(即STI), 但cpu响应中断后,会自动关闭中断,所以,中断服务程序中要STI指令开中。
中断服务程序中可以多加几个延时段,可以更清楚地看清中断抢先。
c)、参考程序8259A2.asm
STACK SEGMENT STACK
DW
64 DUP(?)
STACK ENDS
DATA SEGMENT
;字符串"MAIN "
TABLE DB 4DH,41H,49H,4EH,20H,00H
DATA ENDS
CODE SEGMENT
ASSUME
CS:CODE,DS:DATA
START:
MOV
AX,DATA
MOV
DS,AX
PUSH
DS
;设置IRQ6 IRQ7地址
MOV
AX,0000H
MOV
DS,AX
MOV
AX,OFFSET IRQ6
ADD
AX,2000H
MOV
SI,0038H
MOV
[SI],AX
MOV
AX,0000H
MOV
SI,003AH
MOV
[SI],AX
MOV
AX,OFFSET IRQ7
ADD
AX,2000H
MOV
SI,003CH
MOV
[SI],AX
MOV
AX,0000H
MOV
SI,003EH
MOV
[SI],AX
POP
DS
;初始化8259A主片
;ICW1
MOV AL,13H
OUT
20H,AL
;ICW2
MOV
AL,08H
OUT
21H,AL
;ICW4
MOV
OUT
21H,AL
;OCW1
MOV
OUT
21H,AL
;开中,CPU响应中断
STI
;主程序一直显示MAIN
A1:
MOV
CX,0007H
MOV
AX,010DH
INT
10H
A2:
MOV
AH,06H
MOV
BX,OFFSET TABLE
INT
10H
CALL
DALLY
JMP
A1
;IRQ6,开中断,延时,显示"6 "
IRQ6
proc near
;让CPU还能响应中断,当前中断服务可以被高优先级中断打断
STI
call dally
call dally
CALL
DALLY
MOV
AX,0136H
INT
10H
MOV
AL,20H
OUT
20H,AL
IRET
IRQ6
endp
;IRQ7,开中断,延时,显示"7 "
IRQ7
proc near
STI
call dally
call dally
CALL
DALLY
MOV
AX,0137H
INT
10H
MOV
AL,20H
OUT
20H,AL
IRET
IRQ7
endp
;延时程序段
DALLY proc near
PUSH
CX
PUSH
AX
MOV
CX,0040H
A3: MOV AX,056CH
A4: DEC AX
JNE
A4
POP
AX
POP
CX
RET
DALLY endp
CODE ENDS
END
START
d)、实验步骤:
1、画出以上程序图
2、连接实验线路图
3、编译连接程序,加载到0000:2000
4、运行程序,G=0000:2000,按动KK1,kk2,观察屏幕显示;在触发IRQ7,
屏幕还没有显示“7 ”之前,触发IRQ6,观察结果,说明原因。
(验证中断抢先)
注:程序设置的中断触发方式是边沿触发,KK1,KK2由接的“+”
“-”不同,可能在按下时触发,也可能是在弹开时触发,总称触发。
5、
实验三:两片级连,响应从从片引入的中断
a)、实验连接图:
b)、程序思路:
初始化主片,从片,设置中断向量地址,开中响应中断。
中断服务程序,显示“7 ”。
c)、参考程序:8259A3.asm
STACK
SEGMENT STACK
DW
64 DUP(?)
STACK ENDS
CODE SEGMENT
ASSUME
CS:CODE
START:
;重设8259,先关中
CLI
;初始化设置主片
;ICW1
MOV
AL,11H
OUT
20H,AL
;ICW2
MOV
AL,08H
OUT
21H,AL
;ICW3
MOV
AL,80H
OUT
21H,AL
;ICW4
MOV
OUT
21H,AL
;OCW1
MOV
OUT
21H,AL
;初始化、设置从片
;ICW1
MOV
AL,11H
OUT
00H,AL
;ICW2
MOV
AL,30H
OUT
01H,AL
;ICW3
MOV
AL,07H
OUT
01H,AL
;ICW4
MOV
AL,09H
OUT
01H,AL
;OCW1
MOV
OUT
01H,AL
PUSH
DS
;设置中断服务地址
MOV
AX,0000H
MOV
DS,AX
MOV
AX,OFFSET IRQ7
ADD
AX,2000H
MOV
SI,00DCH
MOV
[SI],AX
MOV
AX,0000H
MOV
SI,00DEH
MOV
[SI],AX
POP
DS
;开中响应中断
A1:
STI
HLT
JMP
A1
;中断服务中,显示"7 "
IRQ7
proc near
MOV
AX,0137H
INT
10H
MOV
AX,0120H
INT
10H
;正常EOI结束,分别给主从片发EOI
MOV
AL,20H
OUT
00H,AL
OUT
20H,AL
IRET
IRQ7
endp
CODE ENDS
END
START
d)、实验步骤:
1、写出程序流程图
2、连接实验线路,连好后,拔下接从片INTA的排线,开启实验系统电
源进入正常状态后,再接上此排线。否则,不能进入正常状态(“>”提示符)。
3、编译连接程序,加载到0000:2000
4、运行程序,G=0000:2000,按动 kk1,观察屏幕输出。
6、思考实验:(选作)
级连方式,从片上接两个中断源,要求实现从片上的中断抢先。
参考连接图:
思路:
1、主片要设为特殊嵌套方式
2、中断服务程序中要及时开中