@@ -111,15 +111,10 @@ class Pin
111111 typedef Pin::B5 SPI_SCK;
112112 };
113113
114- /* * Don't use this directly, use Arduino16 or Arduino32 instead
115- */
116- template <typename timeres_t >
117- class _Arduino
114+ class Arduino
118115 {
119116public:
120117
121- typedef timeres_t time_res_t ;
122-
123118 // The analog pins in Arduino numbering
124119 typedef Pin::C0 A0;
125120 typedef Pin::C1 A1;
@@ -224,7 +219,16 @@ class _Arduino
224219 UCSR0B = 0 ;
225220#endif
226221 }
227-
222+ };
223+
224+ /* * Don't use this directly, use Timer16 or Timer32 instead
225+ */
226+ template <typename timeres_t >
227+ class _Timer
228+ {
229+ public:
230+ typedef timeres_t time_res_t ;
231+
228232 static timeres_t millis ()
229233 {
230234 const uint8_t oldSREG = SREG;
@@ -238,27 +242,28 @@ class _Arduino
238242 return m;
239243 }
240244
241- static timeres_t micros ()
245+ static uint16_t micros ()
242246 {
243- timeres_t m;
244- uint16_t t;
245- uint8_t oldSREG = SREG;
247+ uint8_t m;
248+ uint8_t t;
249+ const uint8_t oldSREG = SREG;
246250
247251 cli ();
248252 t = TCNT0;
253+
254+ m = timer0_overflow_count % (1 << TIMER16_MICRO_SCALE);
249255
250256#ifdef TIFR0
251257 if ((TIFR0 & _BV (TOV0)) && (t == 0 ))
252- t = 256 ;
258+ m++ ;
253259#else
254260 if ((TIFR & _BV (TOV0)) && (t == 0 ))
255- t = 256 ;
261+ m++ ;
256262#endif
257263
258- m = timer0_overflow_count;
259264 SREG = oldSREG;
260265
261- return ((m << 8 ) + t) * 64 / (F_CPU / 1000000L );
266+ return ((m << 8 ) + t) * ( 64 / (F_CPU / 1000000L ) );
262267 }
263268
264269 static void delay (timeres_t ms)
@@ -274,41 +279,9 @@ class _Arduino
274279 volatile static timeres_t timer0_millis;
275280 };
276281
277- template <typename T> volatile T _Arduino<T>::timer0_overflow_count = 0 ;
278- template <typename T> volatile T _Arduino<T>::timer0_clock_cycles = 0 ;
279- template <typename T> volatile T _Arduino<T>::timer0_millis = 0 ;
280-
281- /* * This is an Arduino with 16bit timer resolution.
282-
283- The value from Arduino16::millis() will wrap around after about 65 seconds
284- and the value from Arduino16::micros() will wrap around after about 65 ms.
285-
286- When you use Arduino16, you must #include "arduino++timer16.h", or
287- Arduino16::millis() will always return 0.
288-
289- The recommended way to use a timer value in user code is:
290-
291- typename Arduino16::time_res_t now = Arduino16::millis();
292-
293- Motivation: With Arduino16 instead of Arduino32, Lars has seen a code size
294- reduction of 238 bytes with avr-gcc 4.6.1.
295- */
296- typedef _Arduino<uint16_t > Arduino16;
297-
298- /* * This is an Arduino with 32bit timer resolution.
299-
300- When you use Arduino32, you must #include "arduino++timer32.h", or
301- Arduino32::millis() will always return 0.
302-
303- The recommended way to use a timer value in user code is:
304-
305- typename Arduino32::time_res_t now = Arduino32::millis();
306-
307- The value from Arduino32::millis() will wrap around after about 49 days
308- and the value from Arduino32::micros() will wrap around after about
309- 71 minutes.
310- */
311- typedef _Arduino<uint32_t > Arduino32;
282+ template <typename T> volatile T _Timer<T>::timer0_overflow_count = 0 ;
283+ template <typename T> volatile T _Timer<T>::timer0_clock_cycles = 0 ;
284+ template <typename T> volatile T _Timer<T>::timer0_millis = 0 ;
312285
313286void delayMicroseconds (unsigned int us)
314287 {
0 commit comments