阅读:1291回复:0
有关8254的几个问题求教
研华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(); } 谢谢了 |
|