Millis () est-il en conflit avec les broches PWM associées au temporisateur 0?

9

J'ai lu que la millis()fonction utilise la même minuterie que quelques broches PWM.

Si vous utilisez ces broches PWM, millis()renverra- t-il toujours la valeur correcte?

Aurast
la source

Réponses:

6

Ils n'entrent pas en conflit car millis()lit strictement la valeur immédiate dans TCNT0alors que PWM via le temporisateur 0 utilise la capacité du matériel pour comparer la valeur de TCNT0avec les valeurs dans OCR0xsans affecter la valeur de l'un d'eux.

Ignacio Vazquez-Abrams
la source
millis()utilise simplement le nombre de dépassements du temporisateur 0. micros()lit la valeur immédiate en TCNT0.
Nick Gammon
5

Juste pour ajouter à la réponse de @ Ignacio qui a directement répondu à votre question. Le «conflit» dont vous parlez est lié au Timer0prescaler de.

Pour la plupart, vous pouvez utiliser ces broches (accessoirement les broches 5 et 6 sur l'UNO) avec PWM sans problème, et lire la valeur correcte de millis()(ainsi qu'obtenir le retard attendu de delay)

Lorsque vous rencontrez des problèmes, c'est si vous souhaitez modifier le pré-échelle (généralement pour modifier la fréquence du signal PWM). Si vous changez cela, vous affectez directement le calcul et le rapport de millis()et la longueur de delay(x).

Madivad
la source
Vous pouvez lire le prédimensionneur de votre minuterie par les bits inférieurs de Serial.println (TCCR0A, BIN); S'ils sont `` 11 '', votre prédécaleur est clk / 64. Vous pouvez ensuite calculer le facteur de modification de millis () et delay ().
Dave X
C'est un très bon point et j'ai toujours évité de le modifier, mais il n'y a aucune raison si vous voulez / devez vraiment. L'autre point est que si vous l'avez modifié, vous connaissez déjà le nouveau prescaler et pourriez à son tour écrire des wrappers pour millis ()ou de delay ()toute façon
Madivad