Er zählt die Millisekunden über einen Interrupt. digitalRead ist so groß, dass es da gelegentlich eine Unterbrechung geben kann.
Ich kenne nur die micros() Implementierung für die 32 Bit Teensys, um die für AVR zu suchen habe ich weder Lust noch Zeit.
Reduziert aufs wesentliche sieht der Code für micros() auf dem Teensy so aus:
Code:
uint32_t micros(void)
{
uint32_t count, current;
__disable_irq();
current = SYST_CVR;
count = systick_millis_count;
__enable_irq();
current = ((F_CPU / 1000) - 1) - current;
return count * 1000 + current / (F_CPU / 1000000);
}
Wird also aus millis und einem schnell laufenden Zähler berechnet.
Geht wahrscheinlich auf einem AVR ähnlich.
Lesezeichen