rainasun
驱动牛犊
驱动牛犊
  • 注册日期2004-08-09
  • 最后登录2004-12-17
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1083回复:1

救命!中断问题

楼主#
更多 发布于:2004-08-13 11:35
我使用DriverStudio自己编写研华采集卡PCL818L的驱动,目的是想能够捕获采集过程的中断,并且在中断处理函数中进行:A/D读取数据-控制运算-D/A控制信号输出,通过设置采集卡的8254获得了1K的采样速率,每采一个值后采集卡会发送中断信号。我这里用的是3号中断。
问题是:程序运行后,如果不刷屏,也不移动鼠标,控制结果没有问题,但是稍稍移动鼠标或者窗口的话就控制不了了,完全计算错误,输出为0。我如果将下面的语句中//ts.Counter=(ULONG)m_PID.Kp;注释去掉的话,就能控制住了,但是用户级的程序还是对控制有部分影响,按常规理解,//ts.Counter=(ULONG)m_PID.Kp;这一句是可有可无的,因为它后面还有ts.Counter=m_InterruptCount;。我是新手,不明白其中的原因,猜测可能是鼠标中断或其他中断对我响应的3号中断处理函数的执行有影响,我的中断处理不能实时进行。哪位大侠能告知怎么解决,谢了先!

中断处理代码:

BOOLEAN InterruptDemoDevice::Isr(void)
{
T << "In the ISRn";

//读取板卡中断状态
UCHAR ADStatus=m_IoRange.inb(8);
UCHAR tmp=ADStatus&(0x10);
if(tmp!=0x10)
{
return FALSE;
}


T << "Begin Controln";
__try
{
VIEWIO ts;
double u,y;
//ts.Counter=(ULONG)m_PID.Kp;
++m_InterruptCount;
ts.Counter=m_InterruptCount;
int ADdata=m_IoRange.inw(0);
ADdata=ADdata>>4;
y=20/4096.0*(ADdata-2048);
double rin=6;
T << "rin="<<(ULONG)rin<<",ADdata="<<(ULONG)ADdata<<"n";
u=m_PID.PID_Normal_Control(rin,y);
ts.OutData=y;
ts.InData=rin;
T << "u="<<(ULONG)u<<",y="<<(ULONG)ts.OutData<<"n";
if(u>=4095)u=4095;
if(u<=0)u=0;
USHORT DAdata,lDAdata,hDAdata;
DAdata=(USHORT)u;
DAdata=DAdata<<4;
lDAdata=DAdata&255;
hDAdata=DAdata>>8;
hDAdata=hDAdata&255;
m_IoRange.outb(4,(UCHAR)lDAdata);
m_IoRange.outb(5,(UCHAR)hDAdata);
m_VIEWIOFifo.Lock();
m_VIEWIOFifo.Write(&ts, 1);
m_VIEWIOFifo.Unlock();
m_IoRange.outb(8,0);
}
__except(EXCEPTION_EXECUTE_HANDLER)
{
T << "Control Errorn";

}
T << "End Controln";
return TRUE;
}
http://www.rainasun.com 雨后骄阳饰品网
FutureForever
驱动牛犊
驱动牛犊
  • 注册日期2004-09-02
  • 最后登录2005-06-13
  • 粉丝1
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2004-09-06 20:07
板卡所用IRQ是否和鼠标相同
游客

返回顶部