Main Page   Compound List   File List   Compound Members   File Members  

timer.h

Go to the documentation of this file.
00001 
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              : 5/6/2002
00009 // Version              : 1.1
00010 // Target MCU   : Atmel AVR Series
00011 // Editor Tabs  : 3
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 // Timer/clock prescaler values and timer overflow rates
00063 // tics = rate at which the timer counts up
00064 // 8bitoverflow = rate at which the timer overflows 8bits (or reaches 256)
00065 // 16bit [overflow] = rate at which the timer overflows 16bits (65536)
00066 // 
00067 // overflows can be used to generate periodic interrupts
00068 //
00069 // for 8MHz crystal
00070 // 0 = STOP (Timer not counting)
00071 // 1 = CLOCK                    tics= 8MHz                      8bitoverflow= 31250Hz           16bit= 122.070Hz
00072 // 2 = CLOCK/8                  tics= 1MHz                      8bitoverflow= 3906.25Hz         16bit=  15.259Hz
00073 // 3 = CLOCK/64         tics= 125kHz            8bitoverflow=  488.28Hz         16bit=   1.907Hz
00074 // 4 = CLOCK/256                tics= 31250Hz           8bitoverflow=  122.07Hz         16bit=  0.477Hz
00075 // 5 = CLOCK/1024               tics= 7812.5Hz          8bitoverflow=   30.52Hz         16bit=   0.119Hz
00076 // 6 = External Clock on T(x) pin (falling edge)
00077 // 7 = External Clock on T(x) pin (rising edge)
00078 
00079 // for 4MHz crystal
00080 // 0 = STOP (Timer not counting)
00081 // 1 = CLOCK                    tics= 4MHz                      8bitoverflow= 15625Hz           16bit=  61.035Hz
00082 // 2 = CLOCK/8                  tics= 500kHz            8bitoverflow= 1953.125Hz        16bit=   7.629Hz
00083 // 3 = CLOCK/64         tics= 62500Hz           8bitoverflow=  244.141Hz        16bit=   0.954Hz
00084 // 4 = CLOCK/256                tics= 15625Hz           8bitoverflow=   61.035Hz        16bit=   0.238Hz
00085 // 5 = CLOCK/1024               tics= 3906.25Hz 8bitoverflow=   15.259Hz        16bit=   0.060Hz
00086 // 6 = External Clock on T(x) pin (falling edge)
00087 // 7 = External Clock on T(x) pin (rising edge)
00088 
00089 // for 3.69MHz crystal
00090 // 0 = STOP (Timer not counting)
00091 // 1 = CLOCK                    tics= 3.69MHz           8bitoverflow= 14414Hz           16bit=  56.304Hz
00092 // 2 = CLOCK/8                  tics= 461250Hz          8bitoverflow= 1801.758Hz        16bit=   7.038Hz
00093 // 3 = CLOCK/64         tics= 57625.25Hz        8bitoverflow=  225.220Hz        16bit=   0.880Hz
00094 // 4 = CLOCK/256                tics= 14414.063Hz       8bitoverflow=   56.305Hz        16bit=   0.220Hz
00095 // 5 = CLOCK/1024               tics=  3603.516Hz       8bitoverflow=   14.076Hz        16bit=   0.055Hz
00096 // 6 = External Clock on T(x) pin (falling edge)
00097 // 7 = External Clock on T(x) pin (rising edge)
00098 
00099 // for 32.768KHz crystal on timer 2 (use for real-time clock)
00100 // 0 = STOP
00101 // 1 = CLOCK                    tics= 32.768kHz 8bitoverflow= 128Hz
00102 // 2 = CLOCK/8                  tics= 4096kHz           8bitoverflow=  16Hz
00103 // 3 = CLOCK/64         tics= 512Hz                     8bitoverflow=   2Hz
00104 // 4 = CLOCK/256                tics= 128Hz                     8bitoverflow=   0.5Hz
00105 // 5 = CLOCK/1024               tics= 32Hz                      8bitoverflow=   0.125Hz
00106 
00107 #define TIMER_CLK_STOP                  0x00
00108 #define TIMER_CLK_DIV1                  0x01
00109 #define TIMER_CLK_DIV8                  0x02
00110 #define TIMER_CLK_DIV64                 0x03
00111 #define TIMER_CLK_DIV256                0x04
00112 #define TIMER_CLK_DIV1024               0x05
00113 #define TIMER_CLK_T_FALL                0x06
00114 #define TIMER_CLK_T_RISE                0x07
00115 #define TIMER_PRESCALE_MASK     0x07
00116 
00117 // default prescale settings for the timers
00118 // these settings are applied when you call
00119 // timerInit or any of the timer<x>Init
00120 #define TIMER0PRESCALE          TIMER_CLK_DIV8          // timer 0 prescaler
00121 #define TIMER1PRESCALE          TIMER_CLK_DIV64 // timer 1 prescaler
00122 #define TIMER2PRESCALE          TIMER_CLK_DIV64 // timer 2 prescaler
00123 
00124 
00125 // different clock prescale values for timer2
00126 #define TIMER2_CLK_STOP                 0x00
00127 #define TIMER2_CLK_DIV1                 0x01
00128 #define TIMER2_CLK_DIV8                 0x02
00129 #define TIMER2_CLK_DIV32                0x03
00130 #define TIMER2_CLK_DIV646               0x04
00131 #define TIMER2_CLK_DIV128               0x05
00132 #define TIMER2_CLK_DIV256               0x06
00133 #define TIMER2_CLK_DIV1024              0x07
00134 
00135 
00136 // interrupt macros for attaching user functions to timer interrupts
00137 // use these with timerAttach( intNum, function )
00138 #define TIMER0OVERFLOW_INT                      0
00139 #define TIMER1OVERFLOW_INT                      1
00140 #define TIMER1OUTCOMPAREA_INT           2
00141 #define TIMER1OUTCOMPAREB_INT           3
00142 #define TIMER1INPUTCAPTURE_INT  4
00143 #define TIMER2OVERFLOW_INT                      5
00144 #define TIMER2OUTCOMPARE_INT            6
00145 #define TIMER_NUM_INTERRUPTS            7
00146 
00147 // functions
00148 void delay(unsigned short us);
00149 
00150 // initializes timing system
00151 // runs all timer init functions
00152 // sets all timers to default prescale values #defined in systimer.c
00153 void timerInit(void);
00154 
00155 // default initialization routines for each timer
00156 void timer0Init(void);
00157 void timer1Init(void);
00158 void timer2Init(void);
00159 
00160 // Clock prescaler set commands for each timer/counter
00161 // you may use one of the #defines above like TIMER_CLK_DIVxxx
00162 // to set the prescale value
00163 void timer0SetPrescaler(u08 prescale);
00164 void timer1SetPrescaler(u08 prescale);
00165 void timer2SetPrescaler(u08 prescale);
00166 
00167 // TimerAttach and Detach commands
00168 //              These functions allow the attachment (or detachment) of any user function
00169 //              to a timer interrupt.  "Attaching" one of your own functions to a timer
00170 //              interrupt means that it will be called whenever that interrupt happens.
00171 //              Using attach is better than rewriting the actual INTERRUPT() function
00172 //              because your code will still work and be compatible if the timer library
00173 //              is updated.  Also, using Attach allows your code and any predefined timer
00174 //              code to work together and at the same time.  (ie. "attaching" your own
00175 //              function to the timer0 overflow doesn't prevent timerPause from working,
00176 //              but rather allows you to share the interrupt.)
00177 //
00178 //              timerAttach(TIMER1OVERFLOW_INT, myOverflowFunction);
00179 //              timerDetach(TIMER1OVERFLOW_INT)
00180 //
00181 //              timerAttach causes the myOverflowFunction() to be attached, and therefore
00182 //              execute, whenever an overflow on timer1 occurs.  timerDetach removes the
00183 //              association and executes no user function when the interrupt occurs.
00184 //              myOverflowFunction must be defined with no return value and no arguments:
00185 //
00186 //              void myOverflowFunction(void) { ... }
00187 
00188 void timerAttach(u08 interruptNum, void (*userFunc)(void) );
00189 void timerDetach(u08 interruptNum);
00190 
00191 
00192 // timing commands
00193 // timerPause pauses for the number of milliseconds specified in <pause_ms>
00194 void timerPause(unsigned short pause_ms);
00195 
00196 // overflow counters
00197 // to be documented
00198 void timer0ClearOverflowCount(void);
00199 long timer0GetOverflowCount(void);
00200 void timer2ClearOverflowCount(void);
00201 long timer2GetOverflowCount(void);
00202 
00203 // PWM initialization and set commands for timer1
00204 // timer1PWMInit()
00205 //              configures the timer1 hardware to produce PWM signals
00206 //              on pins OC1A and OC1B.  bitRes should be 8,9,or 10 for
00207 //    8,9,or 10bit PWM resolution
00208 //
00209 // timer1PWMOff()
00210 //              turns off PWM output and returns timer1 to normal state
00211 //
00212 // timer1PWMASet() and timer1PWMBSet()
00213 //              sets the PWM duty cycle for each channel
00214 //      NOTE:   <pwmDuty> should be in the range 0-255 for 8bit PWM
00215 //                      <pwmDuty> should be in the range 0-511 for 9bit PWM
00216 //                      <pwmDuty> should be in the range 0-1023 for 10bit PWM
00217 // NOTE: the PWM frequency can be controlled by setting the
00218 //                      prescaler for timer1
00219 
00220 void timer1PWMInit(u08 bitRes);
00221 void timer1PWMOff(void);
00222 void timer1PWMASet(u16 pwmDuty);
00223 void timer1PWMBSet(u16 pwmDuty);
00224 
00225 // Pulse generation commands have been moved to the pulse.c library
00226 
00227 // added by MG
00228 void timer2SetRTCMode(void);
00229 void timer2EnableOutputCompare(void);
00230 void timer2SetOutCompare(u08 compare);
00231 
00232 
00233 #endif

Generated at Fri Oct 25 15:36:38 2002 for avrlib by doxygen1.2.8.1 written by Dimitri van Heesch, © 1997-2001