Interrupt e registri di ATmega328

Il codice funziona (il led lampeggia) ma perché passa più volte nella ISR? Come fa a incrementare il valore del registro contatore se l'azzeramento avviene nel setup? Il setup non si esegue una volta sola? C'è modo di stampare il contenuto del contatore?

Il Timer1 ha un registro di conteggio che si incrementa ad ogni "colpo" di clock (nell'esempio 16MHz/1024 = 15626Hz) e quando oltrepassa il massimo conteggio il timer torna a zero(overflow) e viene alzato un bit nel registro degli interrupt per informare il micro che c'è una interruzione da servire (inverti il valore del pin 13). Il timer, intanto, prosegue imperterrito in background il suo conteggio ad oltranza.
In breve, ogni volta che il timer "sbrodola" (overflow) forza il processore a servire la routine di interrupt definita con

ISR(TIMER1_OVF_vect) // Quando il timer1 sbrodola esegue le istruzioni del blocco { }
{
// toggle the LED pin to make the LED blink
digitalWrite(ledPin, digitalRead(ledPin) ^ 1);
}

Ciao
QP