acl-8316编程求助 点击:643 | 回复:8



海郎

    
  • 精华:0帖
  • 求助:0帖
  • 帖子:2帖 | 5回
  • 年度积分:0
  • 历史总积分:11
  • 注册:2003年10月24日
发表于:2003-12-02 10:57:00
楼主
我用c编的程序如下: #include <conio.h> #include <stdio.h> #include <stdlib.h> #include <dos.h> #include "acl.h" #include "aclerr.h" #include "std.h" #include "video.h" #include "key.h" #include "8316.H" #define ACL_BaseAddress 0x220 #define FIFO_HALF_SIZE 512 #define AD_SAMPLE_CNT FIFO_HALF_SIZE * 2 I16 acl_Buffer[AD_SAMPLE_CNT*2]; void main() { int i; U8 status, ad_ch_no, ad_range, irq_no, autoscan, ad_mode,x; U8 tmpBuf[80]; U16 ad_count, real_count, disp_count, c1, c2; I16 ad_data,err; F32 volt; F32 xx[1024]; if( _8316_Initial( CARD_1 , ACL_BaseAddress ) != ERR_NoError ) { printf( "ACL-8316 Initialization Error !!\n" ); exit(0); } textmode(C80); textbackground(BLUE); textcolor(RED); cprintf("%s","press any key to start."); ad_ch_no = AD_CH_0; /* AD channel #0 */ ad_range = AD_B_5_V; /* AD Gain = 2 */ irq_no = 15; /* IRQ Level = 15 */ ad_count = AD_SAMPLE_CNT; c1 = 5; c2 = 10; autoscan = FALSE; ad_mode = INT_MODE_1; /* internal timer trigger, FIFO half full interrupt */ for(i=0; i<AD_SAMPLE_CNT; i++) acl_Buffer[i] = 0xFFFF; /* initial buffer */ _8316_AD_INT_Start(ad_mode,autoscan,ad_ch_no,ad_range,irq_no,ad_count,acl_Buffer); _8316_AD_Timer(c1, c2); getch(); do { _8316_AD_INT_Status( &status, &real_count ); } while ( status == AD_INT_RUN && !kbhit() ); _8316_AD_Timer(0, 0); _8316_AD_INT_Stop(&real_count ); clrscr(); gotoxy(10,10); L:x=inportb(ACL_BaseAddress+8); /*读取A/D转换状态位*/ if((x&0x20)==0x20)goto M; /* 如果A/D转换状态位EOC=1,转向M*/ goto L; /* 如果EOC=0,转向L*/ M: for(i=0;i<512;i++){ xx[i]=_8316_AD_Read_FIFO(&ad_data); cprintf("%f",xx[i]);} } 但是,用fifo半满中断,当时采集到的数据为0000。还请各位指导



yoyo1101

  • 精华:0帖
  • 求助:0帖
  • 帖子:0帖 | 590回
  • 年度积分:0
  • 历史总积分:645
  • 注册:2002年8月30日
发表于:2003-11-17 10:07:00
1楼
你用的是凌华的工控主板吗?什莫型号?

海郎

  • 精华:0帖
  • 求助:0帖
  • 帖子:2帖 | 5回
  • 年度积分:0
  • 历史总积分:11
  • 注册:2003年10月24日
发表于:2003-11-21 19:53:00
2楼
我用的是一般的计算机的主板

海郎

  • 精华:0帖
  • 求助:0帖
  • 帖子:2帖 | 5回
  • 年度积分:0
  • 历史总积分:11
  • 注册:2003年10月24日
发表于:2003-11-21 19:54:00
3楼
我是将acl-8316插在我自己的组装的计算机里进行a/d转换

yoyo1101

  • 精华:0帖
  • 求助:0帖
  • 帖子:0帖 | 590回
  • 年度积分:0
  • 历史总积分:645
  • 注册:2002年8月30日
发表于:2003-11-25 10:28:00
4楼
用Utility直接测试一下,以确定卡片本身功能正常。 L、M部分程序似无必要,不知道你在这里希望实现何功能?

海郎

  • 精华:0帖
  • 求助:0帖
  • 帖子:2帖 | 5回
  • 年度积分:0
  • 历史总积分:11
  • 注册:2003年10月24日
发表于:2003-11-26 19:26:00
5楼
卡本身没有问题,用utility是好用的, 我就想把采到的数据存到一个预定的数组里面。 xx[i]=_8316_AD_Read_FIFO(&ad_data)用这条语句就好了么,我是要用fifo半满中断来采集数据,不得查询fifo半满位么???然后将数据存到xx[]里面。

yoyo1101

  • 精华:0帖
  • 求助:0帖
  • 帖子:0帖 | 590回
  • 年度积分:0
  • 历史总积分:645
  • 注册:2002年8月30日
发表于:2003-11-27 16:41:00
6楼
执行完_8316_AD_INT_Stop()之后,采集过程已经完成了,所以后面检查FIFO半满没有作用。采集到的数据直接存储在acl_Buffer中,要实现你的要求,可以直接将它里面的数据存到另一个预定的数组。

海郎

  • 精华:0帖
  • 求助:0帖
  • 帖子:2帖 | 5回
  • 年度积分:0
  • 历史总积分:11
  • 注册:2003年10月24日
发表于:2003-12-01 20:34:00
7楼
do { _8316_AD_INT_Status( &status, &real_count ); } while ( status == AD_INT_RUN && !kbhit() ); 有什么作用 sprintf(tmpBuf, "%02d=0x%04X", i, acl_Buffer[i]); sprintf(tmpBuf, "AD value = %04X = %d = %5.2f Volt.", acl_Buffer[i-1],(I16) ((float)acl_Buffer[i-1]/acl_DivTab[acl_CardType]), volt); 这俩个语句,是把数据存到一个数组里面吧,但是我直接用cprintf(acl_Buffer[i])却不行 例程中,根本没用_8316_AD_Read_FIFO(&ad_data)来读数据 我按您说的作了,也没猜到数据。 用半满中断,得要读fifo半满位的状态吧 例程钟,也没读,是怎么采到数据的 您能不能再百忙中抽空帮我编一下程序 就要求从_8316_AD_Timer(c1, c2)开始,我说一下我编程的思路 转换开始后,用半满中断,不断查询fifo状态位,等fifo半满用_8316_AD_Read_FIFO(&ad_data)读数据,然后继续查询。

yoyo1101

  • 精华:0帖
  • 求助:0帖
  • 帖子:0帖 | 590回
  • 年度积分:0
  • 历史总积分:645
  • 注册:2002年8月30日
发表于:2003-12-02 10:57:00
8楼
do {   _8316_AD_INT_Status( &status, &real_count ); } while ( status == AD_INT_RUN && !kbhit() ); 的作用就是检查A/D转换过程是否结束,而不是去查询FIFO半满中断是否产生,也就是说需要和前面的_8316_AD_INT_Start配合起来看,假如函数中设定要采集1024个点的话,半满一次传输512个点,就是产生两次中断后才会检查到A/D转换过程的结束。这时数据都会保存在所定义数组中。 因此实际上用这些函数会为了减小编程的复杂度,而将读fifo半满位的状态等过程封装在函数内部。

热门招聘
相关主题

官方公众号

智造工程师