Updating delayMicroseconds() to work on an 8 MHz clock as well as a 16 MHz one.

This commit is contained in:
David A. Mellis 2007-09-25 15:55:13 +00:00
parent 616d65d32a
commit 907b2a6bcb
1 changed files with 23 additions and 0 deletions

View File

@ -65,6 +65,9 @@ void delayMicroseconds(unsigned int us)
// 2 microseconds) gives delays longer than desired.
//delay_us(us);
#if F_CPU >= 16000000L
// for the 16 MHz clock on most Arduino boards
// for a one-microsecond delay, simply return. the overhead
// of the function call yields a delay of approximately 1 1/8 us.
if (--us == 0)
@ -77,6 +80,26 @@ void delayMicroseconds(unsigned int us)
// account for the time taken in the preceeding commands.
us -= 2;
#else
// for the 8 MHz internal clock on the ATmega168
// for a one- or two-microsecond delay, simply return. the overhead of
// the function calls takes more than two microseconds. can't just
// subtract two, since us is unsigned; we'd overflow.
if (--us == 0)
return;
if (--us == 0)
return;
// the following loop takes half of a microsecond (4 cycles)
// per iteration, so execute it twice for each microsecond of
// delay requested.
us <<= 1;
// partially compensate for the time taken by the preceeding commands.
// we can't subtract any more than this or we'd overflow w/ small delays.
us--;
#endif
// disable interrupts, otherwise the timer 0 overflow interrupt that
// tracks milliseconds will make us delay longer than we want.