Main Page   Data Structures   File List   Data Fields   Globals  

/timer.h

Go to the documentation of this file.
00001 /*! \file timer.h \brief System Timer function library. */
00002 //*****************************************************************************
00003 //
00004 // File Name    : 'timer.h'
00005 // Title        : System Timer function library
00006 // Author       : Pascal Stang - Copyright (C) 2000-2002
00007 // Created      : 11/22/2000
00008 // Revised      : 02/10/2003
00009 // Version      : 1.1
00010 // Target MCU   : Atmel AVR Series
00011 // Editor Tabs  : 4
00012 //
00013 // This code is distributed under the GNU Public License
00014 //      which can be found at http://www.gnu.org/licenses/gpl.txt
00015 //
00016 //
00017 // Notes:   The Atmel AVR Series Processors each contain at least one
00018 //          hardware timer/counter.  Many of the processors contain 2 or 3
00019 //          timers.  Generally speaking, a timer is a hardware counter inside
00020 //          the processor which counts at a rate related to the main CPU clock
00021 //          frequency.  Because the counter value increasing (counting up) at
00022 //          a precise rate, we can use it as a timer to create or measure 
00023 //          precise delays, schedule events, or generate signals of a certain
00024 //          frequency or pulse-width.
00025 //              As an example, the ATmega163 processor has 3 timer/counters.
00026 //          Timer0, Timer1, and Timer2 are 8, 16, and 8 bits wide respectively.
00027 //          This means that they overflow, or roll over back to zero, at a
00028 //          count value of 256 for 8bits or 65536 for 16bits.  A prescaler is
00029 //          avaiable for each timer, and the prescaler allows you to pre-divide
00030 //          the main CPU clock rate down to a slower speed before feeding it to
00031 //          the counting input of a timer.  For example, if the CPU clock
00032 //          frequency is 3.69MHz, and Timer0's prescaler is set to divide-by-8,
00033 //          then Timer0 will "tic" at 3690000/8 = 461250Hz.  Because Timer0 is
00034 //          an 8bit timer, it will count to 256 in just 256/461250Hz = 0.555ms.
00035 //          In fact, when it hits 255, it will overflow and start again at
00036 //          zero.  In this case, Timer0 will overflow 461250/256 = 1801.76
00037 //          times per second.
00038 //              Timer0 can be used a number of ways simultaneously.  First, the
00039 //          value of the timer can be read by accessing the CPU register TCNT0.
00040 //          We could, for example, figure out how long it takes to execute a
00041 //          C command by recording the value of TCNT0 before and after
00042 //          execution, then subtract (after-before) = time elapsed.  Or we can
00043 //          enable the overflow interrupt which goes off every time T0
00044 //          overflows and count out longer delays (multiple overflows), or
00045 //          execute a special periodic function at every overflow.
00046 //              The other timers (Timer1 and Timer2) offer all the abilities of
00047 //          Timer0 and many more features.  Both T1 and T2 can operate as
00048 //          general-purpose timers, but T1 has special hardware allowing it to
00049 //          generate PWM signals, while T2 is specially designed to help count
00050 //          out real time (like hours, minutes, seconds).  See the
00051 //          Timer/Counter section of the processor datasheet for more info.
00052 //
00053 //*****************************************************************************
00054 
00055 #ifndef TIMER_H
00056 #define TIMER_H
00057 
00058 #include "global.h"
00059 
00060 // constants/macros/typdefs
00061 
00062 // processor compatibility fixes
00063 #ifdef __AVR_ATmega323__
00064     // redefinition for the Mega323
00065     #define CTC1    CTC10
00066 #endif
00067 #ifndef PWM10
00068     // mega128 PWM bits
00069     #define PWM10   WGM10
00070     #define PWM11   WGM11
00071 #endif
00072 
00073 // Timer/clock prescaler values and timer overflow rates
00074 // tics = rate at which the timer counts up
00075 // 8bitoverflow = rate at which the timer overflows 8bits (or reaches 256)
00076 // 16bit [overflow] = rate at which the timer overflows 16bits (65536)
00077 // 
00078 // overflows can be used to generate periodic interrupts
00079 //
00080 // for 8MHz crystal
00081 // 0 = STOP (Timer not counting)
00082 // 1 = CLOCK        tics= 8MHz          8bitoverflow= 31250Hz       16bit= 122.070Hz
00083 // 2 = CLOCK/8      tics= 1MHz          8bitoverflow= 3906.25Hz     16bit=  15.259Hz
00084 // 3 = CLOCK/64     tics= 125kHz        8bitoverflow=  488.28Hz     16bit=   1.907Hz
00085 // 4 = CLOCK/256    tics= 31250Hz       8bitoverflow=  122.07Hz     16bit=  0.477Hz
00086 // 5 = CLOCK/1024   tics= 7812.5Hz      8bitoverflow=   30.52Hz     16bit=   0.119Hz
00087 // 6 = External Clock on T(x) pin (falling edge)
00088 // 7 = External Clock on T(x) pin (rising edge)
00089 
00090 // for 4MHz crystal
00091 // 0 = STOP (Timer not counting)
00092 // 1 = CLOCK        tics= 4MHz          8bitoverflow= 15625Hz       16bit=  61.035Hz
00093 // 2 = CLOCK/8      tics= 500kHz        8bitoverflow= 1953.125Hz    16bit=   7.629Hz
00094 // 3 = CLOCK/64     tics= 62500Hz       8bitoverflow=  244.141Hz    16bit=   0.954Hz
00095 // 4 = CLOCK/256    tics= 15625Hz       8bitoverflow=   61.035Hz    16bit=   0.238Hz
00096 // 5 = CLOCK/1024   tics= 3906.25Hz     8bitoverflow=   15.259Hz    16bit=   0.060Hz
00097 // 6 = External Clock on T(x) pin (falling edge)
00098 // 7 = External Clock on T(x) pin (rising edge)
00099 
00100 // for 3.69MHz crystal
00101 // 0 = STOP (Timer not counting)
00102 // 1 = CLOCK        tics= 3.69MHz       8bitoverflow= 14414Hz       16bit=  56.304Hz
00103 // 2 = CLOCK/8      tics= 461250Hz      8bitoverflow= 1801.758Hz    16bit=   7.038Hz
00104 // 3 = CLOCK/64     tics= 57625.25Hz    8bitoverflow=  225.220Hz    16bit=   0.880Hz
00105 // 4 = CLOCK/256    tics= 14414.063Hz   8bitoverflow=   56.305Hz    16bit=   0.220Hz
00106 // 5 = CLOCK/1024   tics=  3603.516Hz   8bitoverflow=   14.076Hz    16bit=   0.055Hz
00107 // 6 = External Clock on T(x) pin (falling edge)
00108 // 7 = External Clock on T(x) pin (rising edge)
00109 
00110 // for 32.768KHz crystal on timer 2 (use for real-time clock)
00111 // 0 = STOP
00112 // 1 = CLOCK        tics= 32.768kHz     8bitoverflow= 128Hz
00113 // 2 = CLOCK/8      tics= 4096kHz       8bitoverflow=  16Hz
00114 // 3 = CLOCK/32     tics= 1024kHz       8bitoverflow=   4Hz
00115 // 4 = CLOCK/64     tics= 512Hz         8bitoverflow=   2Hz
00116 // 5 = CLOCK/128    tics= 256Hz         8bitoverflow=   1Hz
00117 // 6 = CLOCK/256    tics= 128Hz         8bitoverflow=   0.5Hz
00118 // 7 = CLOCK/1024   tics= 32Hz          8bitoverflow=   0.125Hz
00119 
00120 #define TIMER_CLK_STOP          0x00
00121 #define TIMER_CLK_DIV1          0x01
00122 #define TIMER_CLK_DIV8          0x02
00123 #define TIMER_CLK_DIV64         0x03
00124 #define TIMER_CLK_DIV256        0x04
00125 #define TIMER_CLK_DIV1024       0x05
00126 #define TIMER_CLK_T_FALL        0x06
00127 #define TIMER_CLK_T_RISE        0x07
00128 #define TIMER_PRESCALE_MASK     0x07
00129 
00130 #define TIMERRTC_CLK_STOP       0x00
00131 #define TIMERRTC_CLK_DIV1       0x01
00132 #define TIMERRTC_CLK_DIV8       0x02
00133 #define TIMERRTC_CLK_DIV32      0x03
00134 #define TIMERRTC_CLK_DIV64      0x04
00135 #define TIMERRTC_CLK_DIV128     0x05
00136 #define TIMERRTC_CLK_DIV256     0x06
00137 #define TIMERRTC_CLK_DIV1024    0x07
00138 #define TIMERRTC_PRESCALE_MASK  0x07
00139 
00140 // CCRMA added for backwards compatibility
00141 #define TIMER2_CLK_STOP                 TIMERRTC_CLK_STOP
00142 #define TIMER2_CLK_DIV1                 TIMERRTC_CLK_DIV1         
00143 #define TIMER2_CLK_DIV8                 TIMERRTC_CLK_DIV8
00144 #define TIMER2_CLK_DIV32                TIMERRTC_CLK_DIV32
00145 #define TIMER2_CLK_DIV64                TIMERRTC_CLK_DIV64
00146 #define TIMER2_CLK_DIV128               TIMERRTC_CLK_DIV128
00147 #define TIMER2_CLK_DIV256               TIMERRTC_CLK_DIV256 
00148 #define TIMER2_CLK_DIV1024              TIMERRTC_CLK_DIV1024
00149 
00150 
00151 // default prescale settings for the timers
00152 // these settings are applied when you call
00153 // timerInit or any of the timer<x>Init
00154 #define TIMER0PRESCALE      TIMER_CLK_DIV8      ///< timer 0 prescaler default
00155 #define TIMER1PRESCALE      TIMER_CLK_DIV64     ///< timer 1 prescaler default
00156 #define TIMER2PRESCALE      TIMERRTC_CLK_DIV64  ///< timer 2 prescaler default
00157 
00158 // interrupt macros for attaching user functions to timer interrupts
00159 // use these with timerAttach( intNum, function )
00160 #define TIMER0OVERFLOW_INT          0
00161 #define TIMER1OVERFLOW_INT          1
00162 #define TIMER1OUTCOMPAREA_INT       2
00163 #define TIMER1OUTCOMPAREB_INT       3
00164 #define TIMER1INPUTCAPTURE_INT      4
00165 #define TIMER2OVERFLOW_INT          5
00166 #define TIMER2OUTCOMPARE_INT        6
00167 #ifdef OCR0 // for processors that support output compare on Timer0
00168 #define TIMER0OUTCOMPARE_INT        7
00169 #define TIMER_NUM_INTERRUPTS        8
00170 #else
00171 #define TIMER_NUM_INTERRUPTS        7
00172 #endif
00173 
00174 // default type of interrupt handler to use for timers
00175 // *do not change unless you know what you're doing
00176 // Value may be SIGNAL or INTERRUPT
00177 #ifndef TIMER_INTERRUPT_HANDLER
00178 #define TIMER_INTERRUPT_HANDLER     SIGNAL
00179 #endif
00180 
00181 // functions
00182 void delay(unsigned short us);
00183 
00184 //! initializes timing system (all timers)
00185 // runs all timer init functions
00186 // sets all timers to default prescale values #defined in systimer.c
00187 void timerInit(void);
00188 
00189 // default initialization routines for each timer
00190 void timer0Init(void);      ///< initialize timer0
00191 void timer1Init(void);      ///< initialize timer1
00192 void timer2Init(void);      ///< initialize timer2
00193 
00194 // Clock prescaler set commands for each timer/counter
00195 // you may use one of the #defines above like TIMER_CLK_DIVxxx
00196 // to set the prescale value
00197 void timer0SetPrescaler(u08 prescale);      ///< set timer0 prescaler
00198 void timer1SetPrescaler(u08 prescale);      ///< set timer1 prescaler
00199 void timer2SetPrescaler(u08 prescale);      ///< set timer2 prescaler
00200 
00201 // TimerAttach and Detach commands
00202 //      These functions allow the attachment (or detachment) of any user function
00203 //      to a timer interrupt.  "Attaching" one of your own functions to a timer
00204 //      interrupt means that it will be called whenever that interrupt happens.
00205 //      Using attach is better than rewriting the actual INTERRUPT() function
00206 //      because your code will still work and be compatible if the timer library
00207 //      is updated.  Also, using Attach allows your code and any predefined timer
00208 //      code to work together and at the same time.  (ie. "attaching" your own
00209 //      function to the timer0 overflow doesn't prevent timerPause from working,
00210 //      but rather allows you to share the interrupt.)
00211 //
00212 //      timerAttach(TIMER1OVERFLOW_INT, myOverflowFunction);
00213 //      timerDetach(TIMER1OVERFLOW_INT)
00214 //
00215 //      timerAttach causes the myOverflowFunction() to be attached, and therefore
00216 //      execute, whenever an overflow on timer1 occurs.  timerDetach removes the
00217 //      association and executes no user function when the interrupt occurs.
00218 //      myOverflowFunction must be defined with no return value and no arguments:
00219 //
00220 //      void myOverflowFunction(void) { ... }
00221 
00222 //! Attach a user function to a timer interrupt
00223 void timerAttach(u08 interruptNum, void (*userFunc)(void) );
00224 //! Detach a user function from a timer interrupt
00225 void timerDetach(u08 interruptNum);
00226 
00227 
00228 // timing commands
00229 //! timerPause pauses for the number of milliseconds specified in <pause_ms>
00230 void timerPause(unsigned short pause_ms);
00231 
00232 // overflow counters
00233 void timer0ClearOverflowCount(void);    ///< clear timer0's overflow counter
00234 long timer0GetOverflowCount(void);      ///< read timer0's overflow counter
00235 void timer2ClearOverflowCount(void);    ///< clear timer2's overflow counter
00236 long timer2GetOverflowCount(void);      ///< read timer0's overflow counter
00237 
00238 // PWM initialization and set commands for timer1
00239 // timer1PWMInit()
00240 //      configures the timer1 hardware for PWM mode on pins OC1A and OC1B.
00241 //      bitRes should be 8,9,or 10 for 8,9,or 10bit PWM resolution
00242 //
00243 // timer1PWMOff()
00244 //      turns off all timer1 PWM output and set timer mode to normal state
00245 //
00246 // timer1PWMAOn() and timer1PWMBOn()
00247 //      turn on output of PWM signals to OC1A or OC1B pins
00248 //      NOTE: Until you define the OC1A and OC1B pins as outputs, and run
00249 //      this "on" command, no PWM output will be output
00250 //
00251 // timer1PWMAOff() and timer1PWMBOff()
00252 //      turn off output of PWM signals to OC1A or OC1B pins
00253 //
00254 // timer1PWMASet() and timer1PWMBSet()
00255 //      sets the PWM duty cycle for each channel
00256 //  NOTE:   <pwmDuty> should be in the range 0-255 for 8bit PWM
00257 //          <pwmDuty> should be in the range 0-511 for 9bit PWM
00258 //          <pwmDuty> should be in the range 0-1023 for 10bit PWM
00259 // NOTE: the PWM frequency can be controlled in increments by setting the
00260 //          prescaler for timer1
00261 
00262 void timer1PWMInit(u08 bitRes);     ///< initialize and set timer1 mode to PWM
00263 void timer1PWMOff(void);            ///< turn off all timer1 PWM output and set timer mode to normal
00264 void timer1PWMAOn(void);            ///< turn on timer1 Channel A (OC1A) PWM output
00265 void timer1PWMBOn(void);            ///< turn on timer1 Channel B (OC1B) PWM output
00266 void timer1PWMAOff(void);           ///< turn off timer1 Channel A (OC1A) PWM output
00267 void timer1PWMBOff(void);           ///< turn off timer1 Channel B (OC1B) PWM output
00268 void timer1PWMASet(u16 pwmDuty);    ///< set duty of timer1 Channel A (OC1A) PWM output
00269 void timer1PWMBSet(u16 pwmDuty);    ///< set duty of timer1 Channel B (OC1B) PWM output
00270 
00271 // Pulse generation commands have been moved to the pulse.c library
00272 
00273 //  CCRMA stuff
00274 void timer2SetRTCMode(void);
00275 void timer2EnableOutputCompare(void);
00276 void timer2SetOutCompare(u08 compare); /* Set Output Compare value */
00277 #endif

Generated on Fri Aug 1 10:42:42 2003 for Procyon AVRlib by doxygen1.2.18