|
发表于 2004-11-10 17:28:06
|
显示全部楼层
< >不采用驱动,直接控制!</P>< > /*'**********************************************************************
'* *
'* This demo program performs pacer triggered one A/D conversion *
'* and program control data transfer without using the PCL-818L *
'* driver. *
'* *
'**********************************************************************
*/
#include <stdio.h>
#include <dos.h>
#include <process.h>
#include <conio.h>
#include <stdlib.h>
/******************/
#include <math.h>
#define BASE 0x300 /*base address*/
#define NUM 5000 /*build buffers*/
#define DOOR 1.5/1340
FILE *fp; /*file*/
/*****************/</P>< >char *gain_str[4]={"5V","2.5V","0.25V","0.625V"};
void main()
{
int status ,s_end ,start ,stop;
int dtl ,dth ,adl ,adt ,c_reg ,s_ch_val ,r_ch;
int chv ,ch_gain[16];
int port,val, i, j,re_ctr;</P><P>/*********************/
struct time time[1];
float *p,*str; /*data buffer*/
int k; /*conunt*/
char filename[10]; /*data file name*/
int sec1;
float sec_h,rate;
float wait;
int high_byte,low_byte,data1,data2,data,data_low,data_higt,turedate_low;
float div,d1,d2,divisor1,divisor2;
port=BASE; /* Set I/O port base address */</P><P> /********** STEP 1: INITIALIZE & SELECT SOFTWARE TRIGGER *************/
val=0x73; /* INTE I2 I1 I0 X DMAE ST1 ST2 || ST1 ST2=1 1 for pacer trig */
outportb(port+9,val); /* pacer trigger */
c_reg = inportb(port+9);
if (c_reg != val)
{
printf("PCL-818L hardware verification failed!\n");
exit(0);
}
else
printf("\n**** you have set pcl818l for pacer trigger! ****");
outportb(port+8,1); /* Clear interrupt request */
printf("\n***** Please set PCL-818L's jumper 7 (A/D IN) to + - 5 V *****\n\n");</P><P>/* ******** STEP 2: READ A/D STATUS REGISTER **************************** */</P><P> status = inportb(port+8);
if ((status & 0x20)==0x20) /* check MUX bit of port 8 is 8_diff or 16_single */
s_end = 1; /* 16 single_ended */
else
s_end = 0; /* 8 differential channels */</P><P>red
if(s_end==1)
{
printf("Enter start channel number <0-15>: ");
scanf("%d",&start);
printf("Enter stop channel number <0-15>: ");
scanf("%d",&stop);
}
else
{
printf("*****you have set pcl818 card for 8 differential *****\n");
printf("Enter start channel number <0-7>: ");
scanf("%d",&start);
printf("Enter stop channel number <0-7>: ");
scanf("%d",&stop);
}</P><P> if ((s_end==0) & (stop>7))
{
printf("Entered channel failed! Re-do!\n");
goto redo;
}</P><P> if ((s_end==1) & (stop>15))
{
printf("Entered channel failed! Re-do!\n");
goto redo;
}</P><P> if (start > stop)
{
printf("Entered channel failed!\n");
goto redo;
}</P><P>/*********** STEP 3: SET A/D RANGE CODE *****************/</P><P> printf("\n************** A/D Range Code Table **************");
printf("\n* 0) +5V 1) +2.5V 2) +1.25V 3) +0.625V *");
printf("\n**************************************************\n\n");</P><P> for(i=start; i<=stop; i++)
{
printf("Enter range code <0 -- 3> for channel %d :",i);
re_enter_gain:
scanf("%d",&ch_gain<i>);
if( ch_gain<i> < 0 || ch_gain<i> > 3 )
{
printf("Wrong code! Enter again: ");
goto re_enter_gain;
}
outportb(port+2, i); /* port+2 for MUX scan register ,i repare channel for next input range code */
outportb(port+1, ch_gain<i>); /* port+1 for A/D range control */
printf("\n");
}</P><P>/********* STEP 4: SET SCAN CHANNEL RANGE ***********************/</P><P> s_ch_val=stop*16+start; /* Set scan channel value */
outportb(port+2,s_ch_val); /* before 4 bit for stop, after 4 bit for start channel */
r_ch = inportb(port+2); /* Read back channel value */
if (r_ch != s_ch_val)
{
printf("Scan channel setting failed!\n");
exit(0);
}
delay(1);
printf("****Scan channel setting OK !****\n");
/********************************************/
re_enter:
printf ("Input time rate(<40KHz): "); /* up to 40K Hz With DMA */
scanf ("%f",&rate);
div=2000000L/rate; /* L is long integret */
if (div < 50) /* rate must < 50 0000 */
{
printf("Invalid time rate,please input again!\n");
goto re_enter;
}
divisor1=div/0xffff;
if (divisor1 > 2) /* adjust divisor1 & divisor2 */
{
divisor1=divisor1+1;
divisor2=div/divisor1;
}
else
{
divisor1=2;
divisor2=div/divisor1;
}
d1=divisor1;
d2=divisor2;
printf ("\n\tTIMER RATE=%f Hz\n",2000000L/(divisor1*divisor2));</P><P>
/*------------------*/</P><P> /* port+15 for counter control word*/
outportb(port+13,d1); /* Counter1 division 200 low byte */
outportb(port+13,0); /* CTR1 high byte */</P><P> outportb(port+15,0xB4); /* select CTR2,R/W LSB first then MSB */</P><P> outportb(port+14,d2); /* CTR2 division 200 low byte */
outportb(port+14,0);</P><P> /************* FILE CONTROL ****************/
printf("input file name you want to store:");
scanf("%s",filename);
if((fp=fopen(filename,"w+"))==NULL)
{
printf("I can not open the file %s\n",filename);
exit(0);
}
str=calloc(NUM,sizeof(float));
p=str;
edt:
printf("\nInput wait time (from 1 to 100) :");
scanf("%f",&wait);
if(wait<1||wait>100)
goto edt;
wait=wait*5000;
for(k=9;k>0;k--)
{
delay(wait);
textcolor(13);
printf("\r%d",k);
}
printf("\n start signal acquire !\n");</P><P>
/*textcolor(0);
/* data2=0;
/* for (i=0;;) /* get n data */
/* {
/* outportb(port+10,0); /* select A/D channel */</P><P>/*reread1:
/* outportb(port+8,0); /* clear interrupt request by write any value to port8*/
/* outportb(port,0); /* software A/D trigger start by write any value to BASE+0 */</P><P> /* status = inport(port+8); /* port+8 is status register,
/* if ((status&0x10)==0x10) /* check INT bit of port+8 is 1? */
/* goto reread1 ?? =1 display have data is ready */</P><P> /* high_byte=inportb(port+1);
/* low_byte=inportb(port+0);
/* data1=high_byte*256+low_byte-2048; /* story A/D data into array */
/* data1=data1>0? data1:-data1; /* get | data1 | */
/* if((data2>wait)&&(abs(data1-data2)>100)) break;
/* data2=data1;</P><P> /*}</P><P>/********* STEP 5: PERFORM SINGLE A/D CONVERSION ***********/</P><P> gettime(&time[0]); /* count using time */</P><P> for(k=0;k<NUM;k++)
{
reread:
outportb(port+8,0); /* clear interrupt request by write any value to port8*/
outportb(port,0); /* software A/D trigger start by write any value to BASE+0 */
status = inport(port+8); /* port+8 is status register,
if ((status&0x10)==0x10)
goto reread;</P><P> delay(1);
date_low = inportb(port);
date_high = inportb(port+1);
turedate_low = date_low/16; /* get befroe 4 bit of low , after 4 bit is delete*/
data = data_high*16+truedata_low;
chv = date_low-truedate_low*16;
*p=data;
p++;
}</P><P> gettime(&time[1]);
sec1=time[1].ti_sec-time[0].ti_sec;
sec_h=(time[1].ti_hund-time[0].ti_hund)/100; /* ti_hund for 0.01 secend*/
all_time=sec1+sec_h;
time_interval=all_time/NUM;</P><P> p=str;
printf(" Frist A/D data = %f\n",*p);
printf(" Current channel = %d A/D range = %-7s\n",chv, gain_str[ch_gain[chv]]);
printf(" Next scan channel = %d\n",(status & 0x0f));
printf(" Start scan channel= %d\n",start);
printf(" Stop scan channel = %d\n",stop);
p=str;
for(k=0;k<NUM;k++)
{
fprintf(fp,"%f %6f\n",k*time_interval,(*p-2049)*DOOR); /* is a value of 0v*/
p++; /* write data to file */
}
fclose(fp);
printf("\n Acquire signal file is OK! \n");
printf(" Pressed any key return\n\n");
free(str);
str=NULL;
p=NULL;
getch();
}</P><P></P> |
|