3. 中断技术
3.1 中断的概念和类型
3.2 中断号
3.3 中断触发方式和排队方式
3.4 中断向量和中断向量表
3.5 中断的处理过程
3.6 中断控制器
3.6.1 82C59的外部特性和内部寄存器及端口地址
3.6.2 82C59的工作方式
3.6.3 82C59的编程命令
初始化命令顺序
- ICW1 : A0=0
【例】若259A采用电平触发,单片使用,需要 ICW4(对16位机以上,D0=1),则:
MOV AL,00011011B ;ICW1的内容
OUT 20H,AL ;写入ICW1端口 (A0=0)
- ICW2 : A0=1
【例】硬盘中断号0DH,即00001101B - ICW3 : A0=1
- 主片ICW3设置:
1:主片的某个IR上连有从片 0:主片的某个IR上未连从片 - 从片ICW3设置
从片ICW3:从片的INT引脚连到主片的IR引脚编号:000-111 【例】从片A和从片B的请求线INT连到主片的IR3和IR6
主片的ICW3=01001000B=48H
MOV AL,48H ;主片的ICW3
OUT 21H,AL
从片A的ICW3=00000011B=03H
MOV AL,02H ;从片A的ICW3
OUT 0A1H,AL
从片B的ICW3=00000110B=06H
MOV AL,06H ;从片A的ICW3
OUT 0B1H,AL
- ICW4 : A0=1
【例】某计算机的CPU为8086,8259A与系统总线之间采用缓冲器连接,非自动结束方式,只用1片259A,正常完全嵌套。
ICW4=00001101B=0DH,相应的初始化程序段:
MOV AL,0DH
OUT 21H,AL
- OCW1: A0=1
用于设定中断屏蔽,每一位对应一个中断输入。0=开放,1=屏蔽. 【例】要使中断源IR3开放,其余被屏蔽则: OCW1=11110111B=F7H。在主程序中,在开中断之前,写相应的程序段:
MOV AL,0F7H
OUT 21H,AL ;OCW1内容送端口
IN AL,21H ;回读21H端口的内容
- OCW2 A0=0
- 中断结束控制(OCW2格式中的D6)
当初始化命令ICW4选用非自动结束方式 时(D5=1) ,就利用OCW2来控制中断结束: SL(D6)=0 结束当前中断 OCW2=00100XXXB(L2-L0=任意值,常用000) SL(D6)=1,结束指定中断 OCW2=01100L2L1L0 例:指定IR5的中断结束,则: OCW2=01100101B=65H - 作中断优先级排队控制
【例】要对IR3中断指定中断结束方式, OCW2=01100011B=63H。在中断服务程序中,中断返回指令IRET前,写相应的程序段:
MOV AL,63H
OUT 20H,AL ;写入OCW2端口(A0=0)
【例】对IR3中断采用不指定中断结束方式,, OCW2=00100000B=20H。在中断服务程序中, 中断返回指令IRET前,写相应的程序段
MOV AL,20H
OUT 20H,AL ;写入OCW2端口(A0=0)
- OCW3 A0=0
读取8259A的IRR,ISR寄存器的内容 设置特定屏蔽方式 查询中断方式 读状态操作 8259A内部有3个寄存器IRR,ISR,IMR可供CPU读出当前的内容。
-
读IRR和ISR的方法 CPU先指定读哪个寄存器,然后再发IN指令,才能读取ISR和IRR中的内容。当8259A初始化后,自动指向读IRR寄存器。 -
读IMR的方法 不需要先发指定命令,只要读奇地址端口。 【例】读ISR寄存器的内容 通过OCW3指定被读的寄存器,OCW3为00001011B,表示下个RD要读ISR,用IN指令读出ISR寄存器的内容 MOV AL,0BH ;OCW3表示读ISR
OUT 20H,AL ;20H为OCW3的口地址
IN AL,20H ;读ISR寄存器
【例】读IRR寄存器的内容 通过OCW3指定被读的寄存器,OCW3为00001010B,表示下个RD要读IRR;用IN指令读出IRR寄存器的内容 MOV AL,0AH ;OCW3表示读IRR
OUT 20H,AL ;20H为OCW3的口地址
IN AL,20H ;读IRR寄存器
【例】读查询字(查询有无中断-写ISR) 分两步:通过OCW3发送出查询命令, OCW3为00001100B,表示下个RD要读查询字,用IN指令读出查询字的内容。 MOV AL,0CH ;用OCW3发送查询命令
OUT 20H,AL ;20H为OCW3的口地址
IN AL,20H ;读查询字
查询字的格式: 8259A的编程命令使用总结 8259A有两类编程命令,初始化命令字ICW和操作命令字OCW,都是通过D0-D7传输的。 ICW:在初始化里完成,必须按一定的顺序;在PC机中已有系统软件完成,不需要也不允许由用户自己去设置;一般只对于没有配置完善操作系统的单板微机上进行 OCW:没有一定的顺序,一般也不安排在程序的开头;在初始化后的任何时候进行动态控制
3.7 可屏蔽中断系统
系统初始化
主片:
ICW1=11H;边沿触发,多片,要ICW4
ICW2=08H;中断号高5位
ICW3=04H;主片的IR2接到从片上,D2=1
ICW4=01H;非缓冲,全嵌套,16位CPU
从片:
ICW1=11H,ICW2=70H,ICW3=02H, ICW4=01H
初始化主片:
INTA00 EQU 20H
INTA01 EQU 21H
MOV AL,11H ;ICW1
OUT INTA00H,AL
JMP SHORT $+2 ;I/O端口延时要求
MOV AL,08H ;ICW2
OUT INTA01H,AL
JMP SHORT $+2
MOV AL,04H ;ICW3
OUT INTA01H,AL
JMP SHORT $+2
MOV AL,01H ;ICW4
OUT INTA01H,AL
初始化从片:
INTB00 EQU 0A0H
INTB01 EQU 0A1H
MOV AL,11H ;ICW1
OUT INTB00H,AL
JMP SHORT $+2 ;I/O端口延时要求
MOV AL,70H ;ICW2
OUT INTB01H,AL
JMP SHORT $+2
MOV AL,02H ;ICW3
OUT INTB01H,AL
JMP SHORT $+2
MOV AL,01H ;ICW4
OUT INTB01H,AL
3.8 用户对系统中断资源的使用
3.8.1 修改中断向量
; 取N号中断的原中断向量并保存
CLI ;修改中断向量时要关中断!
MOV AH, 35H
MOV AL, N
INT 21H
MOV OLD_SEG,ES
MOV OLD_OFF,BX
;设置N的新中断向量
PUSH DS
MOV DX, SEG INTRnew ;取新中断向量段基地址
MOV DS, DX
MOV DX, OFFSET INTnew ;取新中断向量偏移地址
MOV AL, N ;中断类型号为N
MOV AH, 25H
INT 21H
POP DS
IN AL,21H ;8259开中断
AND AL,0FBH ;1111 1011B 开发IR2
OUT 21H,AL
STI
;发完数据后恢复原中断向量
MOV DS, OLD_SEG
MOV DX, OLD_OFF
MOV AL, N
MOV AH, 25H
INT 21H
3.8.2 发中断屏蔽/开放和中断结束指令
主程序中写OCW1执行中断屏蔽与开放 中断服务程序中写OCW2,发中断结束指令EOI
NEW_INT PROC FAR
STI ;开中断
;寄存器进栈
;服务程序主体
;向主/从82C59A发中断结束命令
MOV AL, 20H
OUT 0A1H, AL
OUT 20H,AL
;寄存器进栈
;中断返回
IRET
NEW_INT ENDP
开放IRQ2中断的方法:
IN AL,21H ;读IMR寄存器
AND AL,0FBH ;对应IRQ2的位置0
OUT 21H,AL
关闭IRQ2中断的方法:
IN AL,21H ;读IMR寄存器
OR AL,04H ;对应IRQ2的位置1
OUT 21H,AL
|