/***************************************************************************** * 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 0x340 #define COUNTER_OFFSET 0x0C #define COUNTER_0 0 #define COUNTER_1 1 #define COUNTER_2 2 #define MODE_0 0 #define MODE_1 1 #define MODE_2 2 #define MODE_3 3 #define MODE_4 4 #define MODE_5 5 #define DIVIDE_BY_10 10 #define DIVIDE_BY_100 100 #define DIVIDE_BY_1000 1000 void CtrMode( uint, char, char); void CtrLoad( uint, int, int); uint CtrRead( uint, uint); uint AskForBaseAddress( unsigned int); void main() { 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); // Turn off interrupt request generation and set the A/DC trigger // to software only. inp( base ); // read the status reg., clr IRQ // set to software start conversion, disabled irqs, read of base+3 to start // conversions, enable internal clock, counter 1, and counter 2 outp( base, 0xDF); CtrMode( base+COUNTER_OFFSET, COUNTER_0, MODE_3); CtrMode( base+COUNTER_OFFSET, COUNTER_1, MODE_3); CtrMode( base+COUNTER_OFFSET, COUNTER_2, MODE_3); CtrLoad( base+COUNTER_OFFSET, COUNTER_0, DIVIDE_BY_100); CtrLoad( base+COUNTER_OFFSET, COUNTER_1, DIVIDE_BY_1000); CtrLoad( base+COUNTER_OFFSET, COUNTER_2, DIVIDE_BY_10); clrscr(); gotoxy(1, 15); 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, COUNTER_0)); gotoxy( 1,7); puts( "decrementing between 1000 and 0"); printf( "counter 1 = %4hu", CtrRead( base+COUNTER_OFFSET, COUNTER_1)); gotoxy( 1,10); puts( "decrementing between 10 and 0"); printf( "counter 2 = %4hu", CtrRead( base+COUNTER_OFFSET, COUNTER_2)); delay(250); } gotoxy(1,20); } 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 */