阅读:1120回复:3
■◆▲●★☆各位大老,这个程序怎么做,请教了■◆▲●★☆
我们用的是研华的PC104扩展总线的工控机型号是PCM-3350做的仪器,具体描述如下:
产品的功能: 根据要求输出正玄波,一般情况频率为50HZ,每个波形最少分为200点,每个点,就是通过设置硬件中断,中断程序中送数据到DA产生的电压,所以硬件中断的频率最少是10KHZ。中断时必须实时响应,否则波形会变形。 硬件资源: 研华PC104总线单板机,32兆内存,32兆CF卡(以后用硬盘代替)。 PLD负责地址编码和逻辑控制 时钟发生器8254,负责定时产生终端信号,输出到PC104总线的IRQ12,使其产生硬件中断。 16位DA负责输出波形 51MCU,负责扫描自定义键盘电路,发送给单板机。 软件动作: 1。用户使用自定义键盘进行人机交互。 键盘有动作时,51将地址为0X229的最高位置1,然后发送键值到地址0X228 单板机实时扫描0X229上值,当最高位为1时,在0X228读取键值。 DOS下程序如下: Ko=inportb(0x229)&0x80; if(Ko==0x80){ Ki=inportb(0x228); if(Ki>0x80) Ki=Ki-0x80; return Ki; } 2。当用户按下测试按钮后进行以下动作: 1。输出0X03,到0X22E,打开2个继电器 2。设定时钟发生器,设定中断响应频率。 DOS下程序如下,200点时输出这样设定: outportb(0x223,0x34); outportb(0x220,0x28); outportb(0x220,0x00); 3。设置并打开中断 4。扫描键盘,ESC时退出,上下键改变输出电压值时,先计算填写缓冲区(DOS下我用两个缓冲区data_buffer0,data_buffer1,计算完成后中断程序送这个缓冲区的数据) 5。扫描0x22e,当有位非零,界面做相应的反映 6。中断程序中,写数据到DA中 DOS下如下: outport(0xe0,data_buffer1[0]); outport(0xe2,data_buffer1[1]); outport(0xe4,data_buffer1[2]); outport(0xe6,data_buffer1[3]); outport(0xe8,data_buffer1[4]); outport(0xea,data_buffer1[5]); outport(0xec,data_buffer1[6]); outport(0xee,data_buffer1[7]); 0xe0------0xee是8个通道的DA地址,data_buffer1[x]是送的数 【注】以上总线地址不不变 现在特别需要各位大侠,高手给我指点一下迷津,小弟叩首了: 1。我们这个仪器要求的中断频率能不能达到!(当然该仪器中,只运行这一个程序,除了win98必要的系统程序,中断服务程序中主要就是送数到DA如上。当前硬件条件下DOS下能做500点) 2。为了保证中断的实时,扫描键盘和地址为0x22e的状态量的工作(实时要求不是太强),我觉得最好不要放在中断中,可是难道放在另一个VXD中,那会不会让上面的中断程序响应不够实时? 您觉得应该怎么处理呢? 3。看了一些VXD书后,知道了该怎么注册硬件中断,可是还是特别迷惑的是总线上的地址,也就是上面我说0X229, 0X228, 0X223, 0X220, 0XE0等等应该怎么在VXD的硬件中断服务程序中用呢? 比如:DOS下的这局inportb(0x228);以及outport (0xe6, data_buffer1[3]);应该如何实现? 俺的QQ30961398,小弟再此企盼^_^ |
|
沙发#
发布于:2003-07-31 15:25
1、可以。
2、自定义的键盘?可能要为98写个驱动了。用中断的方法应该比轮询还好些。 3、可以用汇编,也可以用函数如_inp或VtoolsD的Simulate_VM_IO。 |
|
板凳#
发布于:2003-07-31 19:50
谢谢大虾先! :D
1。那个键盘是个8051挂的8*8的自定义的键盘,用中断可能比较好,可是,该工控机单板机的留给用户可自定义的中断口好像只有IRQ12了。如果我不用标准键盘,是不是可以用其占用的中断口呢? 2。对于PC104总线地址还是不清楚 DOS下的outport(0xe0,data_buffer1[0]); 是不是 可以这样 用汇编 _asm{ mov AL,0X01 MOV DX,0xe0 OUT DX,AL } 或者_outp(0xe0,0x01) 这样对吗?可是怎么从缓冲区写过去呢? |
|
地板#
发布于:2003-07-31 21:27
1、都不用标准键盘了,应该是可以的。
2、你写vxd,是vtoolsd吗?看看Simulate_VM_IO。 _outp(0xe0, data_buffer[0]) |
|