5.2.3 中断控制器8259
·弄清芯片外部引线以便将它们连接到系统中;
·了解它们的工作方式和工作特点,以便有选择地应用它们的某些工作方式;
·理解芯片内部的控制字、命令字,以便对它们进行编程;
·了解每块芯片所占的地址,以便具体进行连接;
·在上述基础上实现对芯片的初始化及具体应用。
下面我们就开始具体介绍可编程中断控制器8259。
1. 8259的外部引线
可编程中断控制器8259外部引线图如图5.15所示。
D0-D7为双向数据线,与系统总线的数据线相连接。
WR、RD 为写和读控制信号,与系统总线的读写信号相连接。
CS为片选信号,只有CS 为低电平时,才能实现CPU对8259的写或读操作。
A0是8259内部寄存器的选择信号。
INT为8259的中断请求输出信号,可直接接到CPU的INTR输入端。
INIT为中断响应输入信号。
CAS0~CAS2为级联控制线。
SP/EN 为双功能引线。
IR0~IR7中断请求输入端。
8259的内部有多个寄存器,其中包括:
中断请求寄存器(IRR),其内部保存着所有外部中断源IR0~IR7的中断请求状态。
中断服务寄存器(ISR),用来保存所有正在服务的中断源。当8259收到中断结束命令时,其寄存的状态进行调整。
中断屏蔽寄存器(IMR),保存着被屏蔽的所有中断源。其屏蔽功能可用命令修改。
2. 8259的工作方式
通过编程,可以设置8259的不同工作方式,以便适应不同环境的需要。这也说明8259工作的灵活性和适应性。
(1) 8080/85与8086/88工作模式
(2) 特殊屏蔽方式
在正常情况下,当一个中断请求被响应时,8259将禁止所有同级及更低优先级中断请求,这就称为一般屏蔽方式。
但是,在一特殊情况下,希望也允许较低优先级的中断请求产生中断。这时,可用特殊屏蔽方式。要做到这一点,需要利用后面将要提到的8259初始化命令字。
一个特殊屏蔽方式的示意图如图5.19所示,其中SMM等需要参看后面的命令字的定义。
(3) 中断结束
8259中,中断结束是利用复位ISR中的相应位来实现的。
具体有两种方法:
① 自动结束。
② 利用命令结束。
(a)一般中断结束命令(EOI)。
(b)特殊中断结束命令(SEOI)。
(4)优先级循环
根据8259命令字的规定,它有两种优先级规定:循环优先级和固定优先级。
循环优先级有3个结构:自动优先级循环用于中断源具有相等优先级的情况。
(5)查询状态
通过将操作命令字OCW3中的P位置1(后面要提到),可以查询8259的状态。
3. 8259的内部控制字
(1)初始化命令字
①初始化命令字ICW1。在A0=0,D4=1时为写入,各位的功能见图5.21。
②初始化命令字ICW2。
③初始化命令字ICW3。
④初始化命令字ICW4。
(2) 操作命令字OCW
①操作命令字OCW1。
②操作命令字OCW2。
R为优先级循环控制位,R=1为循环优先级;R=0为固定优先级。 L2、L1、L0为系统最低优先级编码,用它们来指定哪个IR优先级最低。
EOI是中断结束命令。该位为1时,将复位现行中断的中断服务寄存器中的相应位。在非自动EOI的情况下,需要用OCW2来复位当前最高优先级所对应的位。
SL用于选择L2、L1、L0编码。当SL=1时,L2~L0编码有效。SL=0时,L2~L0编码无效。除上述所说的外,R,SL,EOI编码功能见图5.26和表5.1。
③操作命令字OCW3。OCW3可用以设置查询方式、特殊屏蔽方式以及读8259的中断请求寄存器IRR、
中断服务寄存器ISR、中断屏蔽寄存器IMR的当前状态。OCW3各位功能如图5.27所示。
4. 8259的寻址与连接
为了使8259按照设计者的要求工作,就需要利用软件将初始化命令及操作命令字写入8259;
另一方面为了知道8259的工作状态,又必须将其内部的一些寄存器的内容读出来。对寄存器和命令的访问控制如表5.2所示。
5. 8259的初始化使用
下面是8259的初始化程序:
SET59A:MOV DX,0FF00H ;8259A的地址,A0=0
MOVAL,13H; ICW1,LT1M=0,单片,需要ICW4
OUT DX,AL
MOV DX,0FF02H;8259地址,此时A0=1
MOV AL,48H;ICW2,中断向量码
OUT DX,AL
MOV AL,03H ;ICW4,8086/88模式,自动EOI,非缓冲
OUT DX,AL;方式,一般全嵌套
MOV AL,0E0H; OCW1,屏蔽IR5,IR6,IR7
因为未用到这3个中断输入
OUT DX,AL
MOV DX,0FF02H
MOV AL,0;取OCW1为00H
OUT DX,AL;取00H写入IMR
IN AL,DX;读IMR
OR AL,AL;判断其内容为00H否
JNZ IMERR
MOV AL,0FFH
OUT DX,AL
IN AL,DX
ADD AL,1
JNZ IMERR
在读IMR时,可直接在对应A0=1的地址上读出;但要读IRR或ISR时,则必须先向8259写入一个命令字OCW3。以下是读出ISR内容的一段程序:
MOV DX,0FF00H ;对应A0=0
MOV AL,0BH ;0BH为OCW3
OUT DX,AL ;OCW3写入8259
IN AL,DX ;读出ISR的内容,放在AL中
具体做法如下:
(1) 编写20ms中断服务程序
CLOCK PROC FAR
PUSH AX
PUSH SI
MOV AX,SEGTIMER
MOV DS,AX
MOV SI,OFFSETTIMER
MOV AL,[SI] ;取50次计数
INC AL
MOV[SI],AL
CMP AL,50 ;判1s到否?
JNE TRNED
MOV AL,0
MOV [SI],AL
MOV AL,[SI+1] ;取60s计数
ADD AL,1
DAA
MOV [SI+1],AL
CMP AL,60H ;判1min到否?
JNE TRNED
MOV AL,0
MOV [SI+1],AL
MOVAL, [SI+2] ;取60min计数
ADD AL,1
DAA
MOV [SI+2],AL
CMP AL,60H ;判1h到否?
JNE TRNED
MOV AL,0
MOV [SI+2],AL
MOV AL,[SI+3];取小时计数
ADD AL,1
DAA
MOV [SI+3],AL
CMP AL,24H
JNE TRNED
MOV AL,0
MOV [SI+3],AL
TRNED:POP SI
POP AX
STI
IRET
ENDP
(2)确定中断向量,初始化8259
(3)初始化中断向量表
(a)直接编程初始化中断向量表
INTITB:MOV AX,0000H
MOV DS,AX
MOV SI,0120H
MOV DX,OFFSETCLOCK
MOV [SI],DX
MOV DX,SEGCLOCK
MOV [SI+2],DX
(b) DOS系统调用
若在DOS下工作,则可采用DOS系统调用:
INT 21H的功能25H
25H→AH
中断向量码→AL
中断服务程序段:偏移量→DS:DX
程序如下:
MOV AH,25H ;功能号
MOV AL,48H ;中断向量码
MOV DX,SEGCLOCK
MOV DS,DX
MOV DX,OFFSETCLOCK
INT21H
6. 8259的级联
当微型机系统中的中断源较多,一片8259不能解决问题时,可以采用级联工作方式。这时指定一片8259为主控芯片,它的INT接到CPU上而其余的8259芯片均作为
从属芯片,其INT输出接到主控芯片的IR输入端。由于主控8259有8个IR输入端,故一个主控8259可以连接8片从属8259,最多允许有64个IR输入。