/***************************************************************************** * SAMPLE1.C : DATA ACQUISITION USING POLLING * * * * The program will display sixteen point addresses of A/D data. An A/D * * conversion is started by software after the previous conversion. * * This program must be built using the large model. * * * * The board should be set as follows: * * -- Polarity set to bipolar -- S2 TO BIP * * -- 16 channel singled ended mode -- S3 TO 16CH * * * * LAST MODIFICATION: 2/3/98 * * * *****************************************************************************/ #include #include #include #include #include #include "aa16drvc.h" #ifndef FALSE #define FALSE 0 #define TRUE !FALSE #endif /* These variable MUST be declared as global. They are the ones whose offsets are passed to the driver routine. If they are not global then the driver will not find their segment. */ unsigned pntbuf[100],statcode,task; int datbuf[100],params[7]; 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: aa16drv - entry point to driver package. * * * * OUTPUT: Returns the error code supplied by the driver routine. * * * *****************************************************************************/ unsigned call_driver() { aa16drv(FP_OFF(&task),FP_OFF(params),FP_OFF(&statcode)); /* 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: Initializes the driver and sets up the counter timers. * * * * INPUT: None. * * * * CALLS: call_driver - entry point to driver package. * * * * OUTPUT: Returns the error code supplied by the driver routine. * * * *****************************************************************************/ unsigned setup(unsigned int Address) { unsigned I,status; /* initialize the board */ task = 0; params[0] = Address; /* assign base address to params[0] */ params[1] = 5; /* 5 volt range */ status = call_driver(); if (status > 0) return(status); task = 11; params[0] = 5; /* subtask 5 of task 11 */ params[1] = 50; /* settle count */ status = call_driver(); if (status > 0) return(status); /* Clear the point list. */ task = 11; params[0] = 2; /* subtask 2 of task 11 */ status = call_driver(); if (status > 0) return(status); /* install all channels of 1 AIM-16P into the point list, thus only channel 0 of the AD12-16 is used. */ task = 5; params[0] = 0; /* lower point address limit */ params[1] = 15; /* upper point address limit */ status = call_driver(); if (status > 0) return(status); /* Install point address 0 as a reference junction in degrees F */ task = 10; params[0] = 2; /* sub task 2, install curve */ params[1] = 0; /* setup point address 0 */ params[2] = 84; /* ASCII T = reference junction */ params[3] = 70; /* ASCII F = degrees F */ status = call_driver(); if (status > 0) return(status); /* Install point address 1 as a type T thermocouple in degress F */ task = 10; params[0] = 2; /* sub task 2, install curve */ params[1] = 1; /* setup point address 1 */ params[2] = 116; /* ASCII t = t thermocouple */ params[3] = 70; /* ASCII F = degrees F */ status = call_driver(); if (status > 0) return(status); /* assign proper gain code for t type thermocouple to point address 1, which for this driver is gain code = 5 */ task = 4; params[0] = 1; /* range for gain assignment */ params[1] = 1; /* is point address 1 only */ params[2] = 5; /* assign gain code 5 */ status = call_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() { unsigned I,status; /* now take the conversions, the driver will not exit until all conversions have been made. */ task = 8; params[0] = FP_OFF(datbuf); /* offset of data buffer */ params[1] = FP_OFF(pntbuf); /* offset of point/gain buffer */ params[2] = 16; /* take 16 samples */ status = call_driver(); if (status > 0) return(status); /* exit if error */ /* now if OK list the data to the screen */ clrscr(); printf("\n POINT ADDRESS GAIN VALUE\n"); printf(" ------------- ---- -----\n"); for (I = 0;I < 16;I++) { printf("%12i%13i%10i\n",pntbuf[I] / 256,pntbuf[I] & 0xff,datbuf[I]); } 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 USING POLLING\n" "\n" "The program will display sixteen point addresses of A/D data. An A/D\n" "conversion is started by software after the previous conversion.\n\n"); Address=AskForBaseAddress(0x350); clrscr(); printf( " \n\n\nBoard Configuration:\n\n" " The Base Address is %x hex\n",Address); printf( " -- Polarity set to bipolar -- S2 TO BIP (required)\n" " -- Range is 5 volts\n" " -- 16 channel singled ended mode -- S3 TO 16CH (required)\n" " -- Both TMP jumpers must be installed (required)\n" " -- The offset must be in STD position (required)\n" " -- One jumper is on OV0; none on OT (required)\n" " -- All other jumper settings are irrelevant\n\n\n\n"); printf("Press any key to continue, or press '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("\n\nPress 'E' to exit the program. Press any other key to rescan the data..."); while (!kbhit()); /* wait for key press */ ch = getch(); /* read the char */ } clrscr(); } /* end main program */