搜索
bottom↓
回复: 7

proteus仿真8086 8259,奇地址IO读写问题解决不了

[复制链接]

出0入0汤圆

发表于 2012-9-28 11:19:20 | 显示全部楼层 |阅读模式
请教各位,proteus仿真8086 8259中断系统,8259的D0-7应该怎么接。
我遇到的问题是:
1。如果接8086的AD0-7,则在8259初始化写入OCW2(OUT 21h, AL)时,因此时A0=1,BHE=0,则8086的奇偶地址控制起作用,8086是将数据送上AD8-15总线,导致8259从AD0-7收不到数据,实际写入OCW2为0。

2。我改了一下,将AD0-7和AD8-15根据BHE信号做了选通,当A0=1,BHE=0时,8259接上AD8-15。但问题来了,当中断触发,8086进入INTA2阶段,要从AD0-7读入8259送出的中断类型码时,因前面选通器的作用,8259的数据实际是送上了AD8-15,导致8086的AD0-7为0,即读入的中断类型码为0。

这两个问题似乎是无解的矛盾,OCW2就是一个BYTE奇地址,8086要写入它必然是从AD8-15送数据;但回头读中断类型码时,又要从AD0-7走。

请问应该怎么做?

阿莫论坛20周年了!感谢大家的支持与爱护!!

曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……

出0入0汤圆

 楼主| 发表于 2012-9-28 11:24:14 | 显示全部楼层
自己结贴:用点小技巧,将8259的地址均设为偶地址(设好CS选通逻辑),8259的A0实际是接8086的A1等其它地址线,避免奇地址访问。

是从这篇贴子的贴图和程序中找到答案的:
http://www.amobbs.com/forum.php? ... &highlight=8259

出0入0汤圆

发表于 2012-9-28 11:25:22 | 显示全部楼层
换成8088芯片试验吧,8086的16位总线有点麻烦呢。

出0入0汤圆

 楼主| 发表于 2012-9-28 16:10:24 | 显示全部楼层
PROTEUS里没有8088仿真。。。

又遇到一个新问题:
中断源接8259的IR1,ICW2中断向量设置为80H起。所以IR1的中断向量应该为81H。

仿真中,看8086的日志,它能够从AD0-7读到正确的向量81H,但是却显示触发中断01H,调用的中断向量地址也是01H的(从地址0004-0007H中取中断服务地址)。
而且不管我将中断源换成IRx,都是一样能够正确地读到向量,但却总是调用01H的中断服务地址。

NND!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2012-9-28 17:01:01 | 显示全部楼层
8086对于8位的外设只能采用偶地址寻址,所以8259的地址均设为偶地址(设好CS选通逻辑),8259的A0实际是接8086的A1等其它地址线,避免奇地址访问。
8088对于8位的外设可采用奇/偶地址寻址.

出0入0汤圆

 楼主| 发表于 2012-9-28 21:42:16 | 显示全部楼层
yxw_bob 发表于 2012-9-28 17:01
8086对于8位的外设只能采用偶地址寻址,所以8259的地址均设为偶地址(设好CS选通逻辑),8259的A0实际是接80 ...

确实如你所说。

现在碰到的问题是,8259在第二个INTA周期时,明明已经将正确的微量号送上D0-7,8086也正确捕捉了,但8086却总是以一个错误的向量来进行中断调用。这个错误向量证实是总线上一次传送的数据。

比如上一次总线送过 OUT DX, AL(20h),则下一次中断时8086总是调用INT 20h中断。在LOG里看到8086是先FIRED一个错误向量,然后再报告得到正确的向量。如我的截图。

搜了半天有个可怜的家伙也碰到同样问题
http://www.edaboard.com/thread253124.html

尚无解啊。。。

出0入0汤圆

 楼主| 发表于 2012-9-28 21:58:13 | 显示全部楼层
似乎找到解法,明天试试
http://bbs.elecfans.com/jishu_206341_1_1.html

出0入0汤圆

 楼主| 发表于 2012-10-4 20:13:17 | 显示全部楼层
alexbird 发表于 2012-9-28 21:58
似乎找到解法,明天试试
http://bbs.elecfans.com/jishu_206341_1_1.html

硬件上,这个BUG应该是无解了(即PROTEUS中8259在第二个INTA时虽然送出正确的INT VECTOR,而且8086也能正确地识别到,但8086依然会调用一个错误的INT中断号,而这个错误的中断号等于总线上一次传输的数据值)

绕开个问题的方法有一种,即在中断处理程序中,用人工地读取8259当前ISR来获得正确的中断VECTOR:
1。先将整个中断向量表(0-255号中断)全部填成一个中断处理接口过程地址
2。在这个接口过程中,道德对OCW3发出0FH的读取ISR命令,然后读取,得到当前正确的中断向量
3。将中断向量转换成对应的真正中断处理过程地址(我用了查表法)
4。调用真正的中断处理过程进行中断处理
5。返回中断接口过程后,进行8259 EOI等清ISR操作,IRET结束中断处理。

参考附件代码

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-8-25 20:17

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表