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:
Wird also aus millis und einem schnell laufenden Zähler berechnet.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); }
Geht wahrscheinlich auf einem AVR ähnlich.
Lesezeichen