0

I was trying to understand the working of micros() function internally and I had a look at the function in Arduino.h

This is the code:

unsigned long micros() {
 unsigned long m;
 uint8_t oldSREG = SREG, t;
 cli();
 m = timer0_overflow_count;
 #if defined(TCNT0)
 t = TCNT0;
 #elif defined(TCNT0L)
 t = TCNT0L;
#else
 #error TIMER 0 not defined
#endif
#ifdef TIFR0
 if ((TIFR0 & _BV(TOV0)) && (t & 255))
 m++;
#else
 if ((TIFR & _BV(TOV0)) && (t & 255))
 m++;
#endif
 SREG = oldSREG;
 return ((m << 8) + t) * (64 / clockCyclesPerMicrosecond());
}

Can someone please explain me what this line is doing :

 if ((TIFR0 & _BV(TOV0)) && (t & 255))
 m++;
asked Jan 6, 2016 at 16:37

2 Answers 2

5

If the timer 0 has overflowed (TIFR0 & _BV(TOV0)) and there is at least a count of 1 in the timer count register (t & 255) then increment the local copy of the overflow count.

That overflow count is used later on to add an upper 8 bits to what is basically an 8 bit counter to turn it into a 16 bit one ((m << 8) + t).

answered Jan 6, 2016 at 17:17
2
  • can you please explain me "timer0_overflow_count" too? Commented Jan 7, 2016 at 16:20
  • 1
    It's the current count of timer overflows - it's incremented in an interrupt routine elsewhere. Commented Jan 7, 2016 at 16:20
4

Since at the start of this function interrupts have been disabled by the cli() function it is possible that the timer TCNT0 has overflowed yet this event has not been processed and included in the value of timer0_overflow_count that has been read into m. Therefore the line that you are asking about is checking for this condition and incrementing the local copy m if necessary before using it to calculate the number of microseconds since startup.

answered Jan 6, 2016 at 17:21

Your Answer

Draft saved
Draft discarded

Sign up or log in

Sign up using Google
Sign up using Email and Password

Post as a guest

Required, but never shown

Post as a guest

Required, but never shown

By clicking "Post Your Answer", you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.