seawing
驱动牛犊
驱动牛犊
  • 注册日期2001-11-17
  • 最后登录2007-04-05
  • 粉丝0
  • 关注0
  • 积分20分
  • 威望2点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
阅读:1292回复:0

有关8254的几个问题求教

楼主#
更多 发布于:2002-01-24 21:04
研华818HD卡
卡上自带8254定时计数器
我想通过8254触发AD转换产生中断然后传送数据
采用VXD 虚拟中断为 3
但是
1。在对8254的1,2号计数器设置计数值后
中断服务程序没有反应(好像是没有产生中断),可能是什么原因那?
2。通常8254计数结束后是自动触发AD转换然后产出中断进行中断服务呢?还是计数结束后产生中断然后进行触发AD转换并传送呢?
3。8254的几种工作模式在精确定时AD转换采样时通常使用那一种那?


8254设置和中断服务大致如下:
BOOL ClockDevice::OnSysDynamicDeviceInit()
{
pMyIRQ=new MyHwInt();
if(!pMyIRQ||!pMyIRQ->hook()) return FALSE;

_outp(BASE+9,0xB3);//enable interrupt ,interrupt level=IRQ3,DMAE disable,Pacer trigger
   _outp(BASE+8,0x00);//reset interrupt ,clear INT

_outp(BASE+10,0x00);//enable counter,
_outp(BASE+15,0x76);//C1,Mode 3,read/write LSB first,then MSB
_outp(BASE+13,0xE8);//c1=1000
_outp(BASE+13,0x03);

_outp(BASE+15,0xB6);//C2,Mode 3,read/write LSB first,then MSB
_outp(BASE+13,0xE8);//c2=1000
    _outp(BASE+13,0x03);

pMyIRQ->physicalUnmask();
return TRUE;
}
void MyHwInt::OnHardwareInt(VMHANDLE hVM)
{

while(_inp(BASE+8)&0x80);
in_h=_inp(BASE+1);//A/D high bytes
in_l=_inp(BASE+0)&0xf0;// A/D low bytes
num=_inp(BASE+1)&0x0f;// A/D channel


VWIN32_QueueUserApc(CallBackAPC,(DWORD) &y, TheThread);

 _outp(BASE+9,0xB3);//enable
                    //interrupt ,interruptlevel=IRQ3,
                    //DMAE disable,Pacer trigger
 _outp(BASE+8,0x0);//reset interrupt ,clear INT

sendPhysicalEOI();
}


谢谢了
游客

返回顶部