Listing 6 (timer.c) Basic Routines for Programming the 9513 Timer Counter on the Lab Master AD
/***************************************************** Basic Routines for programming the 9513 timer counter on the Lab Master AD. Copyright Don Bradley, 1991. Permission is granted for used of these routines in any manner as long as this copyright notice is included. Tested using Quick C 2.5 and MSC 6.0 on a Toshiba T5200. *****************************************************/ #include <math.h> #include <conio.h> #include "labmastr.h" void timer_reset() { /* reset 9513 timer\counter */ outp(TIMER_CONTROL, 0xFF); /* Enable 16-bit Data Access */ outp(TIMER_CONTROL, 0xEF); /* initalize master mode reg */ outp(TIMER_CONTROL, 0x17); /* BCD Division, 16 Bit Data */ outpw(TIMER_DATA, 0xA000); } void timer5_on() /*& Turns timer 5 on. Used to start ADC output from the fifo thru manual or DMA control. */ { /* turn timer 5 on */ outp(TIMER_CONTROL, 0x30); } void timer5_off() /*& Turns timer 5 off. Used to stop or disable ADC output from the fifo thru manual or DMA control. */ { /* turn timer 5 off */ outp(TIMER_CONTROL, 0xD0); } #define COUNTSTART 0xb #define COUNTHIGH 0xf double timerad(double freq) /*& Sets timer 5 of the labmaster board to the desired frequency for data collection. */ { double time; unsigned count = COUNTSTART; time = TIMER_F1 / freq; while (1) { if (time < 65536.0) break; time /= TIMER_DIVISOR; ++count; } if (count <= COUNTHIGH) { timer5_off(); freq = TM_TIMER F1 / ((unsigned) (time) * pow(10.0, (double) (count - COUNTSTART))); // initalize master mode register outp(TIMER_CONTROL, 0x17); // BCD Division, 16 Bit Data Bus counter 5 setup outpw(TIMER_DATA, 0xA000); outp(TIMER_CONTROL, 0x5); // No Gating, Count on Rising Edge, // F(count-COUNTSTART), Count Repetitively, // Count Down, Active High Terminal Count Pulse // frequency range 400Hz to 4MHz outpw(TIMER_DATA, (count << 8) | 0x21); outpw(TIMER_DATA, (int) time); timer5_on(); } else freq = 0.0; return (freq); } void step_timerad() { timer5_off(); // Point to Counter 5 outp(TIMER_CONTROL, 0x5); // Active High output, Count Down, Binary Counting, // Count Repeatedly, Reload from Load Register // only, No Gateing, No Special Gate, Count Falling // Edges and Use Source 5. outpw(TIMER_DATA, 0x1521); outpw(TIMER_DATA, 2); // Load Counter 5 outp(TIMER_CONTROL, 0x50); timer5_on() // Step Counter 5 outp(TIMER_CONTROL, 0xF5); } /* End of File */