#include #include #include #include #include #include #include #define uint unsigned int #ifdef __cplusplus #define __CPPARGS ... #else #define __CPPARGS #endif unsigned int IRQ = 5; int IRQGenerated = 0; uint BASE=0x300; void sendEOI(void) { //send non-specific to master AND slave PIC outportb(0x20, 0x20); outportb(0xA0, 0x20); } void interrupt far (*oldirq[16])(__CPPARGS); unsigned char initirq(char IRQnumber,void interrupt (*ISR)()) { unsigned char intmask, oldmask; if (IRQnumber <=7) { oldmask = inportb(0x21); oldirq[IRQnumber] = getvect(IRQnumber + 8); setvect(IRQnumber + 8,ISR); intmask = oldmask & (~(1 << IRQnumber)); outportb(0x21,intmask); } else { oldmask = inportb(0xA1); oldirq[IRQnumber] = getvect(IRQnumber + 0x70 - 8); setvect(IRQnumber - 8 + 0x70, ISR); intmask = oldmask & (~(1 << (IRQnumber - 8))); outportb(0xA1, intmask); } return(oldmask); } void restoreirq(char IRQnumber) { unsigned char intmask; if (IRQnumber <=7 ){ intmask = inportb(0x21); intmask |= (1 << IRQnumber); setvect(IRQnumber + 8, oldirq[IRQnumber]); outportb(0x21, intmask); } else { intmask = inportb(0xA1); intmask |= (1 << (IRQnumber - 8)); setvect(IRQnumber - 8 + 0x70, oldirq[IRQnumber]); outportb(0xA1, intmask); } } void CtrMode(uint addr, char cntr, char mode) { int ctrl; ctrl = (cntr << 6) | 0x30 | (mode << 1); outportb(addr+3,ctrl); } void CtrLoad(uint addr ,int c,int val) { outportb(addr+c,val & 0x00FF); outportb(addr+c,(val>>8) & 0x00FF); } uint CtrRead(uint addr , int c) { outportb(addr+3,c<<6); return inportb (addr+c) + (inportb(addr+c) << 8); } unsigned AskForBaseAddress(unsigned int OldOne) { char msg[7]; int NewOne = 0, Success = 0, Dummy; int AddrInputPosX, AddrInputPosY; puts("Please 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 */ void interrupt ADC_interrupt() { IRQGenerated = 1; inp(BASE+1); outp(0x20,0x20); // reset PIC } void main(void) { int data; int chan=0; clrscr(); puts("Sample 7\n"); puts("This sample will read data from all channels on the A/D board using\n" "timer/counter #2 to time and start conversions. End of conversion\n" "will be detected by IRQ generation."); puts("Card MUST be set at IRQ5."); puts("All other jumper settings are irrelevant."); BASE=AskForBaseAddress(BASE); initirq(IRQ, ADC_interrupt); CtrMode(BASE+12,0,2);//all counters in mode 2 CtrMode(BASE+12,1,2);//all counters in mode 2 CtrMode(BASE+12,2,2);//all counters in mode 2 //counter zero without count, it won't increment, cause we don't need it. CtrLoad(BASE+12,1,0x00F); CtrLoad(BASE+12,2,0x00F); outportb(BASE+2,chan);//setup channel and gain (gain code 0, gain of 1) outportb(BASE+0,0xEA);//allow counter to start conversions inportb(BASE+1);//clear existing interrupts while(!kbhit()){ while ((!IRQGenerated) && (!kbhit())); IRQGenerated = 0; data=(inport(BASE+6)>>4) & 0x0FFF; //read data from conversion gotoxy(10,12+chan); printf("Channel: %i Data Read: %4x",chan,data); chan++; chan%=8; outportb(BASE+2,chan);//setup next channel } getch(); gotoxy(1,20); outportb(BASE+0,0x00);//turn off IRQs and counters restoreirq(IRQ); }