微机原理实验七八参考资料 下载本文

内容发布更新时间 : 2024/11/20 15:35:43星期一 下面是文章的全部内容请认真阅读。

实验七 定时器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,'$'