/***************************************************************************** * SAMPLE1.C : DATA ACQUISITION * * * * This is a demonstration program to be used with the AD12-16 A/D * * board. The program will display sixteen channels of data by scanning the* * data, at intervals determined by counter 1/2.. The program demonstrates * * initializing the driver(task 0), setting the scan limits(task 1), setting* * the timers(task 17) and performing data conversions(task 4). * * This program must be built using the large model. * * * * The board should be set as follows: * * -- IRQ5 is used for interrupts * * -- Polarity set to bipolar * * -- DMA channel 1 * * -- On board clock set to 1 MHz * * * * A jumper from pin 25 to pin 28(ground) will be used as a trigger to start* * the conversions. After starting the program remove the jump from pin 25 * * and the conversions will start. * * * * LAST MODIFICATION: 2/3/98 * * * *****************************************************************************/ #include #include #include #include #include #include "a16drvc.h" /* These variable MUST be declared as global. They are the ones whose offsets are passed to the A16DRV routine. If they are not global then the driver will not find their segment. */ unsigned pntbuf[100],statcode,task; int datbuf[100],params[5]; unsigned AskForBaseAddress(unsigned int OldOne) { char msg[7]; int NewOne = 0, Success = 0, Dummy; int AddrInputPosX, AddrInputPosY; puts("\nPlease enter the Base Address for your card (in hex)"); printf("or press ENTER for %X.\n>", OldOne); AddrInputPosX = wherex(); AddrInputPosY = wherey(); do { gotoxy(AddrInputPosX, AddrInputPosY); clreol(); msg[0] = 5; msg[1] = 0; cgets(msg); sscanf(msg + 2, "%x", &NewOne); Success = 1; Dummy = NewOne; if (msg[1] == 0) { gotoxy(AddrInputPosX, AddrInputPosY); printf("%X", OldOne); Success = 1; Dummy = OldOne; } } while(!Success); return (Dummy); } /* end of AskForBaseAddress */ /***************************************************************************** * FUNCTION: call_driver -- local routine * * * * PURPOSE: Performs the call to the driver package. * * * * INPUT: None. * * * * CALLS: a16drv - entry point to driver package. * * * * OUTPUT: Returns the error code supplied by the driver routine. * * * *****************************************************************************/ unsigned call_driver() { unsigned *temp1,offtask,offparams,offstatcode; int *temp; /* this section extracts the offset of the parameters that we will pass to the assembly driver */ temp1 = &task; offtask = FP_OFF(temp1); /* offset of task number */ temp = params; offparams = FP_OFF(temp); /* offset of param list */ temp1 = &statcode; offstatcode = FP_OFF(temp1); /* offset of status code */ statcode = 0; a16drv(offtask,offparams,offstatcode); /* call the driver */ /* this section checks for an error code */ if (statcode > 0) { printf("A status error code of %i was detected.\n",statcode); printf("Program terminated."); return(statcode); } else return(0); } /* end call_driver */ /***************************************************************************** * FUNCTION: setup -- local routine * * * * PURPOSE: Sets up the driver package to read all 16 A/D channels. * * * * INPUT: None. * * * * CALLS: call_driver - entry point to driver package. * * * * OUTPUT: Returns the error code supplied by the driver routine. * * * *****************************************************************************/ unsigned setup(Address) { unsigned I,status; /* initialize the board */ params[0] = Address; /* starting board address */ params[1] = 5; /* IRQ5 */ params[2] = 1; /* DMA channel 1 */ task = 0; status = call_driver(); /* call driver */ if (status > 0) return(status); /* if status > 0 then error */ /* set the timer rate to divide the clock by 10000 */ task = 17; params[0] = 100; /* timer 2 count */ params[1] = 100; /* timer 1 count */ status = call_driver(); /* call the driver */ return(status); } /* end setup */ /***************************************************************************** * FUNCTION: get_readings -- local routine * * * * PURPOSE: Reads the 16 A/D channels and displays them on the screen. * * * * INPUT: None. * * * * CALLS: call_driver - entry point to driver package. * * * * OUTPUT: Returns the error code supplied by the driver routine. * *****************************************************************************/ unsigned get_readings() { int *temp1,data; unsigned I,status,*temp,channel,offdatbuf; /* set the scan limits for channel 0 to channel 15 */ task = 1; params[0] = 0; /* lower scan limit */ params[1] = 15; /* upper scan limit */ status = call_driver(); /* call the driver */ if (status > 0) return(status); /* calculate the offset to the buffers so the fdriver can return the data. datbuf will contain the data read from the channels and pnt buffer will contain the channel and gain info. */ clrscr(); temp1 = datbuf; offdatbuf = FP_OFF(temp1); /* now take the conversion, the driver will not exit until all conversions have been made or a key is pressed. */ task = 4; params[0] = 16; /* take 16 samples */ params[1] = offdatbuf; /* destination, hope it's unused! */ params[2] = 1; /* use the timer for triggering */ params[3] = 0; /* do one cycle only */ status = call_driver(); if (status > 0) return(status); /* exit if error */ /* now if OK list the data to the screen */ printf("\n CHANNEL VALUE\n"); printf(" ------- ------\n"); for (I = 0;I < 16;I++) { channel = datbuf[I] & 0x000f; /* extract the channel info */ data = datbuf[I] ^ 0x8000; /* since bipolar set proper sign */ data /= 16; /* shift the data to proper bits */ printf(" %5i %5i\n",channel,data); } return(0); } /* end get_readings */ /***************************************************************************** * FUNCTION: main -- local routine * * * * PURPOSE: Controls program flow, detects when user is ready to exit. * * * * INPUT: None. * * * * CALLS: setup - set up program and drivers. * * get_readings - read the A/D channels and display. * * * * OUTPUT: None. * *****************************************************************************/ void main() { unsigned int Address; unsigned status; char ch; clrscr(); printf( " SAMPLE1.C : DATA ACQUISITION \n\n" " This is a demonstration program to be used with the AD12-16 A/D \n" " board. The program will display sixteen channels of data by scanning the\n" " data, at intervals determined by counter 1/2.. The program demonstrates \n" " initializing the driver(task 0), setting the scan limits(task 1), setting\n" " the timers(task 17) and performing data conversions(task 4). \n" " \n"); Address=AskForBaseAddress(0x350); clrscr(); printf( " Board Configuration: \n\n" " -- Base address is %x hex \n" " -- IRQ5 is used for interrupts (required) \n" " -- Polarity set to bipolar (required) \n" " -- DMA channel 1 (required) \n" " -- On board clock set to 1 MHz (required) \n" " -- A jumper from pin 25 to pin 28(ground) will be used as a trigger to start\n" " the conversions. After starting the program remove the jump from pin 25 \n" " and the conversions will start. \n" " -- All remaining jumper settings are irrelevant. \n",Address); printf("\nPress any key to continue, or E to exit"); ch=getch(); clrscr(); status = setup(Address); /* set up program and the driver */ if (status != 0) return; /* is status > 0 then board error */ while (ch != 'E' && ch != 'e') { /* display current values for the 16 channels */ status = get_readings(); if (status != 0) return; /* if status > 0 then error */ /* check for program exit */ printf("\nPress E to exit program. Any other key to continue..."); while (!kbhit()); /* wait for key press */ ch = getch(); /* read the char */ } clrscr(); } /* end main program */