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