⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ac6611.c

📁 一个关于IO控制的程序
💻 C
字号:
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <string.h>
#include <graph.h>

#include <sys/timeb.h>

struct timeb st,et;

//**********************
// program by york wang
// www.wwlab.com.cn
// 2004.4.19
//**********************

unsigned short iobase;

main()
{

    long i,j,k,ii;




//----------------------------------------------------------------------
	_clearscreen( _GCLEARSCREEN ) ;

	printf("\nac6611  testing program   wwlab (c) 2004.3.\n\n") ;

	//find ac6611
	printf("\nFind AC6611.......");

	i=fch365(0x6611,&iobase);

	if(i=0)
	{
	   printf("Error Find AC6611 board.....\a");
	   exit(0);

	}

	printf("Find AC6611, Adr=%x...........",iobase);
	printf("Press any key to continue.") ;

	getch();



	//testing IO
	testio() ;


	testad();





	printf("\nPress any key to continue.") ;
	getch() ;


	//menu
     do{
	_clearscreen( _GCLEARSCREEN ) ;

	 printf("\n(1) ad\n");
	 printf("(2) da\n");
	 printf("(3) setting time\n");
	 printf("(4) DA free voltage out\n");
	 printf("(0) quit\n");

	 printf("\n\ninput your sel....");
	 i=getch();


	 switch(i)
	 {
	     case '1':
	     ad_test();
	     break;

	     case '2':
	     da_test();
	     break;

	     case '3':
	     ad_setting();
	     break;

	     case '4':
	     da_free();
	     break;


	 }

     }while(i!='0');

}


// sub for sampling a/d
// sampling channel=ad_ch, ad_ch=0-15
// data return by ac6611_sam,int , =0-4095
int ac6611_sam(int ad_ch)
{
   int i,j,k;

   // set ch and gain
   i=ad_ch & 0x1f;
   outp(iobase+0x0,i);

   // delay 10uS, that's 2 a/d converting
   for(j=0;j<3;j++)
   {
     k=inp(iobase+1);
     while((i=inp(iobase+0x0) & 1) !=0);
   }


   // rd data
   i=inpw(iobase+0x2);

   return(i);

}


ad_setting()
{
  int i,j,k;

  printf("\n\nset input = FULL.....press any key to test\n");

	//setting time
	//set to 0

	printf("data:");

	//set ch
	outp(iobase,15);

	outp(iobase,0);

	for(i=0;i<5;i++)
	{
	    inp(iobase+1);

	    do{
	      k=inp(iobase) & 1;
	    }while(k!=0);

	    k=(inpw(iobase+2)>>4);
	    printf("%d....",k);
	}


       getch();

}

// testing a/d
ad_test()
{
   int i, j, k;
   int stch,endch;
   int data;
   long dd;
   float uv,uv5,bv;
   float adg=0;


sa:
	_clearscreen( _GCLEARSCREEN ) ;
	printf("input start channel(0-15):");
	scanf("%d",&stch);
	stch=stch & 0xf;

	printf("input end channel(0-15):");
	scanf("%d",&endch);
	endch=endch & 0xf;

   sa1:
	_clearscreen( _GCLEARSCREEN ) ;
	printf("ac6611 testing program   wwlab  2004.3.\n") ;


   do{
	_settextposition(3,1);
	printf("st. ch=%d   end ch=%d\n",stch,endch) ;
	printf("_____________________________________________________________\n");
	printf("CH  data   5V      10V   +/-5V         CH  data   5V      10V   +/-5V");


	for(i=stch;i<=endch;i++)
	{
	    // sam data
	    data=ac6611_sam(i);
	    data=(data>>4) & 0xfff;

	    // convert to voltage
	    uv=(float)data*10000.0/4095.0;
	    uv5=(float)data*5000.0/4095.0;
	    bv=(float)(data-2048)*5000.0/2048.0;


	    if(i<16)
	    {
	       _settextposition(i+6,1);
	       printf("%2d  %4d   %5.1f  %5.0f  %5.1f",i,data,uv5,uv,bv);
	    }
	    else
	    {
	       _settextposition(i+6-16,40);
	       printf("%2d  %4d   %5.1f  %5.0f  %5.1f",i,data,uv5,uv,bv);
	    }



	}

	_settextposition(24,1);
	printf("ESC to quit, c: test channel ");


	// delay 0.1S for display speed
	dl();

	aver();


	i=0;
	if(kbhit())
	{
	   i=getch();

	   if(i=='c')
	   {
	      tsch();
	      goto sa1;
	   }


	   if(i!=27)
	      goto sa;

	}


   }while(i!=27);


}





aver()
{
  int i,j,k;
  long data=0;
  int max=0,min=0xfff;
  int stl=1000;

  k=ac6611_sam(0);
  k=ac6611_sam(0);
  k=ac6611_sam(0);
  k=ac6611_sam(0);

  for(i=0;i<stl;i++)
  {

      k=ac6611_sam(0)/16;
      k=k & 0xfff;

      data+=k;
      max=(k>max)?k:max;
      min=(k<min)?k:min;

  }

  j=(int)(data/i);

  _settextposition(23,1);
  printf("ch0 data  max=%5d   min=%5d  aver=%5d  delta=%5d   ",max,min,j,(max-min));

}



testad()
{
  int i,j,k;
  float a,b;

  printf("\n\n testing A/D running....");

  // start a/d
  k=inp(iobase+1);

  // if a/d end
  do{
      i=inp(iobase+0) & 1;
 }while(i!=0);

 printf("ok!\n");

 printf("\n\ntesting A/D speed.....");


 ftime(&st);

 // 100000 converting
 for(i=0;i<20;i++)
 {
    for(j=0;j<1000;j++)
    {
	 k=inp(iobase+1);

	 do{
	     k=inp(iobase) & 1;
	 }while(k!=0);

	k=inpw(iobase+2);
     }
  }


 ftime(&et);

 i=st.time;
 j=st.millitm;
 a=i+(float)j/1000.0;

 i=et.time;
 j=et.millitm;
 b=i+(float)j/1000.0;



 printf("%5.1f(KHZ)\n",20.0/(b-a));

}





testio()
{
	unsigned int j,i,j1, k;
	int m;



	printf("\n IO testing");
	m=0;
	k=0 ;

	for( i=0; i<65535; i++ )
	{
		outpw(iobase+0xe, i ) ;
		j1=inpw( iobase+0x1e ) ;

		if( j1!=i )
		{
		   k=1 ;
		   printf("\nerror DIO0-7,std data:%x  read in:%x",i,j1);

		   if(kbhit())
		   {
		       j1=getch();

		       if(j1=27)
			  break;

		   }

		}

	      m++;

	      if(m>200)
	      {
		printf("*") ;
		m=0;
	      }
	}

	if( k!=0 )
		printf("\n\aI/O Test error!" ) ;
	else
		printf("\nI/O Test  OK!") ;
}



dl()
{
  int i,j,k;

  for(i=0;i<6000;i++)
  {

      outpw(iobase+2,0);

      while((k=inpw(iobase) & 1) !=0);

  }



}






tsch()
{
   int i,j,k;
   int d1,d2;



   d1=ac6611_sam(0);
   d1=ac6611_sam(0);

   k=0;

   for(i=1;i<32;i++)
   {

      d2=ac6611_sam(i);

      j=abs(d1-d2);

      if(j<20)
      {
	  k++;
	  printf("\n\ach:%d error",i);

      }

      d1=d2;

   }


   printf("\ntest end, press any key to countinue...");

   i=getch();
}

// set ac6611 da
// ch=0 1 da channel
// data=0-4095, 12bit da data
ac6611_da(int ch, int data)
{
  int i,j,k;

  // change 12bit data to 16bit
  k=data<<4;


  switch(ch)
  {
     case 0:
     // da ch0
     outpw(iobase+0x10,k);
     break;

     case 1:
     // da ch0
     outpw(iobase+0x12,k);
     break;

  }
}


da_test()
{
 int i,j,k;



  for(k=0;k<1;k++)
  {
	  _clearscreen(_GCLEARSCREEN);
	 printf("\nda ch:%1d....(0-10V)\n",k);

	 printf("v=0\n");
	 ac6611_da(k,0);
	 i=getch();

	 printf("v=10v\n");
	 ac6611_da(k,0xfff);
	 i=getch();

	 printf("v=5v\n");
	 ac6611_da(k,0x800);
	 i=getch();

	 printf("v=3.541v\n");
	 ac6611_da(k,1450);
	 i=getch();


	 printf("da ch:%1d....(-10v - +10V)\n",k);

	 printf("v=0\n");
	 ac6611_da(k,0x800);
	 i=getch();

	 printf("v=10v\n");
	 ac6611_da(k,0xfff);
	 i=getch();

	 printf("v=-9v\n");
	 ac6611_da(k,204);
	 i=getch();

	 printf("v=-10v\n");
	 ac6611_da(k,0x0);
	 i=getch();

   }

}



da_free()
{
   int i,j,k;
   float uv,bv;
   int ddata;
	  _clearscreen(_GCLEARSCREEN);
	 printf("\nDA tesing   +:to inc V / -: to dec V");
	 ddata=0;

      do{
	 i=0;
	 uv=ddata*10.0/4095.0;
	 bv=uv*2-10;

	 _settextposition(10,10);
	 printf("data:%6d   V(10V):%6.3f     V(+/-10V):%6.3f",ddata,uv,bv);

	 ac6611_da(0,ddata);

	if(kbhit())
	{
	    i=getch();
	    printf("%c",i);

	   switch(i)
	   {
	       case '+':
		 ddata =ddata+50;
		 break;
	       case '-':
		 ddata =ddata-50;
		 break;
	    }

	    if(ddata>4095)
	      ddata=4095;

	    if(ddata<0)
	      ddata=0;
	 }



      }while(i!=27);

}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -