Millis () è in conflitto con i pin PWM associati al timer 0?


9

Ho letto che la millis()funzione utilizza lo stesso timer di un paio di pin PWM.

Se stai usando quei pin PWM, millis()restituirai comunque il valore corretto?

Risposte:


6

Non sono in conflitto poiché millis()leggono rigorosamente il valore immediato in TCNT0mentre PWM tramite il timer 0 utilizza la capacità dell'hardware di confrontare il valore di TCNT0con i valori in OCR0xsenza influenzare il valore di nessuno di essi.


millis()utilizza solo i conteggi di overflow del Timer 0. micros()legge il valore immediato in TCNT0.
Nick Gammon

5

Solo per aggiungere alla risposta di @ Ignacio che ha risposto direttamente alla tua domanda. Il "conflitto" di cui parli è in relazione al Timer0prescaler.

Per la maggior parte, è possibile utilizzare quei pin (per inciso pin 5 e 6 su UNO) con PWM senza problemi e leggere il valore corretto di millis()(nonché ottenere il ritardo previsto da delay)

Il punto in cui si verificano problemi è se si desidera modificare il prescaler (di solito per modificare la frequenza del segnale PWM). Se lo modifichi, influisci direttamente sul calcolo e sulla segnalazione millis()e sulla lunghezza di delay(x).


Puoi leggere il prescaler del tuo timer dai bit in basso di Serial.println (TCCR0A, BIN); Se sono "11", il tuo prescaler è clk / 64. È quindi possibile calcolare il fattore per la modifica di millis () e delay ().
Dave X,

Questo è un ottimo punto e ho sempre evitato di modificarlo, ma non c'è motivo se lo desideri / ne hai davvero bisogno. L'altro punto è che se lo hai modificato conosci già il nuovo prescaler e potresti a loro volta scrivere involucri per millis ()o delay ()comunque
Madivad,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.