Fixing delayMicroseconds() timing for 20 MHz clocks. (Erdem U. Altinyurt)

http://code.google.com/p/arduino/issues/detail?id=306
This commit is contained in:
David A. Mellis 2011-12-02 17:04:20 -05:00
parent 59a3690eb4
commit aae9972a2b
1 changed files with 19 additions and 1 deletions

View File

@ -124,8 +124,26 @@ void delayMicroseconds(unsigned int us)
// calling avrlib's delay_us() function with low values (e.g. 1 or
// 2 microseconds) gives delays longer than desired.
//delay_us(us);
#if F_CPU >= 20000000L
// for the 20 MHz clock on rare Arduino boards
#if F_CPU >= 16000000L
// for a one-microsecond delay, simply wait 2 cycle and return. The overhead
// of the function call yields a delay of exactly a one microsecond.
__asm__ __volatile__ (
"nop" "\n\t"
"nop"); //just waiting 2 cycle
if (--us == 0)
return;
// the following loop takes a 1/5 of a microsecond (4 cycles)
// per iteration, so execute it five times for each microsecond of
// delay requested.
us = (us<<2) + us; // x5 us
// account for the time taken in the preceeding commands.
us -= 2;
#elif F_CPU >= 16000000L
// for the 16 MHz clock on most Arduino boards
// for a one-microsecond delay, simply return. the overhead