9

I've read that the millis() function uses the same timer as a couple of PWM pins.

If you're using those PWM pins, will millis() still return the correct value?

2 Answers 2

7

They do not conflict as millis() strictly reads the immediate value in TCNT0 whereas PWM via timer 0 uses the hardware's ability to compare the value of TCNT0 with the values in OCR0x without affecting the value of any of them.

1
  • millis() just uses Timer 0 overflow counts. micros() reads the immediate value in TCNT0. Commented Mar 24, 2016 at 22:53
6

Just to add to @Ignacio's answer which has directly answered your question. The "conflict" you speak of is in relation to Timer0's prescaler.

For the most part, you can use those pins (incidentally pins 5 and 6 on the UNO) with PWM without an issue, and read the correct value of millis() (as well as get the expected delay from delay)

Where you run into problems is if you want to change the prescaler (usually to modify the frequency of the PWM signal). If you change this, then you directly affect the calculation and reporting of millis() and the length of delay(x).

2
  • You can read your timer's prescaler by the bottom bits of Serial.println(TCCR0A,BIN); If they are '11' then your prescaler is clk/64. You could then calculate the factor for modifying millis() and delay(). Commented Feb 24, 2016 at 14:59
  • That's a very good point and I've always just steered clear of modifying it, but there's no reason if you really want/need to. The other point is that if you've modified it you already know the new prescaler and could in turn write wrappers for millis () or delay () anyway Commented Feb 24, 2016 at 23:13

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.