2616|3

66

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

求救!关于8259A的问题 [复制链接]

我写了一个程序,用于读取8259A的中断请求寄存器IRR,中断服务寄存器ISR,
中断屏蔽寄存器IMR,为什么读出的IRR和ISR都总是0,而IMR总是0x18,是什么原因,望高手指点!

读取IRR寄存器的源程序:

#include
#include "IOport.h"   /*定义了OutPortb,InPortb函数 */
main()
{
   int i;
   asm cli      /*嵌入的汇编 */
   OutPortb(0x20,0x0a);       /*将0x0a输出到断口0x20 */

   asm nop      /*延时 */
   asm nop
   asm nop

   i=InPortb(0x20);          /*从断口0x20读入数据(即IRR寄存器的内容)*/
   printf("The IRR is %x \n",i);
   asm sti
   getch();
}

最新回复

谢谢!不过还是没找到原因.我的程序是在WINDOWS下运行的,不知道是不是操作系统的原因啊.在虚拟机(dos系统)上也是一样的结果.郁闷!!  详情 回复 发表于 2008-7-27 17:03
点赞 关注

回复
举报

74

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
怎么没人回答啊?
 
 

回复

77

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
我不能说出原因,但给你一个我写过的程序,供你参考.
// Interupt.cpp: implementation of the Interupt class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include
#include
#include
#include
#include
#include

void (__interrupt __far *old_vect)();
void __interrupt __far TimerNormal();         //常规处理

#define IRQ3      0x0b
#define OR3       0x08     //_ _ _ _ 1 _ _ _
#define AND3      0xf7    //_ _ _ _ 0 _ _
#define BASE      0x200   //板卡地址


void set_timer_interrupt() ;
int data,min;
void SubNormal(void);
void OpenInterupt(void);
void CloseInterupt(void);
void SetInterupt(void);
void IniInterupt(void);
void SetTimer(void);
/**
*        常规处理
*/
void __interrupt __far TimerNormal()
{
          _disable();       //关CPU中断
    SubNormal();
    outp(0x20,0x20);  //8259中断
    _enable();        //开CPU中断
}

void SubNormal(void)
{  
        static bool n;

        if(n)
        {
                outp(0x201, 0);
                outp(0x202, 0);
                outp(0x203, 0);
                outp(0x204, 0);
                n = false;
        }
        else
        {
                outp(0x201, 0xff);
                outp(0x202, 0xff);
                outp(0x203, 0xff);
                outp(0x204, 1);
                n = true;
        }

   data++;
   min = data/50;
}

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////


/**
*    开中断
*
*/
void OpenInterupt(void)     //开中断
{   

    _enable();//开CPU中断
}
/**
*    关中断
*
*/
void CloseInterupt(void)   
{

        unsigned char a;
        _dos_setvect(IRQ3,old_vect);//恢复原有中断
    a = inp(0x21);
    a = a | OR3;      //8259 IR3中断
    outp(0x21,a);

}
/**
*   设置中断
*
*/
void SetInterupt(void)      
{
        IniInterupt();         //中断初始化
        SetTimer();            //定时器
    OpenInterupt();        //开中断
}
/**
*   中断初始化
*
*/
void IniInterupt(void)     
{   
        unsigned char a;
    old_vect = _dos_getvect(IRQ3);     //保存当前中断向量 中断
    _disable();                        //关CPU中断
    _dos_setvect( IRQ3,TimerNormal);   //设置中断向量
    a = inp(0x21);                     //8259 IR5中断
        a = a & AND3;
    outp(0x21,a);                      //开中断5

}
/**
*    设置定时器20ms
*
*/
void SetTimer(void)
{
  outp(BASE+0x7,0xb6);        // counter2 mode 3
  outp(BASE+0x6,0xd0);        // cycle is 1ms
  outp(BASE+0x6,0x7);         // c1=2000=0x7d0;
  outp(BASE+0x7,0x76);        // counter1 mode 3
  outp(BASE+0x5,0x14);        // cycle is 20ms
  outp(BASE+0x5,0x00);        // c2=20=0x014

}

void main()
{
        SetInterupt();
        data=0;
        for(;;)
        {
          SubNormal();
          printf("data==+==%d====%d\n",data,min);
        }
}

 
 
 

回复

83

帖子

0

TA的资源

一粒金砂(初级)

4
 
谢谢!不过还是没找到原因.我的程序是在WINDOWS下运行的,不知道是不是操作系统的原因啊.在虚拟机(dos系统)上也是一样的结果.郁闷!!
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表