内容发布更新时间 : 2024/12/27 3:46:21星期一 下面是文章的全部内容请认真阅读。
实验七 定时器8253与中断控制器8259A实验
二、实验电路
CLK0 GATE0 OUT0 8253 CLK1 GATE1 OUT1 CS GND WR RD IOW IOR 图1 8253与8259 实验电路图
接1MHZ输出端 +5V 接IRQ7 280H~287H
五、实验项目
1.该实验用PC机内部的中断控制器8259A,中断源用TPC-H实验箱上的8253来产生,电路如图1
所示,将8253计数器0,计数器1分别设置为方式3和方式2,计数初值设为2000,使8253每隔4秒产生一次中断请求。 2.编写程序,要求每次主机响应外中断IRQ7时,显示\,在键盘上敲任意一个键,程序退出。
3.修改电路和程序,直接用手动产生单个脉冲作为中断请求信号,要求每按一次开关产生一次中断,
在屏幕上显示一次\,中断10次后程序退出。
六、编程提示
1.在TPC-H实验系统的接口卡上有一个跳线开关(JP),可以选择IRQ2、IRQ3、IRQ4、IRQ7引到试
验箱上的IRQ插孔,出厂设置的是IRQ7。
2.由于9054的驱动程序影响直写9054芯片的控制寄存器,中断实验需要在纯DOS的环境中才能正
常运行。
3.由于TPC卡使用PCI总线,所以分配的中断号每台微机可能都不同,编程时需要了解当前的微机使用那个中断号并进行设置,获取方法如下:在纯DOS环境下 C:\\ASM\\>提示符下键入PORTR1后敲回车键,会得到:
TPC PCI Card 9054 Chip I/O Base Adress:2000 TPC PCI Card I/O Base Adress:2400
TPC PCI Card Memory Base Adress:d2000000 TPC PCI Card Interrupt Line:0A
其中,2000为PCI卡上9054芯片的基地址;2400为试验箱的基地址,2400/2407对应的是280/287H插孔;0A表示系统分配中断为IRQ10。
4.由于TPC卡使用9054芯片连接微机,所以在编程使用微机中断前需要使能9054的中断功能,代码
如下:
mov dx,ioport_cent+68h ;设置tpc 卡中9054芯片io口,使能中断
in ax,dx
实验七 定时器8253与中断控制器8259A实验
or ax,0900h out dx,ax
其中IOPORT_CENT是9054芯片寄存器组的I/O起始地址(TPC PCI Card 9054 Chip I/O Base Adress:2000),+68H的偏移是关于9054芯片中断使能的寄存器地址,设置含义如下: 设置INTCSR(68H)寄存器,中断模式设置:
BITS 8 功能 1:能够产生PCI中断 0:禁止产生PCI中断 11 1:能够LOCAL端输入的中断送到PCI端 0:禁止LOCAL端输入的中断送到PCI端 其它位为零即可,更多内容参看9054芯片数据手册 程序退出前还要关闭9054的中断,代码如下:
mov dx,ioport_cent+68h ;设置tpc 卡中9054芯片io口,关闭中断 in ax,dx
and ax,0f7ffh out dx,ax
5. PC机中断控制器8259 的主片地址为20H、21H, 从片地址为A0H、A1H,编程时要根据中断类型号设置中断矢量,8259中断屏蔽寄存器IMR对应位要清零(允许中断),中断服务结束返回前要使用中断结束命令:
MOV AL,20H OUT 20H,AL OUT 0A0H,AL
中断结束返回DOS时应将IMR对应位置1,以关闭中断。
;手动产生单个脉冲作为中断请求信号对应程序 data segment
int_offset dw ?
int_seg dw ? ;旧中断向量保存空间 irq_times db 10 ; 中断计数 flag db 0 ; 中断标志
msg1 db 0dh,0ah,' THIS IS A 8259A INTERRUPT !',0dh,0ah,'$' data ends code segment
assume cs:code,ds:data start: mov ax,data mov ds,ax
cli
; TPC PCI Card 9054 Chip I/O Base Adress:2000时
mov dx,2068h ;设置 tpc 卡中9054芯片io口,使能中断 in ax,dx or ax,900h out dx,ax push ds
; TPC PCI Card Interrupt Line:0A,分配中断为IRQ10时,中断类型号为72H mov ax,3572h
int 21h ;保存原中断向量
mov int_seg,es mov int_offset,bx
mov ax,seg int_proc ;设置新中断向量 mov ds,ax
mov dx,offset int_proc mov ax,2572h int 21h
in al, 0a1h
and al, 11111011b
out 0a1h, al ;开放从片相应的中断 pop ds sti
loop1: cmp flag,0 je loop1
mov dx,offset msg1 mov ah,9 int 21h mov flag,0 dec irq_times jnz loop1
cli
in al, 0a1h
or al, 00000100b
out 0a1h, al ;屏蔽从片相应的中断
mov dx, int_offset ;恢复原中断向量
mov ds,int_seg mov ax,2572h int 21h
mov dx,2068h ;设置 tpc 卡中9054芯片io口,关闭中断
in ax,dx and ax,0f7ffh out dx,ax sti
mov ax,4c00h int 21h int_proc proc far push ax mov flag,1
mov al,20h out 0a0h,al
out 20h,al ;Send EOI pop ax iret int_proc endp code ends end start
;8253每隔4秒产生一次中断请求对应程序 data segment
int_offset dw ?
int_seg dw ? ;旧中断向量保存空间 flag db 0
msg1 db 0dh,0ah,' THIS IS A 8259A INTERRUPT !',0dh,0ah,'$'