8259中断实验
一、实验目的
1. 掌握8259A编程中断控制器的工作原理和应用编程;
2. 学会编写中断控制下的工作程序。
二、实验内容
1. 连接实验过程中所需连接的所有导线,8259的IR0,IR1,IR2,IR3分别与开关K0,K2,K4,K6相连,8255A的PA0,PA1,PA2分别与开关K1,K3,K5相连,8255A的PB0,PB1,PB2,PB3,PB4,PB5,PB6,PB7分别与发光二极管的L0,L1,L2,L3,L4,L5,L6,L7相连(如图3-6所示);在了解和学会应用8259的基础上,利用8259组织中断实验。
2. 实现中断申请和中断嵌套。在程序中实现4级中断,0级、1级、2级和3级,第0级中断要求在七段显示器中循环显示0-F字符,由开关K0提出该级中断申请,开关K1控制该级中断处理程序的开始和结束,第1级中断要求从左到右运行跑马灯,由开关K2提出中断申请,开关K3控制该级中断处理程序的开始和结束,第2级中断要求从右到左运行跑马灯,由开关K4提出中断申请,开关K5控制该级中断处理程序的开始和结束,第4级中断要求退出整个实验,由开关K6提出中断申请。其中,0级中断优先级最高,当在运行中断处理程序时,如果有更高优先级的中断申请则转去响应更高的优先级中断申请,执行完后再返回到被中断的中断处理程序断点处继续往下运行。
在掌握了8259的工作原理和编程方法后,设计更多的实验,以加深对8259的理解。
实验提示
中断控制器8259A是Intel公司专为控制优先级中断而设计开发的芯片。它将中断源优先级排队、辨别中断源以及提供中断矢量的电路集于一片芯片中,因此无需附加任何电路,只需对8259A进行编程,就可以管理8级中断,并选择优先模式和中断请求方式,即中断结构可以由用户编程来设定。通过多8259A的级连,能构成多达64级的矢量中断系统。
8259A可以完成的工作有:优先级排队管理、接受和扩充外部设备的中断请求、提供中断类型号和进行中断请求的屏蔽和开放。8259A通过编程可以选择多种工作方式,大致可以分为:引入中断请求(中断触发)的方式、连接系统总线的方式、屏蔽中断源的方式、优先级排队的方式和结束中断的处理方式。
8259A的引脚图如图3-7 所示,8259A的内部结构如图3-8 所示:
:片选信号;:写信号;:读信号;D0~D7:双向数据总线,通过它传送命令,接受状态和读取中断相量;CAS0~CAS2:级联总线,主控8259A与从控8259A得连接线。主控时该线为输出,从控时则为输入;:主从定义/缓冲器方向。为双功能脚,在非缓冲方式中用做输入线,指定8259A为主控制器(SP=1)或时从控制器(SP=0)。在缓冲方式中用作输出线,控制缓冲器的接受/发送;INT:8259A的中断申请;IR0~IR7:外设的中断请求;:中断相应,2个中断响应脉冲,第一个用来通知8259A,中断申请已被响应,第二个作为读操作信号,读取8259A提供的中断类型好;A0:地址线,作为8259A的芯片内部端口地址。
8259A由中断请求寄存器(IRR)、正在服务寄存器(ISR)、中断屏蔽寄存器(IMR)、优先权分析器(PR)、读写控制逻辑和级联缓冲器/比较器组成。
8259A有7个命令(ICW1~ICW4和OCW1~OCW3),但只有2个命令口。为了便于识别,8259A设计者采用命令字定点分配命令端口地址及按顺序写命令相结合的办法,及命令按指定的命令端口写入(用A0指定为偶地址或奇地址)。若一端口需写入多个命令字时,则按规定的顺序写入,或以特征位标记。
8259A的命令分初始化命令和操作命令。前者是对8259A工作方式和工作条件的设置,后者是对中断处理过程实现动态控制的操作。
- ICW1(中断请求触发方式的设置及8259A芯片数目的选择)
格式如下:
D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 |
0 | 0 | 0 | 1 | LTIM | ADI | SNGL | IC4 |
16位机无效 | 特征位 | 电平触发 | 无效 | 单片使用 | 需要ICW4 |
其中,D3位决定电平触发方式(LTIM):D3=1,为电平触发方式;D3=0,为边沿触发方式。D1位决定单片使用(SNGL):D1=1,为单片使用;D1=0,为多片级联方式。D0位决定是否需要初始化命令字ICW4,对16位以上的微机系统一般都需要使用ICW4。ICW1命令除了上述作用之外,实际上它是对8259A进行复位,执行ICW1命令会使中断请求信号边沿检修电路复位,使它仅在IR信号由低变高时,才能产生中断;ICW1命令清楚中断屏蔽寄存器,设置完全嵌套方式的中断优先级排队,使IRQ0最高,IRQ7最低。
2. ICW2(中断类型号的设置)
8259A提供给CPU的中断类型号是一个8位代码,是通过初始化命令ICW2提供的。但由于ICW2的低3位被8位机占用,只有高5位能用,因此在初始化编程时,通过命令字ICW2只写入高5位,它的低3位使由中断请求线IRi的二进制编码决定,并且使在第一个到来时,将这个编号写入低3位。可见,同一片8259A上的8个中断源的中断号的高5位是相同的。
格式如下:
D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 |
T7 | T6 | T5 | T4 | T3 | 0 | 0 | 0 |
中断类型号的高5位 | 16位机无效 |
3. ICW3(中断级联方式的设置)
ICW3对主片和从片要分开写,主片的格式为:
D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 |
S7 | S6 | S5 | S4 | S3 | S2 | S1 | S0 |
当主片输入端IRi上连接有从片的中断请求INT时,则Si=1;否则,Si=0。
从片的格式为:
D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 |
× | × | × | × | × | ID2 | ID 1 | ID 0 |
3位从片标志码可有8种编码,表示从片的中断请求线INT被连接到主片的哪个输入端IRi。
在级联方式时,一般由一个作为主芯片的8259A和若干片作为从芯片的8259A组成。接高电平的8259A为主片,接地的为从片。从片的INT输出脚连到主片IR的输入端。主片的CAS0~CAS2应连到所有从片的CAS0~CAS2上。主片通过这3根专用的总线来向从片送出识别码ID,以遍对每一个从片单独选择。
需要指出的是,用户若使用从片8259A时,则在中断服务完毕后,返回DOS之前,必须发出两个EOI,一个给主片,一个给从片。因为在级联方式下,中断响应时,主片和从片分别将对应的ISR为置位
4. ICW4
1)ICW4-D4 (特定完全嵌套方式的设置)
8259A提供了一种特定的完全嵌套方式。在这个方式中,主片仅仅是不理睬那些比在ISR中更低的优先级的中断申请,而响应所有与ISR位相等的或较高优先级的中断申请。因此,如果主片采用特定完全嵌套方式,那么,当从片收到一个比该片服务中的那个优先级等级更高的中断申请,向主片发中断请求时,它时会被主片识别的。
特定完全嵌套方式是在主片的初始化时,由命令字ICW4的D4(SFNM)位指定。
2)ICW4– D3D2 (缓冲器方式的设置)
缓冲方式是指在8259A和系统数据总线之间是否由缓冲器。若有,则为缓冲方式,就要设置控制信号,以便能打开缓冲器。在缓冲方式中,利用引脚的控制8286双向总线驱动器的传送方向,而SP失去作用。若采用缓冲方式,并且是多级级联,则同时还要由位来设定8259A是主片还是从片。
缓冲方式是由命令字ICW4的D3D2(BUF,)两位来指定。
3)ICW4-D1 (中断结束方式的设置)
8259A的中断结束方式由两种:自动结束方式和非自动结束方式。
ICW4格式如下:
D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 |
0 | 0 | 0 | SFNM | BUF | AEOI | uPM |
D4=1,主片采用特殊完全嵌套方式;D4=0,主片采用一般的完全嵌套方式。
D3=1,8259A为缓冲器方式,此时引脚为输出线,用作控制缓冲器的数据传送方向;D3=0,8259A为非缓冲方式,此时为输入线,用作主/从控制。
D2=1,8259A缓冲方式下作主片;D2=0,8259A作从片。若在非缓冲方式,无意义,此时主/从分配由SP决定。
D1==1,自动结束方式,即ISR由自动复位功能,无须发送中断结束命令EOI;D1=0,为非自动结束方式,则在中断服务程序完毕后,要发送EOI命令。
D0=1,8259A用于16位机;D0=用于8位机。
4)OCW1(中断屏蔽操作)
OCW1的格式如下:
D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 |
M7 | M6 | M5 | M4 | M3 | M2 | M1 | M0 |
Mi=1,中断屏蔽寄存器的相应位置位;Mi=0,中断屏蔽寄存器的相应位复位。
5)OCW2(非自动中断结束方式的操作,中断排队方式的操作)
D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 |
R | SL | EOI | 0 | 0 | L2 | L1 | L0 |
优先级轮换 | 指定中断等级 | 中断结束 | 特征位 | 中断等级编码 |
D0~D2位:L0~L2位编码是用来指定中断等级(0~7)。该等级是为了对指定的ISR位复位或执行优先级指定轮转方式。它和D6位SL配合使用。
D5位:EOI用于所有需要使用中断结束命令的情况。若置1,则在中断服务完毕之后需要发送中断结束命令。若置0,就不需要发送中断结束命名。
D6位:SL用来设置需要指定的操作。若SL置1,则需要指定,并且用L0~L2位编码来指定中断等级;若SL=0,额不需要指定,并且L0~L2位无效(全部写0)。
D7位:R用来控制8259A中断优先级的轮换操作。若R位置1,则采用轮换优先级方式,并且按照SL,EOI及L0~L2各位的组态来执行优先级指定轮换;若R为0,则不采用优先级轮换方式,即优先级固定。
6)OCW3(查询方式的操作、特定屏蔽方式的操作、读状态操作)
D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 |
× | ESMM | SMM | 0 | 1 | P | RR | RIS |
不用 | 特定屏蔽允许 | 特定屏蔽设置 | 特征位 | 查询方式 | 读寄存器允许 | 读ISR |
D0位:RIS用于选择被读寄存器ISR或IRR。若要读ISR,则RIS置1;若要读IRR,则RIS置0。RIS的状态仅在RR位为1时有效。
D1位:RR用于读寄存器允许。若RR置1,则允许CPU按RIS位的设置读寄存器;若RR为0,则不允许读寄存器。
D2位:P用于发送出查询命令。若P置1,则通知8259A,CPU将执行一条读查询字的指令(A0=0),并且同时使读其他寄存器命令无效,CPU每读一次查询字之前都要发送该命令;若P为0,则不执行读查询字的指令。
D5位:SMM用于设置特定屏蔽方式。若SMM置1,则设置特定屏蔽方式;若SMM置0,则撤销特定屏蔽方式。
D6位:ESMM为允许特定屏蔽方式位,用来允许或禁止SMM。若ESMM=1,则SMM位有效;若ESMM=0,则SMM位无效。
向8259A写入初始化命令的流程如图3-9所示:
三、实验流程图
四、参考程序
DATA SEGMENT
NUM DB 3FH, 06H, 5BH, 4FH, 66H, 6DH, 7DH, 07H
DB 7FH, 6FH, 77H, 7CH, 39H, 5EH, 79H, 71H
IN0 DB ‘IRQ0 is running…$’
OUT0DB ‘IRQ0 is end…$’
IN1 DB ‘IRQ1 is running…$’
OUT1DB ‘IRQ1 is end…$
IN2 DB ‘IRQ2 is running…$’
OUT2DB ‘IRQ2 is end…$
DATA ENDS
CODE SEGMENT
ASSUME CS: CODE
START: CLI
MOV AX, DATA
MOV DS, AX
;初始化8255
MOV DX, 203H
MOV AL, 90H
OUT DX, AL ;PA口输入,PB口输出,工作方式0
;初始化8259
MOV DX, 210H
;MOV AL, 1BH ;ICW1,电平触发,单片使用
MOV AL, 13H ;ICW1,上升沿触发触发,单片使用
OUT DX, AL
MOV DX, 211H
MOV AL, 80H ;中断号为80h-87h
OUT DX, AL ;ICW2
MOV AL, 01H
OUT DX, AL ;ICW4,一般完全嵌套,非缓冲,非自动结束方式
PUSH DS
MOV AX, 0H
MOV DS, AX
MOV AX, OFFSET IRQ0
MOV SI, 200H ;中断号80h,IP矢量
MOV [SI], AX
MOV AX, SEG IRQ0
ADD SI, 02H ;中断号80h,段地址矢量
MOV [SI], AX
MOV AX, OFFSET IRQ1
ADD SI, 02H ;中断号81h,IP矢量
MOV [SI], AX
MOV AX, SEG IRQ1
ADD SI, 02H ;中断号81h,段地址矢量
MOV [SI], AX
MOV AX, OFFSET IRQ2
ADD SI, 02H ;中断号82h,IP矢量
MOV [SI], AX
MOV AX, SEG IRQ2
ADD SI, 02H ;中断号82h,段地址矢量
MOV [SI], AX
MOV AX, OFFSET IRQ3
ADD SI, 02H ;中断号83h,IP矢量
MOV [SI], AX
MOV AX, SEG IRQ3
ADD SI, 02H ;中断号83h,段地址矢量
MOV [SI], AX
POP DS ;还原数据段寄存器
MOV DX, 211H
IN AL, DX
MOV AL, 0H
OUT DX, AL ;开放8259所有中断
STI
LOOP1: JMP LOOP1
IRQ0: ;第六位LED循环显示0-f字符
PUSH AX
PUSH BX
PUSH DX
PUSH CX
MOV AH, 09H
MOV DX, OFFSET IN0
INT 21H
STI
MOV DX, 200H
LOOP00: IN AL, DX
AND AL, 01H
CMP AL, 01H
JNZ LOOP00 ;判断sw4号开关是否打开
MOV DX, 208H
MOV AL, 20H
OUT DX, AL
LEA BX, NUM
MOV AH, 0H
LOOP01: MOV CX, 50H
LOOP02: LOOP LOOP02
MOV AL, AH
MOV DX, 20EH
XLAT
OUT DX,AL ;输出数字
;判断sw4是否关闭,若关闭则结束子程序,否则继续输出数字
MOV DX, 200H
IN AL, DX
AND AL, 01H
CMP AL, 01H
JNZ JMP00 ;子程序结束跳JMP00
INC AH ;输出下一字符
CMP AH, 10H
JNZ LOOP01 ;输出未满16个字符,继续输出
MOV AH, 0H
JMP LOOP01
;结束子程序
JMP00: CLI
MOV DX, 20EH
MOV AL, 0
OUT DX, AL
MOV DX, 210H
MOV AL, 20H
OUT DX, AL ;指定方式结束8259中断
MOV AH, 09H
MOV DX, OFFSET OUT0
INT 21H
POP CX
POP DX
POP BX
POP AX
IRET
IRQ1:;LED显示灯从上至下走马灯
PUSH AX
PUSH BX
PUSH DX
PUSH CX
MOV AH, 09H
MOV DX, OFFSET IN1
INT 21H
STI
MOV DX, 200H
LOOP10: IN AL, DX
AND AL, 02H
CMP AL, 02H
JNZ LOOP10 ;判断sw5号开关是否打开
MOV AH, 01H
LOOP11: MOV CX, 50H
LOOP12: LOOP LOOP12
MOV DX, 201H
MOV AL, AH
OUT DX, AL
ROL AH, 1H
;判断sw5是否关闭,若关闭则结束子程序,否则继续输出数字
MOV DX, 200H
IN AL, DX
AND AL, 02H
CMP AL, 02H
JZ LOOP11 ;子程序未结束,跳LOOP11
CLI
MOV DX, 201H
MOV AL, 0H
OUT DX, AL
MOV DX, 210H
MOV AL, 20H
OUT DX, AL ;指定方式结束8259中断
MOV AH, 09H
MOV DX, OFFSET OUT1
INT 21H
POP CX
POP DX
POP BX
POP AX
IRET
IRQ2:;LED显示灯从下至上走马灯
PUSH AX
PUSH BX
PUSH DX
PUSH CX
MOV AH, 09H
MOV DX, OFFSET IN2
INT 21H
STI
MOV DX, 200H
LOOP20: IN AL, DX
AND AL, 04H
CMP AL, 04H
JNZ LOOP20 ;判断sw5号开关是否打开
MOV AH, 80H
LOOP21: MOV CX, 50H
LOOP22: LOOP LOOP22
MOV DX, 201H
MOV AL, AH
OUT DX, AL
ROR AH, 1H
;判断sw5是否关闭,若关闭则结束子程序,否则继续输出数字
MOV DX, 200H
IN AL, DX
AND AL, 04H
CMP AL, 04H
JZ LOOP21 ;子程序未结束,跳LOOP11
CLI
MOV DX, 201H
MOV AL, 0H
OUT DX, AL
MOV DX, 210H
MOV AL, 20H
OUT DX,AL ;指定方式结束8259中断
MOV AH, 09H
MOV DX, OFFSET OUT2
INT 21H
POP CX
POP DX
POP BX
POP AX
IRET
IRQ3:;退出程序
MOV AX, 4C00H
INT 21H
IRET
CODE ENDS
END START
五、实验结果