中断控制器8259A及中断服务
- 格式:doc
- 大小:98.00 KB
- 文档页数:4
8259a中断控制器:利用8259A的IRQ2显示中断过程目录8259a中断控制器:利用8259A的IRQ2显示中断过程 (1)设计题目: (1)要求: (1)设计思路: (1)实验代码: (2)实验心得体会: (10)设计题目:利用8259A IRQ2显示中断过程要求:1.主是在7段数码管上循环显示‘8’从右到左显示2.中断服务中在7段数码管上依次显示全1234567 89要去显示2秒左右时间可采用软件Software延迟(时间可通过调试大致2秒左右)总计中断9次结束返回DOS3.每次由手动产生IRQ2中断请求信号引起中断设计思路:软件Software方面有两个主要部分:主和中断服务子主首先要完成是些和处理工作例如查找设备设置TPC卡中9054芯片IO口,保存原来0AH号中断中断向量设置新中断向量设置中断掩码显示提示信息然后打开中断进入主循环在主循环中不断在LED上从右向左显示8直到被IRQ2中断信号打断此外在主中还对中断执行进行计数当计数满9次后自动跳出为了使主上8循环可以看出来故将显示8延迟设计比较长当完成9次中断主还要完成些后续处理工作:恢复中断掩码;恢复中断向量;设置TPC卡中9054芯片IO口,关闭中断返回DOS中断子完成在6位数码管上“同时”显示个数功能这个数为1—9中某个可以用循环次数作为参数这里同时显示实质上是利用视觉上暂停效果即只要每秒能在同个数码管上显示信息超过24次看起来就是同时了而这点在现在计算机速度条件下很容易实现为了不发生混乱在中断子执行过程中不允许再次中断另外中还有两个子:findtpc和dispword这些是为了完成查找设备等预处理硬件方面实验时把总线上IRQ2引脚和拨键开关相连以手动产生中断信号另外再把LED片选信号CS和210-217相连(注:LED显示是通过向LED数据端口送入数据再向LED位选端口送入位选信号来实现)实验代码:;386以上微机适用;纯dos下才能使用;tasm4.1或以上编译;**********************************************;;*利用8259AIRQ2 显示中断过程*;;**********************************************;io_plx_device_id equ 05406h ;TPC卡设备IDio_plx_vendor_idequ 010b5h ;TPC卡厂商IDIO_PLX_SUB_ID EQU 0905410B5H;TPC卡子设备及厂商IDportseg EQU 211H-200H ;数码管端口地址portbit EQU 210H-200Hdata segmentcsregdw?[Page]ipreg dw? ;旧中断向量保存空间irq_times dw10 ;中断计数msg1 db 0dh,0ah,\'TPC pci card Interrupt\',0dh,0ah,\'$\'msg2 db 0dh,0ah,\'Press any key to exit!\',0dh,0ah,\'$\'msg3 db 0dh,0ah,\'Press DMC or wait to errupt 10 times and exit!\',0dh,0ah,\'$\'io_9054base_address db 4 DUP(0) ;TPC卡PCI接口芯片I/O基地址暂存空间io_base_addressdb 4 DUP(0) ;TPC卡I/O基地址暂存空间errupt_line db 2 DUP(0) ;TPC卡中断号暂存空间pcicardnotfind db 0dh,0ah,\'TPC pci card not find or address/errupt error !!!\',0dh,0ah,\'$\' io9054baseaddress db 0dh,0ah,\'TPC pci card 9054 Chip I/O Base Address : \',\'$\' iobaseaddress db 0dh,0ah,\'TPC pci card I/O Base Address : \',\'$\'number db 0dh,0ah,\'TPC pci card Interrupt Line : \',\'$\'enter_ db 0dh,0ah,\'$\'MESS DB \'8253A TIMER0 IN MODE3! COUNT=0200H\',0AH,0DHDB \'8253A TIMER1 IN MODE2! COUNT=0aH\',0AH,0DH,\'$\'irq_vect db 08h,09h,0ah,0bh,0ch,0dh,0eh,0fh,70h,71h,72h,73h,74h,75h,76h,77h;新中断向量,中断0-7向量为:08h-0fh,中断8-15向量为:70h-77hirq_mask_0_7_table db 011111110b,011111101b,011111011b,011110111bdb 011101111b,011011111b,010111111b,001111111bdb 011111011b,011111011b,011111011b,011111011b[Page] db 011111011b,011111011b,011111011b,011111011b;新中断掩码,中断0-7时从低至高相应位为零,中断8-15时第2位为零irq_mask_8_15_table db 0ffh,0ffh,0ffh,0ffh,0ffh,0ffh,0ffh,0ffh db 011111110b,011111101b,011111011b,011110111bdb 011101111b,011011111b,010111111b,001111111b;新中断掩码,中断0-7时全,中断8-15时从低至高相应位为零LED DB 06,5BH,4FH,66H,6DH,7DH,07,7FH,6FHdata endsstacks segmentdb 100 dup (?)stacks endscode segmentassume cs:code,ds:data,ss:stacks,es:datastart:;Enable Local Interrupt Input.386climov ax,datamov ds,axmov es,axmov ax,stacksmov ss,axcall findtpc ;查找TPC卡资源并显示movdx,word ptr io_9054base_addressadd dx,68h;设置tpc 卡中9054芯片io口,使能中断in ax,dxor ax,0900hout dx,axmov bx,word ptr errupt_line ;保存原中断向量mov al, ptr [irq_vect+bx]mov ah,35h21hmov ax,esmov csreg,ax[Page] mov ipreg,bxmov bx,word ptr errupt_line ;设置新中断向量mov al, ptr [irq_vect+bx]mov cx,csmov ds,cxmov dx,off _procmov ah,25h21hmov ax,datamov ds,axmov es,axin al, 21h ;设置中断掩码mov bx,word ptr errupt_linemov ah, ptr [irq_mask_0_7_table+bx]and al,ahout 21h, alin al, 0a1hmov bx,word ptr errupt_linemov ah, ptr [irq_mask_8_15_table+bx]and al,ahout 0a1h, almov dx,off msg2mov ah,09h21hmov dx,off msg3mov ah,09h21hmov irq_times,0sti ;开中断loop1:cmp irq_times,9 ;等待中断并判断中断9次后退出jz exitmov ax,datamov ds,ax[Page] mov al,7FHmovdx,word ptr io_base_addressadd dx,portsegout dx,almov al,blmovdx,word ptr io_base_addressadd dx,portbitout dx,alpushcxmov cx,0FFFFhskip3:push cxmov cx,03FFHskip4:loop skip4pop cxloop skip3pop cxshl bl,1cmp bl,40hjne skip5mov bl,01hskip5:jmp loop1exit:climov bx,word ptr errupt_line ;恢复中断掩码mov ah, ptr [irq_mask_0_7_table+bx]not ahin al, 21hor al, ahout 21h, almov bx,word ptr errupt_linemov ah, ptr [irq_mask_8_15_table+bx]not ahin al, 0a1hor al, ah[Page] out 0a1h, almov bx,word ptr errupt_line ;恢复原中断向量mov al, ptr [irq_vect+bx]mov dx,ipregmov cx,csregmov ds,cxmov ah,25h21hmov ax,data ;设置tpc 卡中9054芯片io口,关闭中断mov ds,axmov dx,word ptr io_9054base_address add dx,68hin ax,dxand ax,0f7ffhout dx,axmov ax,4c00h21h ;退出_proc proc farclipush axpush dxpush dsmov bl,01hmov ax,datamov ds,axmovsi,irq_timesmov cx,05FFHagain:mov al,LED[si]movdx,word ptr io_base_addressadd dx,portsegout dx,almov al,blmovdx,word ptr io_base_addressadd dx,portbit[Page] out dx,alshl bl,1cmp bl,40hjne skip6mov bl,01hskip6:push cxmov cx,0FFFFHagain2:pushcxmov cx,10again4:loopagain4pop cxloop again2pop cxloop againmov al,20h ;Send EOIout 0a0h,alout 20h,alinc irq_timespop dspop dxpop axstiiret_proc endpfindtpc proc near ;查找TPC卡资源并显示pushadpushfdmov ax,0b101h1ahjc findtpc_notfind ;检查PCI BIOS是否存在mov ax,0b102hmov cx,io_plx_device_idmov dx,io_plx_vendor_idmov si,01ahjc findtpc_notfind ;检查tpc卡是否安装,设备号、厂商号[Page]mov ax,0b10ahmov di,02ch1ahjc findtpc_notfindcmp ecx,io_plx_sub_idjnz findtpc_notfind ;检查tpc卡是否安装,子设备号、厂商号mov ax,0b10ahmov di,14h1ahjc findtpc_notfind ;读TPC卡9054芯片I/O基址信息mov dword ptr io_9054base_address,ecxand ecx,1jz findtpc_notfind ;检查是否为i/o基址信息mov ecx,dword ptr io_9054base_addressand ecx,0fffffffehmov dword ptr io_9054base_address,ecx;去除i/o指示位并保存MOV AX,0B10AHMOV DI,18HINT 1AHJCfindtpc_notfind ;读TPC卡I/O基址信息mov dword ptr io_base_address,ecxand ecx,1jz findtpc_notfind ;检查是否为i/o基址信息mov ecx,dword ptr io_base_address[Page] and ecx,0fffffffehmov dword ptr io_base_address,ecx ;去除i/o指示位并保存mov ax,0b10ahmov di,3ch1ahjc findtpc_notfind ;读TPC卡中断信息and cx,0ffhmov word ptr errupt_line,cx ;去除errupt其它指示位并保存mov dx,off io9054baseaddress ;显示i/o提示信息mov ah,09h21hmov ax,word ptr io_9054base_addresscall dispword ;显示i/o基地址mov dx,off iobaseaddress ;显示i/o提示信息mov ah,09h21hmov ax,word ptr io_base_addresscall dispword ;显示i/o基地址mov dx,off number ;显示errupt提示信息mov ah,09h21h[Page] mov ax,word ptr errupt_linecall dispword ;显示中断号mov dx,off enter_ ;加回车符,换行符21hpopfdpopadretfindtpc_notfind:mov dx,off pcicardnotfind ;显示未找到tpc卡提示信息mov ah,09h21hmov ax,4c00h21h ;退出findtpc endpdispword proc near ;显示子push dxpush cxpush bxmov cx,4mov bx,16dispword_loop1:push axpush cxsub bx,4mov cx,bxshr ax,cland al,0fh ;首先取低4位[Page] mov dl,alcmp dl,9 ;判断是否<=9jle dispword_num ;若是则为\'0\'-\'9\',ASCII码加30H add dl,7 ;否则为\'A\'-\'F\',ASCII码加37Hdispword_num:add dl,30hmov ah,02h ;显示21hpop cxpop axloop dispword_loop1pop bxpop cxpop dxret ;子返回dispword endpend start实验心得体会:本实验难点在LED显示上由于在此的前我直认为LED显示是由8255A驱动所以开始做这个时我首先想到是利用8255A但是结合实验箱上LED我才发现这样思路方法行区别于是再回头认真学习了下LED显示原理才发现LED显示其实很简单只要往数据端口送数据再往位选端口送入位选代码就可以了这下流程变得豁然开朗另外在设计时候我和其他同学讨论了手动中断信号种种产生方式最终发现用开关直接和总线插槽上IRQ2直接相连时最简单思路方法!本实验些预处理操作和有关TPC实验板化、后处理都是结合平时实验在此基础上修改完成经过小组成员致努力我们圆满完成了这次实验任务!经过此次实验我体验了从实战到学习再到实战过程乐趣。
82598259A是一个可编程的中断控制器,应用在实时的、以中断方式进行监控的计算机系统中。
用一片8259A可以管理8个等级的中断申请。
并可再经级联扩展多至8片8259A,使得中断等级可扩展多至64级。
8259A可以作为一个I/O外围器件,用系统软件编程,它所具有的多种优先权方式可以通过主程序在任何时候进行改变或重新组织。
这意味着可以按照全系统的外围情况和要求,设计出一个完整的中断结构,用来实现优先管理、中断屏蔽以及自动中断矢量转移。
它几乎可以适合于任何一种中断控制的结构,因而得到了广泛的应用。
1 引脚图8259A为28脚双列直插式封装的器件。
2 内部结构其工作过程如下:第一步:当中断请求线(IR0~IR7)上有信号输入时,就把中断请求寄存器IRR相应的位置1。
第二步:当IRR的一位置1后,就会与IMR中相应的屏蔽位进行比较,如该屏蔽位为0,则请求被发送给优先级分析器;如该屏蔽位为1,则封锁该请求。
第三步:当一个中断请求被输入优先级分析器后,将由优先权分析器判定其优先权,然后向CPU 发中断申请,INT脚变高(INT联到8086的INTR)。
第四步:CPU的INTR引脚为异步状态接收,也就是它可以在任何时间(与时钟无关)接收中断。
在软件控制下利用STI指令(中断置位)或CLI(中断复位)指令可分别将CPU的“中断开放标志位”IF置位或复位,可以做到接受或不理睬在INTR上的中断申请。
第五步:假定CPU中的IF标志为1,则CPU在完成当前指令的即进入中断响应周期,这个中断响应周期将标志寄存器入栈,然后清除IF标志,关闭了中断。
再将代码段寄存器和指令指针也入栈(这是为了从中断服务程序返回),然后CPU发出第二个 INTA脉冲通知8259A,说明8086已经允许了它的中断请求。
若8086用于“最小方式”,则INTA脉冲信号为8086 INTA引脚上的信号;若8086用于“最大方式”时,则8086 LOCK脚在中断响应序列执行期间变为低电平。
实验四使用8259A的单级中断控制实验一、实验目的1.掌握中断控制器8259A与微机接口的原理和方法。
2.掌握中断控制器8259A的应用编程。
二、实验内容编制程序,利用开关作为8259芯片IR7的中断源,人工控制产生单一中断。
中断的功能是驱动发光二极管,使其亮灭,不停地闪动。
三、实验提示8259中断控制器是专为控制优先级中断设计的芯片。
它将中断源优先级排队,辩别中断源以及提供中断矢量的电路集于一片中。
因此无需附加任何电路,只需对8259进行编程,就可以管理8级中断,并选择优行模式和中断请求方式,即中断结构可以由用户编程来设定。
同时,在不需要增加其它电路的情况下,通过多片8259的级联,能构成多达64级的矢量中断系统。
实验箱中采用一片8259A中断控制芯片,工作于主片方式,8个中断请求输入端IR0~IR7对应的中断型号为8~F,其和中断矢量关于如下表所示。
表1 8259中断矢量对应关系务程序程序,使系统每次响应外部中断IR7时发光二极管闪烁。
四、实验电路五、实验软件清单Port0 EQU 0FFE0HPort1 EQU 0FFE1HCODE SEGMENTASSUME CS:CODE,DS:CODE,ES:CODEORG 3400HP8259: CLIMOV AX,OFFSET INT8259MOV BX,003CHMOV [BX],AXMOV BX,003EHMOV AX,0000HMOV [BX],AXCALL FOR8259MOV AL,0FEHMOV DX,0FFE4HSTIJMP $;============================== FOR8259:MOV AL,13HMOV DX,Port0OUT DX,ALMOV AL,08HMOV DX,Port1OUT DX,ALMOV AL,09HOUT DX,ALMOV AL,7FH ;IRQ7OUT DX,ALRET;--------------------------- INT8259:cliPush dxPush axMOV AL,20HMOV DX,Port0OUT DX,ALPop axPop dxOut dx,almov cx,0loop $Rol al,1STIIRETCODE ENDSEND P8259六、实验软件框图七、实验步骤(1)按实验电路图连接线路:①开关Ki 和8259 7号中断IR7插孔相连。
说明8259a中断控制器中的irr、isr和imr三个寄存器的功能8259A中断控制器是一种常用的外部设备,用于管理和分发系统中的中断请求。
它有三个重要的寄存器:IRR(中断请求寄存器)、ISR (中断服务寄存器)和IMR(中断屏蔽寄存器),这些寄存器在控制和处理中断时起到关键作用。
IRR寄存器(Interrupt Request Register)用于存储当前发生的中断请求。
每个位都对应一个中断源,当某个外部设备发出中断请求时,对应位会被置为1。
CPU可以通过读取IRR寄存器来检测当前的中断请求状态,以确定哪个中断源需要被处理。
ISR寄存器(Interrupt Service Register)用于记录正在被CPU处理的中断源。
当中断请求被CPU接受后,对应的中断源的位会被置为1,表示该中断正在被处理。
ISR寄存器的内容可以帮助CPU追踪当前正在处理的中断,以避免同时处理多个中断源。
IMR寄存器(Interrupt Mask Register)用于屏蔽中断请求。
每个位对应一个中断源,当对应位被置为1时,表示该中断源被屏蔽,即中断请求不会被接受。
通过设置IMR寄存器,CPU可以选择性地屏蔽或允许特定的中断源。
通过IRR、ISR和IMR这三个寄存器的配合使用,8259A中断控制器可以有效地管理和分发系统中的中断请求。
CPU可以通过读取IRR寄存器来检测中断请求,并根据IMR寄存器的设置来确定是否屏蔽某个中断源。
当CPU接受一个中断请求后,会将对应的中断源的位设置为1,并在ISR寄存器中记录下来,以便追踪和处理当前的中断。
当中断处理完成后,CPU会清除ISR寄存器中的相应位,表示中断已经处理完毕。
通过使用这些寄存器,8259A中断控制器可以实现多个中断源的优先级管理、中断请求的屏蔽和中断处理的跟踪。
这些功能对于保证系统可靠性和提高系统的响应能力非常重要。
8259A中断控制器IRQ2的应用
一、实验目的
掌握8259A中断控制器工作原理,熟悉实验中涉及到的中断屏蔽寄存器IMR和中断服务寄存器ISR等的使用方法.
学会中断处理程序的编写
二、实验内容
用8259A的输出作为中断请求信号使8259A产生中断,进入中断后
显示一个字符串.
中断请求通过8259的IRQ2端输入,中断源可以是片外8253定时器输出的脉冲,并把8253的OUTO和总线槽IR02连接好.
编写程序,要求每次主机响应外部中断IRQ2时,显示字符串
“THIS IS A 8259A INTERRUPT!”(或其它串),中断十次后,程序退出。
三.编程提示
本实验使用PC/XT机内的8259A芯片,主机启动实际时已将8259A中断寄存器前五位初始化为00001,因此,IRQ2的中断号应为0AH。
主机IRQ2保留给用户使用,而其他外中断已由系统时钟,键盘等占用,因此,编程时要注意系统中已使用的中断请求号。
只须将IMR 寄存器中对应IRQ2的位清零,允许IRQ2中断即可。
机内8259A初始化为普通结束方式,因此,外中断结束时,必须
使用中断结束命令清除中断服务寄存器ISR中的对应位。
程序退出时,关闭IRQ2中断,即给IMR中相应位置1,禁止中断。
机系统中IRQ2硬中断为用户保留的。
编程时首先应将IRQ2对应的中断向量(中断号为0ah)保存起来,然后设置新的中断向量以指向中断处理程序。
另外,还要将中断屏蔽寄存器的相应位开放。
实验内容:中断控制器8259A及中断服务
1、实验连线原理见图1所示:
8259A连线:
(1)单脉冲与时钟单元“”插孔和8259的3号中断IR3插孔相连作为中断源;
(2)8259的INT连8088的INTR(Xl5);
(3)8259的INTA连8088的INTA(Xl2);
(4)8259的CS端接EX1(8259A端口地址是60H,61H);
(5)A0→A0。
(6)IOWR→IOWR;
(7)IORD→IORD;
(8)连通CPU和8259A的数据总线,JX4→JX17。
8255连线:
(1)将8255的A端口的PA7到PA0连接到灯L1~L8上。
图1:实验连线图
2、实验原理:按动按键AN0后,单脉冲与时钟单元部件会产生“”信号,该信号的上升沿作为中断请求送8259A的IR3引脚,如果8259A没有屏蔽该级中断并且其优先级最高,8259A向CPU的INTR引脚送中断,CPU如果允许响应中断,则进入中断处理子程序,中断处理子程序向8255A的A端口送数据,将灯L1~L8点亮1秒。
3、实验要求:单片8259A以缓冲方式连接数据总线,以上升沿作为中断请求信号,中断源通过IR3引入,优先级采用一般全嵌套方式,非自动中断结束方式,引脚IR0~IR7的中断类型号为08F~0FH,编写一个汇编程序,主程序完成8255和8259A的初始化,循环等待中断请求;中断处理子程序将灯点亮1秒后熄灭。
4、端口地址:
5、系统内存分配:
5、程序结构:
CODE SEGMENT
ASSUME CS:CODE
MAIN PROC
START: ;主过程
;初始化8259
;初始化8255
;调用3号中断 MAIN ENDP
INT3 PRCO
……;中断处理子程序 INT3 ENDP
DELAY PROC
…… ;延时子过程
DELAY ENDP
CODE ENDS
END
6、程序流程图
主程序
代码:
PA EQU 0FF28H ;8255A端口地址标号定义 PB EQU 0FF29H
PC EQU 0FF2AH
PCTL EQU 0FF2BH
INTPORT1 EQU 0060H ;8259控制口地址标号定义 INTPORT2 EQU 0061H
CODE SEGMENT
ASSUME CS:CODE
ORG 1000H
MAIN PROC
START: CLI ;CPU关中断
MOV AL,80H ;初始化8255
MOV DX,0FF2BH
OUT DX,AL
PUSH DS ;保护DS
MOV AX,0
MOV DS,AX
MOV DI,0B*4
MOV DX,OFFSET INT3
MOV WORD PTR[DI],DX
MOV DX,SEG INT3
MOV WORD PTR[DI+2],DX
POP DS ;恢复DS
MOV AL,13H ;初始化8259A
OUT 60H,AL
MOV AL,08H
OUT 61H,AL
MOV AL,0DH
out 61H,AL
MOV AL,0F7H
OUT DX,AL ;开放8259A中断
STI ;CPU开中断
HLT
WATING: JMP WATING ;循环等待中断请求
MAIN ENDP
INT3 PROC
PUSH DX
PUSH AX ;保护现场
STI
MOV DX,PA
MOV AL,00H
OUT DX,AL ;灯全亮
CALL DELAY1S ;延时子程序
MOV AL,0FFH
OUT DX,AL ;灯全灭
MOV DX,INTPORT1
MOV AL,20H
OUT DX,AL ;送中断结束命令 CLI
POP AX
POP DX ;恢复现场
MOV AL,20H
OUT 60H,AL
IRET ;中断返回
INT3 ENDP
DELAY1S PROC
PUSH CX
PUSH DX
MOV DX,04
AGAIN: MOV CX,0FFFFH
DELAY: LOOP DELAY
DEC DX
JNZ AGAIN
POP DX
POP CX
RET
DELAY1S ENDP
CODE ENDS
END START。