/***************************************************************************** * SAMPLE3.C : COUNTER/TIMER * * * * This program will set counter 0 to output 10,000 Hz, counter 1 * * to output 1000 Hz, and will set counter 2 to output 100 Hz. * * * *****************************************************************************/ #include #include #include #ifndef FALSE #define FALSE 0 #define TRUE !FALSE #endif #define uint unsigned int #define DEFAULT_ADDRESS 0x300 #define COUNTER_OFFSET 0x0C void CtrMode(uint addr, char cntr, char mode) { int ctrl; ctrl = (cntr << 6) | 0x30 | (mode << 1); outp(addr+3,ctrl); } void CtrLoad(uint addr ,int c,int val) { outp(addr+c,val & 0x00FF); outp(addr+c,(val>>8) & 0x00FF); } uint CtrRead(uint addr , uint c) { outp(addr+3,c<<6); return inp(addr+c) + (inp(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 */ /*****************/ /* Main function */ /*****************/ void main(void) { uint base; clrscr(); puts("Sample 3\n"); puts("This sample loads all three counters and continuously displays"); puts("the values that are currently in them.\n"); base= AskForBaseAddress( DEFAULT_ADDRESS); outportb(base + 0x18, 0x1); CtrMode( base+COUNTER_OFFSET, 0, 2); CtrMode( base+COUNTER_OFFSET, 1, 2); CtrMode( base+COUNTER_OFFSET, 2, 2); CtrLoad( base+COUNTER_OFFSET, 0, 100); CtrLoad( base+COUNTER_OFFSET, 1, 1000); CtrLoad( base+COUNTER_OFFSET, 2, 10000); clrscr(); gotoxy(1, 15); puts("The counters will count down for each negative pulse on their inputs.\n"); puts("Press a key to exit..."); while( !kbhit()) { gotoxy( 1,4); puts( "decrementing between 100 and 0"); printf( "counter 0 = %4hu", CtrRead( base+COUNTER_OFFSET, 0)); gotoxy( 1,7); puts( "decrementing between 1000 and 0"); printf( "counter 1 = %4hu", CtrRead( base+COUNTER_OFFSET, 1)); gotoxy( 1,10); puts( "decrementing between 10000 and 0"); printf( "counter 2 = %4hu", CtrRead( base+COUNTER_OFFSET, 2)); delay(250); } gotoxy(1,20); }