(la videolezione) I timer/counter, spesso sottovalutati dai principianti, sono tra le periferiche più versatili e onnipresenti in qualsiasi microcontrollore, dalle applicazioni più semplici a quelle estremamente complesse.
In termini semplici, un timer/counter è un registro a N bit (spesso 8, 16 o 32 bit) che può essere incrementato o decrementato automaticamente dal clock del sistema o da un segnale esterno. La distinzione fondamentale risiede nel loro nome.
I timer vengono incrementati/decrementati da un segnale di clock interno (molto stabile) e misurano intervalli di tempo.
I counter, invece, vengono incrementati/decrementati da un segnale esterno applicato a un pin specifico del microcontrollore. Contano eventi, come il numero di impulsi provenienti da un sensore (es. un encoder rotativo).
Quasi sempre, la stessa periferica hardware può essere configurata per operare in entrambe le modalità.

Un timer è composto da pochi elementi fondamentali:
Registro di Controllo (TCCRx): Dove si configura il comportamento del timer (prescaler, modalità, etc.). TCCR sta per Timer Counter Control Register.
Registro Contatore (TCNTx): Il registro vero e proprio il cui valore si incrementa o decrementa. TCNT sta per Timer Counter Register.
Registro di Confronto (OCRx): Quando il valore del contatore (TCNTx) raggiunge il valore in questo registro, scatta un evento. OCR sta per Output Compare Register.
Prescaler: Un divisore di frequenza che "rallenta" il clock del sistema prima che arrivi al contatore. Se il clock di sistema è a 16 MHz e si imposta un prescaler a 64, il timer verrà incrementato a 16.000.000 / 64 = 250.000 Hz. Questo è fondamentale per misurare intervalli di tempo più lunghi.
I timer/counter possono operare in diverse modalità, ognuna con uno scopo specifico:
Modalità Normale: Il contatore parte da zero, arriva al suo valore massimo (es. 65535 per un timer a 16 bit) e poi ricomincia da zero (overflow). Viene generato un interrupt di overflow, utile per compiti periodici (es. "accendi un LED ogni 500ms").
Modalità CTC (Clear Timer on Compare Match): In questa modalità, il contatore non arriva fino al massimo, ma viene azzerato non appena raggiunge il valore memorizzato nel registro di compare match (OCRx). È estremamente precisa per generare segnali con una frequenza esatta (es. un'onda quadra su un pin) o per eseguire codice a intervalli regolari.
Modalità PWM: Forse l'applicazione più famosa. Il timer, insieme a un pin di output, viene configurato per generare automaticamente un segnale PWM. Il registro OCRx determina il duty cycle (la larghezza dell'impulso), mentre la frequenza del PWM è determinata dal prescaler e dal valore massimo del timer. Il PWM è essenziale per controllare la luminosità di un LED, la velocità di un motore DC o la posizione di un servomotore, tutto senza caricare la CPU.
Modalità Input Capture: Questa è la funzione speculare al PWM. Un pin speciale è in ascolto di un segnale esterno. Quando viene rilevato un fronte (di salita o di discesa), il valore corrente del timer viene "congelato" e salvato in un apposito registro. Questo permette di misurare con precisione la durata di un impulso o la frequenza di un segnale esterno.
Modalità Watchdog Timer (WDT): Un timer speciale e indipendente, progettato per aumentare l'affidabilità del sistema. Se non viene periodicamente "azzerato" dal software, scatta un timeout e resetta il microcontrollore. Questo evita che il sistema rimanga bloccato in un loop infinito a causa di un bug software.
Applicazioni Pratiche nel Mondo Reale
Scheduling di Task (RTOS Semplice): Un timer genera un interrupt ogni millisecondo. All'interno della routine di interrupt, un dispatcher può decidere quale task eseguire, creando un semplice sistema operativo real-time.
Generazione di Tonalità Sonore: Usando la modalità PWM, è possibile generare onde quadre a frequenze audio precise per far suonare un buzzer.
Misura della Velocità di un Motore: Collegando l'uscita di un encoder ottico a un pin di Input Capture, si può misurare il tempo tra due impulsi e quindi calcolare la velocità di rotazione.
Antirimbalzo Software: Un timer può essere usato per ignorare i transienti di commutazione di un pulsante fisico, attendendo qualche millisecondo dopo la prima pressione prima di campionare nuovamente lo stato stabile.
Perché Sono Così Importanti?
L'importanza dei timer risiede nella loro efficienza. Permettono di eseguire operazioni legate al tempo e al conteggio in modo hardware, liberando la CPU (Central Processing Unit) per compiti più complessi. Senza di essi, la CPU sarebbe costantemente occupata in loop di attesa (while loop) per contare istruzioni, un approccio estremamente inefficiente e impreciso.