I usually find that I need to read the sections of the data sheet a few times before I understand it.
This isn't what you are doing, but it may be a good starting point. The order you do things sometimes make a big difference: I noticed that you initiate the timer interrupt before setting it up properly (TIMSK2).
This is working code that uses timer 2, and interrupts every 10 microseconds. Try starting with this and then modifying it to what you want:
void SetupTimerISR() {
// Disable interrupts while setting registers
cli();
// Reset control registers
TCCR2A = 0;
TCCR2B = 0;
// Clear Timer on Compare Match (CTC) Mode
TCCR2A |= (1 << WGM21);
// Prescaler x1
TCCR2B |= (1 << CS20);
// Interrupt every 160/16e6 = 10 usec
OCR2A = 159;
// Use system clock for Timer/Counter2
ASSR &= ~(1 << AS2);
// Reset Timer/Counter2 Interrupt Mask Register
TIMSK2 = 0;
// Enable Output Compare Match A Interrupt
TIMSK2 |= (1 << OCIE2A);
// Enable interrupts once registers have been update
sei();
}
// This ISR is run when Timer/Counter2 reaches OCR2A
ISR(TIMER2_COMPA_vect)
{
int_count++;
}
Every 10 microseconds, a global variable increments.