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 */