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