dama_01
驱动牛犊
驱动牛犊
  • 注册日期2002-10-10
  • 最后登录2016-01-07
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1120回复:3

■◆▲●★☆各位大老,这个程序怎么做,请教了■◆▲●★☆

楼主#
更多 发布于:2003-07-31 11:21
我们用的是研华的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,小弟再此企盼^_^
arthurtu
驱动巨牛
驱动巨牛
  • 注册日期2001-11-08
  • 最后登录2020-12-19
  • 粉丝0
  • 关注0
  • 积分26分
  • 威望161点
  • 贡献值0点
  • 好评度35点
  • 原创分0分
  • 专家分0分
  • 社区居民
沙发#
发布于:2003-07-31 15:25
1、可以。
2、自定义的键盘?可能要为98写个驱动了。用中断的方法应该比轮询还好些。
3、可以用汇编,也可以用函数如_inp或VtoolsD的Simulate_VM_IO。
dama_01
驱动牛犊
驱动牛犊
  • 注册日期2002-10-10
  • 最后登录2016-01-07
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于: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)
这样对吗?可是怎么从缓冲区写过去呢?
arthurtu
驱动巨牛
驱动巨牛
  • 注册日期2001-11-08
  • 最后登录2020-12-19
  • 粉丝0
  • 关注0
  • 积分26分
  • 威望161点
  • 贡献值0点
  • 好评度35点
  • 原创分0分
  • 专家分0分
  • 社区居民
地板#
发布于:2003-07-31 21:27
1、都不用标准键盘了,应该是可以的。
2、你写vxd,是vtoolsd吗?看看Simulate_VM_IO。
_outp(0xe0, data_buffer[0])
游客

返回顶部