Rev 1145 Rev 1858
1 /*! \file timer.h \brief System Timer function library. */ 1 /*! \file timer.h \brief System Timer function library. */
2 //***************************************************************************** 2 //*****************************************************************************
3 // 3 //
4 // File Name : 'timer.h' 4 // File Name : 'timer.h'
5 // Title : System Timer function library 5 // Title : System Timer function library
6 // Author : Pascal Stang - Copyright (C) 2000-2002 6 // Author : Pascal Stang - Copyright (C) 2000-2002
7 // Created : 11/22/2000 7 // Created : 11/22/2000
8 // Revised : 02/10/2003 8 // Revised : 02/10/2003
9 // Version : 1.1 9 // Version : 1.1
10 // Target MCU : Atmel AVR Series 10 // Target MCU : Atmel AVR Series
11 // Editor Tabs : 4 11 // Editor Tabs : 4
12 // 12 //
13 // This code is distributed under the GNU Public License 13 // This code is distributed under the GNU Public License
14 // which can be found at http://www.gnu.org/licenses/gpl.txt 14 // which can be found at http://www.gnu.org/licenses/gpl.txt
15 // 15 //
16 /// \ingroup driver_avr 16 /// \ingroup driver_avr
17 /// \defgroup timer Timer Function Library (timer.c) 17 /// \defgroup timer Timer Function Library (timer.c)
18 /// \code #include "timer.h" \endcode 18 /// \code #include "timer.h" \endcode
19 /// \par Overview 19 /// \par Overview
20 /// This library provides functions for use with the timers internal 20 /// This library provides functions for use with the timers internal
21 /// to the AVR processors. Functions include initialization, set prescaler, 21 /// to the AVR processors. Functions include initialization, set prescaler,
22 /// calibrated pause function (in milliseconds), attaching and detaching of 22 /// calibrated pause function (in milliseconds), attaching and detaching of
23 /// user functions to interrupts, overflow counters, PWM. Arbitrary 23 /// user functions to interrupts, overflow counters, PWM. Arbitrary
24 /// frequency generation has been moved to the Pulse Library. 24 /// frequency generation has been moved to the Pulse Library.
25 /// 25 ///
26 /// \par About Timers 26 /// \par About Timers
27 /// The Atmel AVR-series processors each contain at least one 27 /// The Atmel AVR-series processors each contain at least one
28 /// hardware timer/counter. Many of the processors contain 2 or 3 28 /// hardware timer/counter. Many of the processors contain 2 or 3
29 /// timers. Generally speaking, a timer is a hardware counter inside 29 /// timers. Generally speaking, a timer is a hardware counter inside
30 /// the processor which counts at a rate related to the main CPU clock 30 /// the processor which counts at a rate related to the main CPU clock
31 /// frequency. Because the counter value increasing (counting up) at 31 /// frequency. Because the counter value increasing (counting up) at
32 /// a precise rate, we can use it as a timer to create or measure 32 /// a precise rate, we can use it as a timer to create or measure
33 /// precise delays, schedule events, or generate signals of a certain 33 /// precise delays, schedule events, or generate signals of a certain
34 /// frequency or pulse-width. 34 /// frequency or pulse-width.
35 /// \par 35 /// \par
36 /// As an example, the ATmega163 processor has 3 timer/counters. 36 /// As an example, the ATmega163 processor has 3 timer/counters.
37 /// Timer0, Timer1, and Timer2 are 8, 16, and 8 bits wide respectively. 37 /// Timer0, Timer1, and Timer2 are 8, 16, and 8 bits wide respectively.
38 /// This means that they overflow, or roll over back to zero, at a 38 /// This means that they overflow, or roll over back to zero, at a
39 /// count value of 256 for 8bits or 65536 for 16bits. A prescaler is 39 /// count value of 256 for 8bits or 65536 for 16bits. A prescaler is
40 /// avaiable for each timer, and the prescaler allows you to pre-divide 40 /// avaiable for each timer, and the prescaler allows you to pre-divide
41 /// the main CPU clock rate down to a slower speed before feeding it to 41 /// the main CPU clock rate down to a slower speed before feeding it to
42 /// the counting input of a timer. For example, if the CPU clock 42 /// the counting input of a timer. For example, if the CPU clock
43 /// frequency is 3.69MHz, and Timer0's prescaler is set to divide-by-8, 43 /// frequency is 3.69MHz, and Timer0's prescaler is set to divide-by-8,
44 /// then Timer0 will "tic" at 3690000/8 = 461250Hz. Because Timer0 is 44 /// then Timer0 will "tic" at 3690000/8 = 461250Hz. Because Timer0 is
45 /// an 8bit timer, it will count to 256 in just 256/461250Hz = 0.555ms. 45 /// an 8bit timer, it will count to 256 in just 256/461250Hz = 0.555ms.
46 /// In fact, when it hits 255, it will overflow and start again at 46 /// In fact, when it hits 255, it will overflow and start again at
47 /// zero. In this case, Timer0 will overflow 461250/256 = 1801.76 47 /// zero. In this case, Timer0 will overflow 461250/256 = 1801.76
48 /// times per second. 48 /// times per second.
49 /// \par 49 /// \par
50 /// Timer0 can be used a number of ways simultaneously. First, the 50 /// Timer0 can be used a number of ways simultaneously. First, the
51 /// value of the timer can be read by accessing the CPU register \c TCNT0. 51 /// value of the timer can be read by accessing the CPU register \c TCNT0.
52 /// We could, for example, figure out how long it takes to execute a 52 /// We could, for example, figure out how long it takes to execute a
53 /// C command by recording the value of \c TCNT0 before and after 53 /// C command by recording the value of \c TCNT0 before and after
54 /// execution, then subtract (after-before) = time elapsed. Or we can 54 /// execution, then subtract (after-before) = time elapsed. Or we can
55 /// enable the overflow interrupt which goes off every time T0 55 /// enable the overflow interrupt which goes off every time T0
56 /// overflows and count out longer delays (multiple overflows), or 56 /// overflows and count out longer delays (multiple overflows), or
57 /// execute a special periodic function at every overflow. 57 /// execute a special periodic function at every overflow.
58 /// \par 58 /// \par
59 /// The other timers (Timer1 and Timer2) offer all the abilities of 59 /// The other timers (Timer1 and Timer2) offer all the abilities of
60 /// Timer0 and many more features. Both T1 and T2 can operate as 60 /// Timer0 and many more features. Both T1 and T2 can operate as
61 /// general-purpose timers, but T1 has special hardware allowing it to 61 /// general-purpose timers, but T1 has special hardware allowing it to
62 /// generate PWM signals, while T2 is specially designed to help count 62 /// generate PWM signals, while T2 is specially designed to help count
63 /// out real time (like hours, minutes, seconds). See the 63 /// out real time (like hours, minutes, seconds). See the
64 /// Timer/Counter section of the processor datasheet for more info. 64 /// Timer/Counter section of the processor datasheet for more info.
65 /// 65 ///
66 //***************************************************************************** 66 //*****************************************************************************
67 //@{ 67 //@{
68   68  
69 #ifndef TIMER_H 69 #ifndef TIMER_H
70 #define TIMER_H 70 #define TIMER_H
71   71  
72 #include "global.h" 72 #include "global.h"
73   73  
74 // constants/macros/typdefs 74 // constants/macros/typdefs
75   75  
76 // processor compatibility fixes 76 // processor compatibility fixes
77 #ifdef __AVR_ATmega323__ 77 #ifdef __AVR_ATmega323__
78 // redefinition for the Mega323 78 // redefinition for the Mega323
79 #define CTC1 CTC10 79 #define CTC1 CTC10
80 #endif 80 #endif
81 #ifndef PWM10 81 #ifndef PWM10
82 // mega128 PWM bits 82 // mega128 PWM bits
83 #define PWM10 WGM10 83 #define PWM10 WGM10
84 #define PWM11 WGM11 84 #define PWM11 WGM11
85 #endif 85 #endif
86   86  
87   87  
88 // Timer/clock prescaler values and timer overflow rates 88 // Timer/clock prescaler values and timer overflow rates
89 // tics = rate at which the timer counts up 89 // tics = rate at which the timer counts up
90 // 8bitoverflow = rate at which the timer overflows 8bits (or reaches 256) 90 // 8bitoverflow = rate at which the timer overflows 8bits (or reaches 256)
91 // 16bit [overflow] = rate at which the timer overflows 16bits (65536) 91 // 16bit [overflow] = rate at which the timer overflows 16bits (65536)
92 // 92 //
93 // overflows can be used to generate periodic interrupts 93 // overflows can be used to generate periodic interrupts
94 // 94 //
95 // for 8MHz crystal 95 // for 8MHz crystal
96 // 0 = STOP (Timer not counting) 96 // 0 = STOP (Timer not counting)
97 // 1 = CLOCK tics= 8MHz 8bitoverflow= 31250Hz 16bit= 122.070Hz 97 // 1 = CLOCK tics= 8MHz 8bitoverflow= 31250Hz 16bit= 122.070Hz
98 // 2 = CLOCK/8 tics= 1MHz 8bitoverflow= 3906.25Hz 16bit= 15.259Hz 98 // 2 = CLOCK/8 tics= 1MHz 8bitoverflow= 3906.25Hz 16bit= 15.259Hz
99 // 3 = CLOCK/64 tics= 125kHz 8bitoverflow= 488.28Hz 16bit= 1.907Hz 99 // 3 = CLOCK/64 tics= 125kHz 8bitoverflow= 488.28Hz 16bit= 1.907Hz
100 // 4 = CLOCK/256 tics= 31250Hz 8bitoverflow= 122.07Hz 16bit= 0.477Hz 100 // 4 = CLOCK/256 tics= 31250Hz 8bitoverflow= 122.07Hz 16bit= 0.477Hz
101 // 5 = CLOCK/1024 tics= 7812.5Hz 8bitoverflow= 30.52Hz 16bit= 0.119Hz 101 // 5 = CLOCK/1024 tics= 7812.5Hz 8bitoverflow= 30.52Hz 16bit= 0.119Hz
102 // 6 = External Clock on T(x) pin (falling edge) 102 // 6 = External Clock on T(x) pin (falling edge)
103 // 7 = External Clock on T(x) pin (rising edge) 103 // 7 = External Clock on T(x) pin (rising edge)
104   104  
105 // for 4MHz crystal 105 // for 4MHz crystal
106 // 0 = STOP (Timer not counting) 106 // 0 = STOP (Timer not counting)
107 // 1 = CLOCK tics= 4MHz 8bitoverflow= 15625Hz 16bit= 61.035Hz 107 // 1 = CLOCK tics= 4MHz 8bitoverflow= 15625Hz 16bit= 61.035Hz
108 // 2 = CLOCK/8 tics= 500kHz 8bitoverflow= 1953.125Hz 16bit= 7.629Hz 108 // 2 = CLOCK/8 tics= 500kHz 8bitoverflow= 1953.125Hz 16bit= 7.629Hz
109 // 3 = CLOCK/64 tics= 62500Hz 8bitoverflow= 244.141Hz 16bit= 0.954Hz 109 // 3 = CLOCK/64 tics= 62500Hz 8bitoverflow= 244.141Hz 16bit= 0.954Hz
110 // 4 = CLOCK/256 tics= 15625Hz 8bitoverflow= 61.035Hz 16bit= 0.238Hz 110 // 4 = CLOCK/256 tics= 15625Hz 8bitoverflow= 61.035Hz 16bit= 0.238Hz
111 // 5 = CLOCK/1024 tics= 3906.25Hz 8bitoverflow= 15.259Hz 16bit= 0.060Hz 111 // 5 = CLOCK/1024 tics= 3906.25Hz 8bitoverflow= 15.259Hz 16bit= 0.060Hz
112 // 6 = External Clock on T(x) pin (falling edge) 112 // 6 = External Clock on T(x) pin (falling edge)
113 // 7 = External Clock on T(x) pin (rising edge) 113 // 7 = External Clock on T(x) pin (rising edge)
114   114  
115 // for 3.69MHz crystal 115 // for 3.69MHz crystal
116 // 0 = STOP (Timer not counting) 116 // 0 = STOP (Timer not counting)
117 // 1 = CLOCK tics= 3.69MHz 8bitoverflow= 14414Hz 16bit= 56.304Hz 117 // 1 = CLOCK tics= 3.69MHz 8bitoverflow= 14414Hz 16bit= 56.304Hz
118 // 2 = CLOCK/8 tics= 461250Hz 8bitoverflow= 1801.758Hz 16bit= 7.038Hz 118 // 2 = CLOCK/8 tics= 461250Hz 8bitoverflow= 1801.758Hz 16bit= 7.038Hz
119 // 3 = CLOCK/64 tics= 57625.25Hz 8bitoverflow= 225.220Hz 16bit= 0.880Hz 119 // 3 = CLOCK/64 tics= 57625.25Hz 8bitoverflow= 225.220Hz 16bit= 0.880Hz
120 // 4 = CLOCK/256 tics= 14414.063Hz 8bitoverflow= 56.305Hz 16bit= 0.220Hz 120 // 4 = CLOCK/256 tics= 14414.063Hz 8bitoverflow= 56.305Hz 16bit= 0.220Hz
121 // 5 = CLOCK/1024 tics= 3603.516Hz 8bitoverflow= 14.076Hz 16bit= 0.055Hz 121 // 5 = CLOCK/1024 tics= 3603.516Hz 8bitoverflow= 14.076Hz 16bit= 0.055Hz
122 // 6 = External Clock on T(x) pin (falling edge) 122 // 6 = External Clock on T(x) pin (falling edge)
123 // 7 = External Clock on T(x) pin (rising edge) 123 // 7 = External Clock on T(x) pin (rising edge)
124   124  
125 // for 32.768KHz crystal on timer 2 (use for real-time clock) 125 // for 32.768KHz crystal on timer 2 (use for real-time clock)
126 // 0 = STOP 126 // 0 = STOP
127 // 1 = CLOCK tics= 32.768kHz 8bitoverflow= 128Hz 127 // 1 = CLOCK tics= 32.768kHz 8bitoverflow= 128Hz
128 // 2 = CLOCK/8 tics= 4096kHz 8bitoverflow= 16Hz 128 // 2 = CLOCK/8 tics= 4096kHz 8bitoverflow= 16Hz
129 // 3 = CLOCK/32 tics= 1024kHz 8bitoverflow= 4Hz 129 // 3 = CLOCK/32 tics= 1024kHz 8bitoverflow= 4Hz
130 // 4 = CLOCK/64 tics= 512Hz 8bitoverflow= 2Hz 130 // 4 = CLOCK/64 tics= 512Hz 8bitoverflow= 2Hz
131 // 5 = CLOCK/128 tics= 256Hz 8bitoverflow= 1Hz 131 // 5 = CLOCK/128 tics= 256Hz 8bitoverflow= 1Hz
132 // 6 = CLOCK/256 tics= 128Hz 8bitoverflow= 0.5Hz 132 // 6 = CLOCK/256 tics= 128Hz 8bitoverflow= 0.5Hz
133 // 7 = CLOCK/1024 tics= 32Hz 8bitoverflow= 0.125Hz 133 // 7 = CLOCK/1024 tics= 32Hz 8bitoverflow= 0.125Hz
134   134  
135 #define TIMER_CLK_STOP 0x00 ///< Timer Stopped 135 #define TIMER_CLK_STOP 0x00 ///< Timer Stopped
136 #define TIMER_CLK_DIV1 0x01 ///< Timer clocked at F_CPU 136 #define TIMER_CLK_DIV1 0x01 ///< Timer clocked at F_CPU
137 #define TIMER_CLK_DIV8 0x02 ///< Timer clocked at F_CPU/8 137 #define TIMER_CLK_DIV8 0x02 ///< Timer clocked at F_CPU/8
138 #define TIMER_CLK_DIV64 0x03 ///< Timer clocked at F_CPU/64 138 #define TIMER_CLK_DIV64 0x03 ///< Timer clocked at F_CPU/64
139 #define TIMER_CLK_DIV256 0x04 ///< Timer clocked at F_CPU/256 139 #define TIMER_CLK_DIV256 0x04 ///< Timer clocked at F_CPU/256
140 #define TIMER_CLK_DIV1024 0x05 ///< Timer clocked at F_CPU/1024 140 #define TIMER_CLK_DIV1024 0x05 ///< Timer clocked at F_CPU/1024
141 #define TIMER_CLK_T_FALL 0x06 ///< Timer clocked at T falling edge 141 #define TIMER_CLK_T_FALL 0x06 ///< Timer clocked at T falling edge
142 #define TIMER_CLK_T_RISE 0x07 ///< Timer clocked at T rising edge 142 #define TIMER_CLK_T_RISE 0x07 ///< Timer clocked at T rising edge
143 #define TIMER_PRESCALE_MASK 0x07 ///< Timer Prescaler Bit-Mask 143 #define TIMER_PRESCALE_MASK 0x07 ///< Timer Prescaler Bit-Mask
144   144  
145 #define TIMERRTC_CLK_STOP 0x00 ///< RTC Timer Stopped 145 #define TIMERRTC_CLK_STOP 0x00 ///< RTC Timer Stopped
146 #define TIMERRTC_CLK_DIV1 0x01 ///< RTC Timer clocked at F_CPU 146 #define TIMERRTC_CLK_DIV1 0x01 ///< RTC Timer clocked at F_CPU
147 #define TIMERRTC_CLK_DIV8 0x02 ///< RTC Timer clocked at F_CPU/8 147 #define TIMERRTC_CLK_DIV8 0x02 ///< RTC Timer clocked at F_CPU/8
148 #define TIMERRTC_CLK_DIV32 0x03 ///< RTC Timer clocked at F_CPU/32 148 #define TIMERRTC_CLK_DIV32 0x03 ///< RTC Timer clocked at F_CPU/32
149 #define TIMERRTC_CLK_DIV64 0x04 ///< RTC Timer clocked at F_CPU/64 149 #define TIMERRTC_CLK_DIV64 0x04 ///< RTC Timer clocked at F_CPU/64
150 #define TIMERRTC_CLK_DIV128 0x05 ///< RTC Timer clocked at F_CPU/128 150 #define TIMERRTC_CLK_DIV128 0x05 ///< RTC Timer clocked at F_CPU/128
151 #define TIMERRTC_CLK_DIV256 0x06 ///< RTC Timer clocked at F_CPU/256 151 #define TIMERRTC_CLK_DIV256 0x06 ///< RTC Timer clocked at F_CPU/256
152 #define TIMERRTC_CLK_DIV1024 0x07 ///< RTC Timer clocked at F_CPU/1024 152 #define TIMERRTC_CLK_DIV1024 0x07 ///< RTC Timer clocked at F_CPU/1024
153 #define TIMERRTC_PRESCALE_MASK 0x07 ///< RTC Timer Prescaler Bit-Mask 153 #define TIMERRTC_PRESCALE_MASK 0x07 ///< RTC Timer Prescaler Bit-Mask
154   154  
155 // default prescale settings for the timers 155 // default prescale settings for the timers
156 // these settings are applied when you call 156 // these settings are applied when you call
157 // timerInit or any of the timer<x>Init 157 // timerInit or any of the timer<x>Init
158 #define TIMER0PRESCALE TIMER_CLK_DIV8 ///< timer 0 prescaler default 158 #define TIMER0PRESCALE TIMER_CLK_DIV8 ///< timer 0 prescaler default
159 #define TIMER1PRESCALE TIMER_CLK_DIV64 ///< timer 1 prescaler default 159 #define TIMER1PRESCALE TIMER_CLK_DIV64 ///< timer 1 prescaler default
160 #define TIMER2PRESCALE TIMERRTC_CLK_DIV64 ///< timer 2 prescaler default 160 #define TIMER2PRESCALE TIMERRTC_CLK_DIV64 ///< timer 2 prescaler default
161   161  
162 // interrupt macros for attaching user functions to timer interrupts 162 // interrupt macros for attaching user functions to timer interrupts
163 // use these with timerAttach( intNum, function ) 163 // use these with timerAttach( intNum, function )
164 #define TIMER0OVERFLOW_INT 0 164 #define TIMER0OVERFLOW_INT 0
165 #define TIMER1OVERFLOW_INT 1 165 #define TIMER1OVERFLOW_INT 1
166 #define TIMER1OUTCOMPAREA_INT 2 166 #define TIMER1OUTCOMPAREA_INT 2
167 #define TIMER1OUTCOMPAREB_INT 3 167 #define TIMER1OUTCOMPAREB_INT 3
168 #define TIMER1INPUTCAPTURE_INT 4 168 #define TIMER1INPUTCAPTURE_INT 4
169 #define TIMER2OVERFLOW_INT 5 169 #define TIMER2OVERFLOW_INT 5
170 #define TIMER2OUTCOMPARE_INT 6 170 #define TIMER2OUTCOMPARE_INT 6
171 #ifdef OCR0 // for processors that support output compare on Timer0 171 #ifdef OCR0 // for processors that support output compare on Timer0
172 #define TIMER0OUTCOMPARE_INT 7 172 #define TIMER0OUTCOMPARE_INT 7
173 #define TIMER_NUM_INTERRUPTS 8 173 #define TIMER_NUM_INTERRUPTS 8
174 #else 174 #else
175 #define TIMER_NUM_INTERRUPTS 7 175 #define TIMER_NUM_INTERRUPTS 7
176 #endif 176 #endif
177   177  
178 // default type of interrupt handler to use for timers 178 // default type of interrupt handler to use for timers
179 // *do not change unless you know what you're doing 179 // *do not change unless you know what you're doing
180 // Value may be SIGNAL or INTERRUPT 180 // Value may be SIGNAL or INTERRUPT
181 #ifndef TIMER_INTERRUPT_HANDLER 181 #ifndef TIMER_INTERRUPT_HANDLER
182 #define TIMER_INTERRUPT_HANDLER SIGNAL 182 #define TIMER_INTERRUPT_HANDLER SIGNAL
183 #endif 183 #endif
184   184  
185 // functions 185 // functions
186 #define delay delay_us 186 #define delay delay_us
187 #define delay_ms timerPause 187 #define delay_ms timerPause
188 void delay_us(unsigned short time_us); 188 void delay_us(unsigned short time_us);
189   189  
190 //! initializes timing system (all timers) 190 //! initializes timing system (all timers)
191 // runs all timer init functions 191 // runs all timer init functions
192 // sets all timers to default prescale values #defined in systimer.c 192 // sets all timers to default prescale values #defined in systimer.c
193 void timerInit(void); 193 void timerInit(void);
194   194  
195 // default initialization routines for each timer 195 // default initialization routines for each timer
196 void timer0Init(void); ///< initialize timer0 196 void timer0Init(void); ///< initialize timer0
197 void timer1Init(void); ///< initialize timer1 197 void timer1Init(void); ///< initialize timer1
198 #ifdef TCNT2 // support timer2 only if it exists 198 #ifdef TCNT2 // support timer2 only if it exists
199 void timer2Init(void); ///< initialize timer2 199 void timer2Init(void); ///< initialize timer2
200 #endif 200 #endif
201   201  
202 // Clock prescaler set/get commands for each timer/counter 202 // Clock prescaler set/get commands for each timer/counter
203 // For setting the prescaler, you should use one of the #defines 203 // For setting the prescaler, you should use one of the #defines
204 // above like TIMER_CLK_DIVx, where [x] is the division rate 204 // above like TIMER_CLK_DIVx, where [x] is the division rate
205 // you want. 205 // you want.
206 // When getting the current prescaler setting, the return value 206 // When getting the current prescaler setting, the return value
207 // will be the [x] division value currently set. 207 // will be the [x] division value currently set.
208 void timer0SetPrescaler(u08 prescale); ///< set timer0 prescaler 208 void timer0SetPrescaler(u08 prescale); ///< set timer0 prescaler
209 u16 timer0GetPrescaler(void); ///< get timer0 prescaler 209 u16 timer0GetPrescaler(void); ///< get timer0 prescaler
210 void timer1SetPrescaler(u08 prescale); ///< set timer1 prescaler 210 void timer1SetPrescaler(u08 prescale); ///< set timer1 prescaler
211 u16 timer1GetPrescaler(void); ///< get timer0 prescaler 211 u16 timer1GetPrescaler(void); ///< get timer0 prescaler
212 #ifdef TCNT2 // support timer2 only if it exists 212 #ifdef TCNT2 // support timer2 only if it exists
213 void timer2SetPrescaler(u08 prescale); ///< set timer2 prescaler 213 void timer2SetPrescaler(u08 prescale); ///< set timer2 prescaler
214 u16 timer2GetPrescaler(void); ///< get timer2 prescaler 214 u16 timer2GetPrescaler(void); ///< get timer2 prescaler
215 #endif 215 #endif
216   216  
217   217  
218 // TimerAttach and Detach commands 218 // TimerAttach and Detach commands
219 // These functions allow the attachment (or detachment) of any user function 219 // These functions allow the attachment (or detachment) of any user function
220 // to a timer interrupt. "Attaching" one of your own functions to a timer 220 // to a timer interrupt. "Attaching" one of your own functions to a timer
221 // interrupt means that it will be called whenever that interrupt happens. 221 // interrupt means that it will be called whenever that interrupt happens.
222 // Using attach is better than rewriting the actual INTERRUPT() function 222 // Using attach is better than rewriting the actual INTERRUPT() function
223 // because your code will still work and be compatible if the timer library 223 // because your code will still work and be compatible if the timer library
224 // is updated. Also, using Attach allows your code and any predefined timer 224 // is updated. Also, using Attach allows your code and any predefined timer
225 // code to work together and at the same time. (ie. "attaching" your own 225 // code to work together and at the same time. (ie. "attaching" your own
226 // function to the timer0 overflow doesn't prevent timerPause from working, 226 // function to the timer0 overflow doesn't prevent timerPause from working,
227 // but rather allows you to share the interrupt.) 227 // but rather allows you to share the interrupt.)
228 // 228 //
229 // timerAttach(TIMER1OVERFLOW_INT, myOverflowFunction); 229 // timerAttach(TIMER1OVERFLOW_INT, myOverflowFunction);
230 // timerDetach(TIMER1OVERFLOW_INT) 230 // timerDetach(TIMER1OVERFLOW_INT)
231 // 231 //
232 // timerAttach causes the myOverflowFunction() to be attached, and therefore 232 // timerAttach causes the myOverflowFunction() to be attached, and therefore
233 // execute, whenever an overflow on timer1 occurs. timerDetach removes the 233 // execute, whenever an overflow on timer1 occurs. timerDetach removes the
234 // association and executes no user function when the interrupt occurs. 234 // association and executes no user function when the interrupt occurs.
235 // myOverflowFunction must be defined with no return value and no arguments: 235 // myOverflowFunction must be defined with no return value and no arguments:
236 // 236 //
237 // void myOverflowFunction(void) { ... } 237 // void myOverflowFunction(void) { ... }
238   238  
239 //! Attach a user function to a timer interrupt 239 //! Attach a user function to a timer interrupt
240 void timerAttach(u08 interruptNum, void (*userFunc)(void) ); 240 void timerAttach(u08 interruptNum, void (*userFunc)(void) );
241 //! Detach a user function from a timer interrupt 241 //! Detach a user function from a timer interrupt
242 void timerDetach(u08 interruptNum); 242 void timerDetach(u08 interruptNum);
243   243  
244   244  
245 // timing commands 245 // timing commands
246 /// A timer-based delay/pause function 246 /// A timer-based delay/pause function
247 /// @param pause_ms Number of integer milliseconds to wait. 247 /// @param pause_ms Number of integer milliseconds to wait.
248 void timerPause(unsigned short pause_ms); 248 void timerPause(unsigned short pause_ms);
249   249  
250 // overflow counters 250 // overflow counters
251 void timer0ClearOverflowCount(void); ///< Clear timer0's overflow counter. 251 void timer0ClearOverflowCount(void); ///< Clear timer0's overflow counter.
252 long timer0GetOverflowCount(void); ///< read timer0's overflow counter 252 long timer0GetOverflowCount(void); ///< read timer0's overflow counter
253 #ifdef TCNT2 // support timer2 only if it exists 253 #ifdef TCNT2 // support timer2 only if it exists
254 void timer2ClearOverflowCount(void); ///< clear timer2's overflow counter 254 void timer2ClearOverflowCount(void); ///< clear timer2's overflow counter
255 long timer2GetOverflowCount(void); ///< read timer0's overflow counter 255 long timer2GetOverflowCount(void); ///< read timer0's overflow counter
256 #endif 256 #endif
257   257  
258 /// @defgroup timerpwm Timer PWM Commands 258 /// @defgroup timerpwm Timer PWM Commands
259 /// @ingroup timer 259 /// @ingroup timer
260 /// These commands control PWM functionality on timer1 260 /// These commands control PWM functionality on timer1
261 // PWM initialization and set commands for timer1 261 // PWM initialization and set commands for timer1
262 // timer1PWMInit() 262 // timer1PWMInit()
263 // configures the timer1 hardware for PWM mode on pins OC1A and OC1B. 263 // configures the timer1 hardware for PWM mode on pins OC1A and OC1B.
264 // bitRes should be 8,9,or 10 for 8,9,or 10bit PWM resolution 264 // bitRes should be 8,9,or 10 for 8,9,or 10bit PWM resolution
265 // 265 //
266 // timer1PWMOff() 266 // timer1PWMOff()
267 // turns off all timer1 PWM output and set timer mode to normal state 267 // turns off all timer1 PWM output and set timer mode to normal state
268 // 268 //
269 // timer1PWMAOn() and timer1PWMBOn() 269 // timer1PWMAOn() and timer1PWMBOn()
270 // turn on output of PWM signals to OC1A or OC1B pins 270 // turn on output of PWM signals to OC1A or OC1B pins
271 // NOTE: Until you define the OC1A and OC1B pins as outputs, and run 271 // NOTE: Until you define the OC1A and OC1B pins as outputs, and run
272 // this "on" command, no PWM output will be output 272 // this "on" command, no PWM output will be output
273 // 273 //
274 // timer1PWMAOff() and timer1PWMBOff() 274 // timer1PWMAOff() and timer1PWMBOff()
275 // turn off output of PWM signals to OC1A or OC1B pins 275 // turn off output of PWM signals to OC1A or OC1B pins
276 // 276 //
277 // timer1PWMASet() and timer1PWMBSet() 277 // timer1PWMASet() and timer1PWMBSet()
278 // sets the PWM duty cycle for each channel 278 // sets the PWM duty cycle for each channel
279 // NOTE: <pwmDuty> should be in the range 0-255 for 8bit PWM 279 // NOTE: <pwmDuty> should be in the range 0-255 for 8bit PWM
280 // <pwmDuty> should be in the range 0-511 for 9bit PWM 280 // <pwmDuty> should be in the range 0-511 for 9bit PWM
281 // <pwmDuty> should be in the range 0-1023 for 10bit PWM 281 // <pwmDuty> should be in the range 0-1023 for 10bit PWM
282 // NOTE: the PWM frequency can be controlled in increments by setting the 282 // NOTE: the PWM frequency can be controlled in increments by setting the
283 // prescaler for timer1 283 // prescaler for timer1
284 //@{ 284 //@{
285   285  
286   286  
287 /// Enter standard PWM Mode on timer1. 287 /// Enter standard PWM Mode on timer1.
288 /// \param bitRes indicates the period/resolution to use for PWM output in timer bits. 288 /// \param bitRes indicates the period/resolution to use for PWM output in timer bits.
289 /// Must be either 8, 9, or 10 bits corresponding to PWM periods of 256, 512, or 1024 timer tics. 289 /// Must be either 8, 9, or 10 bits corresponding to PWM periods of 256, 512, or 1024 timer tics.
290 void timer1PWMInit(u08 bitRes); 290 void timer1PWMInit(u08 bitRes);
291   291  
292 /// Enter PWM Mode on timer1 with a specific top-count value. 292 /// Enter PWM Mode on timer1 with a specific top-count value.
293 /// \param topcount indicates the desired PWM period in timer tics. 293 /// \param topcount indicates the desired PWM period in timer tics.
294 /// Can be a number between 1 and 65535 (16-bit). 294 /// Can be a number between 1 and 65535 (16-bit).
295 void timer1PWMInitICR(u16 topcount); 295 void timer1PWMInitICR(u16 topcount);
296   296  
297 /// Turn off all timer1 PWM output and set timer mode to normal. 297 /// Turn off all timer1 PWM output and set timer mode to normal.
298 void timer1PWMOff(void); 298 void timer1PWMOff(void);
299   299  
300 /// Turn on/off Timer1 PWM outputs. 300 /// Turn on/off Timer1 PWM outputs.
301 void timer1PWMAOn(void); ///< Turn on timer1 Channel A (OC1A) PWM output. 301 void timer1PWMAOn(void); ///< Turn on timer1 Channel A (OC1A) PWM output.
302 void timer1PWMBOn(void); ///< Turn on timer1 Channel B (OC1B) PWM output. 302 void timer1PWMBOn(void); ///< Turn on timer1 Channel B (OC1B) PWM output.
303 void timer1PWMAOff(void); ///< turn off timer1 Channel A (OC1A) PWM output 303 void timer1PWMAOff(void); ///< turn off timer1 Channel A (OC1A) PWM output
304 void timer1PWMBOff(void); ///< turn off timer1 Channel B (OC1B) PWM output 304 void timer1PWMBOff(void); ///< turn off timer1 Channel B (OC1B) PWM output
305   305  
306 void timer1PWMASet(u16 pwmDuty); ///< set duty of timer1 Channel A (OC1A) PWM output 306 void timer1PWMASet(u16 pwmDuty); ///< set duty of timer1 Channel A (OC1A) PWM output
307 void timer1PWMBSet(u16 pwmDuty); ///< set duty of timer1 Channel B (OC1B) PWM output 307 void timer1PWMBSet(u16 pwmDuty); ///< set duty of timer1 Channel B (OC1B) PWM output
308   308  
309 //@} 309 //@}
310 //@} 310 //@}
311   311  
312 // Pulse generation commands have been moved to the pulse.c library 312 // Pulse generation commands have been moved to the pulse.c library
313   313  
314 #endif 314 #endif