I'm trying to determine if the AVR delay functions _delay_us()
and _delay_ms()
use timers in such a way that I can't use those timers for other functionality in my code. If so, what timer does it use?
For reference I'm using an Arduino Uno with ATmega328, but I imagine if it's an AVR function it must work similarly on other devices.
2 Answers 2
No, these macros expand to calls to __builtin_avr_delay_cycles()
,
which are compiled into delay loops. It should be noted that:
- the arguments to these macros should be compile-time constants, they can be floating point
- the macros are cycle-accurate, e.g.
_delay_us(0.125)
will take exactly two CPU cycles on an Uno - whereas the CPU time used by the call is exactly what you ask for, the physical time will be larger if the call gets interrupted.
-
Thank you! I was worried I wouldn't be able to use one of the timers if I used the delay functions.lemontwist– lemontwist2017年06月22日 14:41:25 +00:00Commented Jun 22, 2017 at 14:41
No.
The long answer is that you can delay via timers, a little bit more painfully within the Arduino framework, or much more efficiently if you are willing to move outside of the arduino framework.
I wrote a set of systick clones for many of the popular 8bit mcus precisely for that.