Es gibt bei dem Timer0 des M16 zwei verschiedene Timer-Interrupts: den Overflow-Interrupt, und den Compare-match-interrupt.
Der Overflow löst aus, wenn der Zähler bei 255 angekommen ist und wieder auf null springt. Der Compare-match löst aus, wenn der Zähler einen bestimmten Wert erreicht.

Wenn ein Interrupt auslöst, wird das laufende Programm unterbrochen, und eine spezielle Funktion im Programm wird aufgerufen.

Die Zeit wird erst einmal über den Prescaler (Vorteiler) grob vorgewählt. das geht mit den CS... -bits. In deiner Initalisierung stellst du 1024 ein. Damit wird der Zähler alle 1024 Takte um eins weitergezählt. Bei z.B. 1Mhz Taktfrequenz würde der Timer also 976mal in der Sekunde weiterzählen. Ein Zählschritt entspricht also 1/976tel Sekunde.