#include #include #include #include #define TRUE 1 #define FALSE 0 unsigned int BASE=0x300; unsigned char jumpers; unsigned char adrange; unsigned char dacBrange; unsigned char dacArange; //sbitd takes data and bit, then returns 0x81 or 0x01 based on data[bit] unsigned char sbitd(unsigned int data,unsigned char bit) { return (data & (1<>3) & 0x01;//d4,d3 are 5/10 for daca,b dacArange=(jumpers>>4) & 0x01; // CAL(); clrscr(); puts("104-AIO16-16 Sample\n"); cprintf("A/D: %s %s\r\n" "DAC A: %s\r\n" "DAC B: %s", (adrange&0x02)? ((adrange&0x04)?"ñ5V":"ñ10V") : ((adrange&0x04)?"0-10V":"0-10V(Low Res)") //0-10V(Low Res) is , //in theory 0-20V, (adrange&0x01)?"16ch":"8ch", //but the amps cap dacArange?"0-5V":"0-10V", //at 10V dacBrange?"0-5V":"0-10V" ); } unsigned AskForBaseAddress(unsigned int OldOne) { char msg[8]; int NewOne = 0, Success = 0, Dummy; int AddrInputPosX, AddrInputPosY; puts("Please enter the Base Address (100-FFFF) 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); if (NewOne >= 0x100) { Success = 1; Dummy = NewOne; } else if (msg[1] == 0) { gotoxy(AddrInputPosX, AddrInputPosY); printf("%X", OldOne); Success = 1; Dummy = OldOne; } } while(!Success); return (Dummy); } /* end of AskForBaseAddress */ void DacSample(void) { char key=0; double percent=0; char done=0; puts("This sample will write to DAC 0 and DAC 1."); puts("Press 1-0 keys for 10% to 100% DAC value, use \"~\" for 0%"); puts("Press ESC to exit sample"); do{ key=getch(); if (key==27) done=1; if (isdigit(key)) percent=(key-'0')/10.0L; if ((key=='`') || (key=='~')) percent=0.0; if (key=='0') percent=1.0L; gotoxy(1,20); printf("Writing to DAC 0: %3.4lf\n",DAC(0,percent*(dacArange?4.9988L:9.9976L))); printf("Writing to DAC 1: %3.4lf\n",DAC(1,(1.0L-percent)*(dacBrange?4.9988L:9.9976L))); }while (!done); puts("Done."); } void ADSample(void) #define GAIN 0 #define STARTCONVERSION (outportb(BASE+0,0)) #define CHECKFOREOC (!(inportb(BASE+8) & 0x80)) #define WAITFOREOC for(int timer=10000;!CHECKFOREOC && timer;timer--) #define WAITFORDATA for(int timer=10000;!CHECKFOREOC && timer;timer--) #define READADDATA (inport(BASE+0)) { int done=0; unsigned data,CHANNEL; float ADMul, FData; unsigned int ADSpan, ADOffset; clrscr(); puts("Free Run A/D, Gain Code 0, polling FIFO\n"); puts("Press ESC to exit."); ADSpan = (adrange&0x04)?10.0:20.0; ADOffset = (adrange&0x02) ? (ADSpan / 2) : 0; ADMul = (float)ADSpan / (float)0x10000; CHANNEL = (adrange & 0x01) ? 0xF0 : 0x70; outportb(BASE+0x1d, GAIN); //configure gain setting outportb(BASE+0x02, CHANNEL); //configure channels outportb(BASE+0x01, 0); //clear FIFO do{ STARTCONVERSION; WAITFORDATA; gotoxy(1,CHANNEL+9); data=READADDATA; FData = data * ADMul - ADOffset; printf("Current AD channel %1X Reading:%04X = %f ",CHANNEL,data,FData); CHANNEL = (CHANNEL + 1) % ((adrange & 0x01) ? 16 : 8); if (timer<=0) cputs("<--AD TIMEOUT\n\r"); if (kbhit()) if (getch()==27) done=TRUE; }while (!done); } void main(void) { char done=FALSE; clrscr(); BASE = AskForBaseAddress(BASE); do{ init(); puts("\n\nSelect which sample to run:\n 1. DAC Sample\n 2. A/D Sample\n 0. Exit Program\n"); switch(toupper(getch())) { case '1':case 'D':DacSample();break; case '2':case 'A':ADSample();break; case '0':case '3':case 'X':case 27:done=TRUE;break; }//end switch }while (!done); puts("\nDone."); }