#include #include #include #define RLD 0x80 #define XRLD 0x00 #define YRLD XRLD #define Rst_BP 0x01 #define Rst_CTR 0x02 #define Rst_FLAGS 0x04 #define Rst_E 0x06 #define Trf_PR_CTR 0x08 #define Trf_CTR_OL 0x10 #define Trf_PS0_PSC 0x18 #define CMR 0xA0 #define XCMR 0x20 #define YCMR XCMR #define BINCnt 0x00 #define BCDCnt 0x01 #define NrmCnt 0x00 #define RngLmt 0x02 #define NRcyc 0x04 #define ModN 0x06 #define NQDX 0x00 #define QDX1 0x08 #define QDX2 0x10 #define QDX4 0x18 #define IOR 0xC0 #define XIOR 0x40 #define YIOR 0x00 #define DisAB 0x00 #define EnAB 0x01 #define LCTR 0x00 #define LOL 0x02 #define RCTR 0x00 #define ABGate 0x04 #define CYBW 0x00 #define CPBW 0x08 #define CB_UPDN 0x10 #define IDX_ERR 0x18 #define IDR 0xE0 #define XIDR 0x60 #define YIDR XIDR #define DisIDX 0x00 #define EnIDX 0x01 #define NIDX 0x00 #define PIDX 0x02 #define LIDX 0x00 #define RIDX 0x04 void Init_7266(unsigned short Addr) { outportb(Addr+0x14,0x01); //put CPLD on card into divide-by-1 FCK mode outportb(Addr+0x12,0xFF); //enable index for all channels in CPLD for (int count = 0; count < 4; count++) { unsigned long XCt = 0xFFFFFF; unsigned long YCt = 0xFFFFFF; //Setup IOR reg outportb(Addr + 1, IOR + DisAB + LOL + ABGate + CYBW); //Setup RLD reg outportb(Addr + 1, RLD + Rst_BP + Rst_FLAGS); outportb(Addr + 0, 0x00); outportb(Addr + 2, 0x00); outportb(Addr + 1, RLD + Rst_E + Trf_PS0_PSC); //Setup IDR reg outportb(Addr + 1, IDR + EnIDX + NIDX + LIDX); //Setup CMR reg outportb(Addr + 1, CMR + BINCnt + ModN + QDX1); //Setup PR reg for modulo N counter to XCt outportb(Addr + 0, XCt); XCt >>= 8; outportb(Addr + 0, XCt); XCt >>= 8; outportb(Addr + 0, XCt); //Setup PR reg for modulo N counter to YCt outportb(Addr + 2, YCt); YCt >>= 8; outportb(Addr + 2, YCt); YCt >>= 8; outportb(Addr + 2, YCt); //Enable counters outportb(Addr + 1, IOR + EnAB + IDX_ERR); Addr += 4; } } void Write_7266_PR(unsigned short Addr, unsigned long Data) { outportb(Addr + 1, RLD + Rst_BP); outportb(Addr + 0, Data); Data >>= 8; outportb(Addr + 0, Data); Data >>= 8; outportb(Addr + 0, Data); } long int Read_7266_OL(unsigned short Addr) { union pos_tag { /* allows access of 32-bit integer as 4 bytes */ long int l; struct byte_tag {char b0; char b1; char b2; char b3;} byte; }pos; outportb(Addr + 1, 0x10); /* reset address pointer */ outportb(Addr + 1, 0x01); /* command to latch counter */ pos.byte.b0 = inportb(Addr); pos.byte.b1 = inportb(Addr); pos.byte.b2 = inportb(Addr); /* extend sign of position */ //requires signed characters if (pos.byte.b2 < 0) pos.byte.b3 = -1; else pos.byte.b3 = 0; return pos.l; } 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 */ float getTicks(void) { int done = 0; char line[256]; float result; while (!done) { printf("Enter the number of ticks per inch: "); gets(line); if (sscanf(line, "%f", &result) == 1) done = 1; }; return result; } void main (void) { unsigned int address = 0x300; int done = 0; float ticksPerInch; long int reading; address = AskForBaseAddress(address); Init_7266(address); //does all counters wierdly clrscr(); ticksPerInch = getTicks(); while (!done) { for (int count = 0; count < 8; count++) { gotoxy(1, count + 1); reading = Read_7266_OL(address + count * 2); printf("Channel %d: Reading:%08lx(hex) Distance:%.2f (inches) ", count, reading, reading/ticksPerInch ); } printf("\nNow reading all channels.\nPress any key to exit..."); if (kbhit()) done = 1; }; getch();//clear keystroke }