There is a "delayMicroseconds()" function that works.
This little sketch delays pin flipping by 500000μs=0.5s several times:
void setup() {
pinMode(7,OUTPUT);
digitalWrite(7,HIGH);
delayMicroseconds(500000);
digitalWrite(7,LOW);
delayMicroseconds(500000);
digitalWrite(7,HIGH);
delayMicroseconds(500000);
digitalWrite(7,LOW);
delayMicroseconds(500000);
digitalWrite(7,HIGH);
delayMicroseconds(500000);
digitalWrite(7,LOW);
delayMicroseconds(500000);
digitalWrite(7,HIGH);
delayMicroseconds(500000);
digitalWrite(7,LOW);
delayMicroseconds(500000);
}
void loop() {}
Oscilloscope confirms that "delayMicroSceonds()" does the right thing:
After fixing a bug of myself it works also when inserted between "micros()" calls as in previous sketch:
...
t0=micros();
t1=micros();
delayMicroseconds(100);
t2=micros();
t3=micros();
...
Results in this output:
2016
2017
2119
2120
Seems I need to understand in detail how "delayMicroseconds()" and "micros()" work to answer my original question (is sub microsecond precision time measurement possible with Due?).
From ".arduino15/packages/arduino/hardware/sam/1.6.4/cores/arduino/wiring.h":
/**
* \brief Pauses the program for the amount of time (in microseconds) specified as parameter.
*
* \param dwUs the number of microseconds to pause (uint32_t)
*/
static inline void delayMicroseconds(uint32_t) __attribute__((always_inline, unused));
static inline void delayMicroseconds(uint32_t usec){
/*
* Based on Paul Stoffregen's implementation
* for Teensy 3.0 (http://www.pjrc.com/)
*/
if (usec == 0) return;
uint32_t n = usec * (VARIANT_MCK / 3000000);
asm volatile(
"L_%=_delayMicroseconds:" "\n\t"
"subs %0, #1" "\n\t"
"bne L_%=_delayMicroseconds" "\n"
: "+r" (n) :
);
}
Hermann.