鉴于大家对其他类别十分关注,我们编辑小组在此为大家搜集整理了“基于8259A芯片接口电路设计”一文,供大家参考学习
客服咨询,网学网竭诚为您服务,本站永久域名:myeducs.cn |
3.4 对部分代码的说明 实验台上显示的外部结构图中我们增加了8259A的内部逻辑框图的展示,在这个编写上我们主要是运用把一幅整图分割开为几个等块,然后将我们需要的小的框图填充在分割好的整图里。运用 pDC->Rectangle(rx,ry,rx + rcx,ry + rcy);确定图的大小;运用pDC->MoveTo、pDC->LineTo确定之间连线的情况;运用pDC->TextOut(rx+2,ry+2,"ISR");或pDC->DrawText("ISR",CRect(rx,ry,rx + rcx,ry + rcy),DT_CENTER | DT_VCENTER | DT_SINGLELINE ) ;标记在小的框图上显示该框图指代的名称。其中在pDC->DrawText中,DT_CENTER是横排居中,DT_VCENTER是竖排居中,DT_SINGLELINE是只有单排文件的情况下,在这里的“或”不是单纯的满足其中一个就能实现的意思,而是需要同时满足这三个条件才能实现。 系统启动时,8259A被初始化,其初始化是通过系统中的初始化程序设置初始化命令字ICW来实现的。系统初始化时,规定IRQ0和IRQ4中断源分别提供给实时时钟和PC微机联机的串口通讯,用户可以使用其余的中断源。在进入监控后,只有IRQ4中断源处于开启状态,其他中断源都被屏蔽了。 3.4.1 固定值的定义方式 根据8259A的功能和引脚我们知道,在该芯片中引脚1、引脚14、引脚27、引脚28都是固定值。即都是确定的响应信号。所以只需要将输入的信号值直接等价到各个对应的引脚上即可。 其程序代码大致为: int D8259::SetPin(int iPinNo , int iSigVal) { int ret = 0 ; CString msg ; iSigVal = iSigVal ? 1 : 0 ; switch(iPinNo) { case 1: pinCS = iSigVal ; break; case 14: pinGND = iSigVal ; break; case 27: pinA0 = iSigVal ; break; case 28: pinVCC = iSigVal ; break; default : ret = -1; } return ret ; } 3.4.2 与CPU之间的连接线定义方式 8259A之所以能对CPU提出的中断做出响应或想CPU发出中断的申请,都是因为有INT和INTA这两根线与其CPU打交道。其中INT是8259向CPU的中断请求线,而INTA是CPU给出的中断响应线。是根据proINTA(pinINTA,iSigVal)而实现的。 在编写代码的时候,我们就了解到,该程序重点是8259A的执行原理和如何去执行计算机所提出的命令。 在8259A中其执行命令有两个下降沿。 这两个下降沿的大致走向如简图3-4所示: 图3-4 8259A执行响应的脉冲图 在第一个 INTA负脉冲到达8259时,8259完成以下三项工作: a.使IRR(中断请求寄存器)的锁存功能失效。这样一来,在IR7~IR0上的请求信号就不会被8259接收。直到第二个INTA负脉冲到达8259时,才又使IRR的锁存功能有效。 b.使ISR(服务中寄存器)中的相应位置1。 c.使IRR中的相应位清0。 第二个INTA负脉冲到达8259时,8259完成以下工作: a.将中断类型码(ICW2中的值)送到数据总线上,CPU将其保存在“内部暂存器”中。 b.如果ICW4(它设定级中断联方式之特定完全嵌套方式,)中设置了中断自动结束方式,则将ISR的相应位清0。 其代码编写大致如下: int D8259::proINTA(int pre,int cur)//pre是前一信号值,cur是当前信号值 { int INTA1=0; int INTA2=0; //int ret=0; if(pre==1 && cur==0 && idxINTA==0) //第一个INTA到来 { INTA1=pinINTA; ISR=hpLevel; IRR=0; idxINTA =1 ; } if(pre==1 && cur==0 && idxINTA == 1) //第二个INTA到来 { INTA2=pinINTA; if(OCW2 & 0x20) //中断结束 { if(OCW2 & 0x40) //指定EOI方式 { ISR=(OCW2 & 0x7; //将此值赋给ISR的相应位 } } 3.4.3 判断优先级的引脚设定 优先级判断是个相当复杂的过程。其相关的引脚是引脚18到引脚25,根据中断优先级分析器的工作原理,优先级的判断过程首先,由8个“与门”逻辑选出参加中断优先级排队的中断请求级,即8位IRR与8位IMR各位分别送入“与门”输入端,只有当IRR位置 “1”(有中断请求)和IMR位置“0”(开放中断请求)同时成立时,相应“与门”输出才为高电平,并送到优先级编码器的输入端参加编码。 其次,优先级编码器对参加排队的那些中断优先级中进行编码,并从中选出当前最高优先级的代码,作为下一步比较的一个输入(A2 A1 A0)。 最后,把来自ISR的当前正在服务的优先级(B1 B2 B0)与当前请求的最高优先级(A2 A1 A0)一起送入比较器进行比较,当比较器A>B端输出有效时,并且只要当前存在非屏蔽的中断请求,“或门”输出有效时,8259A即向CPU提出中断请求INT。 在编程过程中我们运用的是“isINT()”来对输入的信号进行判断,同时判断出哪一个输入的信号其优先级是最高的。根据其判断过程我们得到编程过程大致为: int D8259::isINT(int IR , int pre, int cur) //判断是否产生中断请求信号,实现屏蔽、优先级判断等 { CString msg ; int ret = 0 ; int isReq = 0 ; //表示有无中断请求 if(InitStep == 5 ) // 表明正常进行相关的中断判断。 } 在这里我们要知道InitStep==5表示的是已经对8259A初始化完毕,而InitStep==?是有不同意义的。 当InitStep==0时,表示未初始化;而InitStep==?(1、2、3、4)时表示初始化中的某一步骤;InitStep==5时才表示完成了完整的初始化过程,才能进行中断判断。 |
本站发布的计算机毕业设计均是完整无错的全套作品,包含开题报告+程序+论文+源代码+翻译+答辩稿PPT |
本文选自计算机毕业设计http://myeducs.cn |