首页 上一页 1 2 3 下一页 尾页

我的采集程序哪里出问题了?帮帮忙看看 点击:2336 | 回复:54



习习

    
  • 精华:0帖
  • 求助:0帖
  • 帖子:3帖 | 38回
  • 年度积分:0
  • 历史总积分:103
  • 注册:2005年10月13日
发表于:2006-04-17 17:49:00
楼主
我用的K-811数据采集卡,但是加入8253控制采集频率后,就不能采集到数据,只是一个固定的数:(.大家帮我看看哪里出问题了?多谢了
#include "stdio"
#include "dos.h"
#include "conio.h"

main()
{
    int ch;
    int dl,dh,j,base;
    clrscr();
    base=0x300; /*基卡地址*/
    dl=inportb(base+1); /*空读低8位,清除转换标志及中断标志*/
    printf("input channle number:");
    scanf("%d",&ch);
    outportb(base,ch); /*送通道号*/
    outportb(base+0xf,0xb1); /*设定8253定时器控制字,选择计数器3,方式0*/
    outportb(base+0xe,0x0f/0x99); /*送计数初值 9999*/
    outportb(base+0xe,0x27/0x99);

    for(j=0;j<1000;j++) /*控制采样次数*/
       { 

        do{
           ; 
           }while(inportb(base)<=128); /*查询AD转换状态*/
        outportb(base+0xe,0x0f/0x99); /*再次启动8253计数*/
        outportb(base+0xe,0x27/0x99);
        dh=inportb(base+0); /*读数据*/
        dl=inportb(base+1);
        outportb(base+4,dl); /*数据送入D/A通道,进行DA转换*/
        outportb(base+5,dh);
        inportb(base+4); /*启动D/A转换*/
        
        }
}



习习

  • 精华:0帖
  • 求助:0帖
  • 帖子:3帖 | 38回
  • 年度积分:0
  • 历史总积分:103
  • 注册:2005年10月13日
发表于:2006-04-28 16:24:00
41楼
至于对ADC 转换结果的读取后会不会把数据清空 里面没有提到阿,有清除转换标志的功能的话应该是把数据清空了吧?

习习

  • 精华:0帖
  • 求助:0帖
  • 帖子:3帖 | 38回
  • 年度积分:0
  • 历史总积分:103
  • 注册:2005年10月13日
发表于:2006-04-28 16:27:00
42楼
8253 的 计数方式 0 = binary mode.
                 1 = BCD MODE。
我们的也是这样子的。
 

GaryLin

  • 精华:0帖
  • 求助:0帖
  • 帖子:4帖 | 1186回
  • 年度积分:0
  • 历史总积分:1263
  • 注册:2003年4月15日
发表于:2006-04-28 16:31:00
43楼
"读取低8位数据的另一附加作用是清除AD转换标志"
所以, 第一個 loop 就沒作用了說! 

忘了問, 廠家沒提供例程嗎? 

习习

  • 精华:0帖
  • 求助:0帖
  • 帖子:3帖 | 38回
  • 年度积分:0
  • 历史总积分:103
  • 注册:2005年10月13日
发表于:2006-04-28 17:07:00
44楼
厂家的例程都没有用8253 是直接用程序启动AD转换的,直接给ADC一个命令,让其启动 

习习

  • 精华:0帖
  • 求助:0帖
  • 帖子:3帖 | 38回
  • 年度积分:0
  • 历史总积分:103
  • 注册:2005年10月13日
发表于:2006-04-28 17:14:00
45楼
在for循环之前加了一个空读第八位的命令,
dl=inportb(base+1); /*空读低8位,清除转换标志及中断标志*/
for(j=0;j<1000;j++)

 .....
}
这样子的话,只用下面的就可以了吧?
dl=inportb(base+1); /*空读低8位,清除转换标志及中断标志*/
for(j=0;j<1000;j++)
{
 while(1) {
   if ( (inportb(base) & 0x80) == 0x80 ) break; // Until ADC ready
   }
 dh=inportb(base+0); /*转换结束时读取高四位数据*/
 dl=inportb(base+1); /*读取低8位数据*/
}
 

习习

  • 精华:0帖
  • 求助:0帖
  • 帖子:3帖 | 38回
  • 年度积分:0
  • 历史总积分:103
  • 注册:2005年10月13日
发表于:2006-04-28 17:20:00
46楼
厂家就给了一个例程:( 如下
dl=inportb(base+1); /*空读低8位,清除转换标志及中断标志*/
for(j=0;j<1000;j++) /*控制采样次数*/
  { 
    for(i=0;i<100;i++); /*延时,常数由机型决定*/ 
    outportb(base+1,0); /*启动AD,所送数值无关*/
    do{
        ; 
       }while(inportb(base)<=128); /*查询AD转换状态*/
    dh=inportb(base+0); /*读数据*/
    dl=inportb(base+1);

   }

GaryLin

  • 精华:0帖
  • 求助:0帖
  • 帖子:4帖 | 1186回
  • 年度积分:0
  • 历史总积分:1263
  • 注册:2003年4月15日
发表于:2006-05-02 13:17:00
47楼
只有一個例程? 真是夠少的了!
看來, 日後若要在 Windows/Linux 環境下使用, 廠家可能也不支持吧!

习习

  • 精华:0帖
  • 求助:0帖
  • 帖子:3帖 | 38回
  • 年度积分:0
  • 历史总积分:103
  • 注册:2005年10月13日
发表于:2006-05-02 14:42:00
48楼
目前只能在WIN98下使用,网上有驱动可在WIN2000下使用的.
不过没关系 至少用 8253的MODE2已经可以正确采集数据了,我现在可以跟老师交差了:)哈哈.
感谢GaryLin前辈这么久以来对我的帮助,我也学到很多东西.谢谢!现在这个论坛还没有斑竹呢,我看到GaryLin 前辈在论坛上很乐于帮人解答问题,我推荐由GaryLin前辈当我们的版主吧!!同意的请举手或者吱一声哈!!

GaryLin

  • 精华:0帖
  • 求助:0帖
  • 帖子:4帖 | 1186回
  • 年度积分:0
  • 历史总积分:1263
  • 注册:2003年4月15日
发表于:2006-05-02 18:46:00
49楼
這倒是先慢著討論吧, 因為我所學有限, 且得有空時才能上來! 
謝謝您的抬舉了說!

习习

  • 精华:0帖
  • 求助:0帖
  • 帖子:3帖 | 38回
  • 年度积分:0
  • 历史总积分:103
  • 注册:2005年10月13日
发表于:2006-05-15 09:58:00
50楼
我知道了, 即时“读取低8位数据的另一附加作用是清除AD转换标志”,但是采集卡需要一段反应时间才能将转换标志变为busy,我们没有考虑这一点的话,就直接查询他的状态的话,查询到的还是ready的状态,所以还是需要加入由ready-busy-ready的查询程序之后才能读取数据。
像例程上的 for(i=0;i<100;i++); /*延时,常数由机型决定*/ 
就是使 延时时间刚好大于等于清除转换标志的时间,这样保证了读取数据是新一轮的转换结果。

很困惑

  • 精华:0帖
  • 求助:0帖
  • 帖子:0帖 | 6回
  • 年度积分:0
  • 历史总积分:6
  • 注册:2006年5月19日
发表于:2006-05-19 18:05:00
51楼
你好GaryLin:
我是一大四毕业生,需要用VB对数据采集卡编一程序.但是由于我
不会,时间紧迫,只学过TC,你可以帮帮我吗?我的QQ号是85009315,可以加我吗?我想问你一些问题.

很困惑

  • 精华:0帖
  • 求助:0帖
  • 帖子:0帖 | 6回
  • 年度积分:0
  • 历史总积分:6
  • 注册:2006年5月19日
发表于:2006-05-19 18:08:00
52楼

很困惑

  • 精华:0帖
  • 求助:0帖
  • 帖子:0帖 | 6回
  • 年度积分:0
  • 历史总积分:6
  • 注册:2006年5月19日
发表于:2006-05-19 18:08:00
53楼

习习

  • 精华:0帖
  • 求助:0帖
  • 帖子:3帖 | 38回
  • 年度积分:0
  • 历史总积分:103
  • 注册:2005年10月13日
发表于:2006-05-26 19:41:00
54楼
续:
用matlab对采集卡作数据采集,采集卡不能直接被matlab识别,需要用matlab与vc++混合编程对采集卡进行数据采集。
但是 我们用c采集到了数据之后,经过dll编译后,用matlab调用mex文件,采集到的数据跟用c直接采到的数据差很多,不知道这是怎么回事?请教有没有高手用过matlab与 vc++混编进行过数据采集?????

热门招聘
相关主题

官方公众号

智造工程师
    首页 上一页 1 2 3 下一页 尾页