51 lines
1.1 KiB
C
51 lines
1.1 KiB
C
#include "delay.h"
|
|
|
|
#include "watchdog.h"
|
|
|
|
// delay( microseconds )
|
|
void delay(uint32_t delay) {
|
|
wd_reset();
|
|
while (delay > 65535) {
|
|
delayMicrosecondsInterruptible(65533);
|
|
delay -= 65535;
|
|
wd_reset();
|
|
}
|
|
delayMicrosecondsInterruptible(delay & 0xFFFF);
|
|
wd_reset();
|
|
}
|
|
|
|
// delay_ms( milliseconds )
|
|
void delay_ms(uint32_t delay) {
|
|
wd_reset();
|
|
while (delay > 65) {
|
|
delayMicrosecondsInterruptible(64999);
|
|
delay -= 65;
|
|
wd_reset();
|
|
}
|
|
delayMicrosecondsInterruptible(delay * 1000);
|
|
wd_reset();
|
|
}
|
|
|
|
void delayMicrosecondsInterruptible(uint16_t us)
|
|
{
|
|
// 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)
|
|
return;
|
|
|
|
// the following loop takes a quarter of a microsecond (4 cycles)
|
|
// per iteration, so execute it four times for each microsecond of
|
|
// delay requested.
|
|
us <<= 2;
|
|
|
|
// account for the time taken in the preceeding commands.
|
|
us -= 2;
|
|
|
|
// busy wait
|
|
__asm__ __volatile__ ("1: sbiw %0,1" "\n\t" // 2 cycles
|
|
"brne 1b" :
|
|
"=w" (us) :
|
|
"0" (us) // 2 cycles
|
|
);
|
|
}
|