O blog de Noah Stahl tem um exemplo de piscar de um LED com o Timer2 . Com isso e a planilha de dados, você poderá adaptá-lo à interrupção que desejar usar - ou seja, a interrupção cuja função normal você mais pode desistir ou deseja modificar. Timer2 é geralmente usado para algumas funções PWM.
Seu exemplo cita o ATmega2560; Posso confirmar que ele funciona com um ATmega328p também. Veja em seu site exemplos mais úteis de interrupção do Arduino.
Editar:
Aqui está minha versão levemente editada - principalmente nos comentários - do código de Noé. Chame Timer2init () da função setup do Arduino () depois de inicializar qualquer estrutura de dados ou hardware relacionado, porque o tempo - e a interrupção - começarão assim que você o fizer.
F / ex, usei-o para multiplexar uma tela de 3 dígitos e 7 segmentos, então, antes de inicializar o timer, inicializei os registros de E / S da tela e apaguei os dados da tela no local em que o ISR a procuraria.
Há uma tabela nos comentários de alguns dados úteis de tempo da folha de dados e meus próprios cálculos de referência para configurar outro esquema de tempo.
A macro ISR () cuida da criação de código de entrada e saída de interrupção para um ISR, em vez da entrada e saída de uma função normal, e de vinculá-lo ao vetor de interrupção apropriado. O restante dessa função é 1) o código a ser executado a cada interrupção e 2) o código de código para redefinir o timer para a próxima interrupção.
Conforme escrito, isso deve aparecer em um esboço .pde ou .ino (ou em um arquivo .cpp, se você usar eclipse, f / ex). O esboço precisa # definir LEDPIN, e setup () precisa chamar Timer2init (). A função loop pode estar vazia ou não; o LED deve começar a piscar no download (bem, literalmente, depois que Timer2init () for chamado).
/*
* From sample interrupt code published by Noah Stahl on his blog, at:
* http://arduinomega.blogspot.com/p/arduino-code.html
*
*/
/*** FUNC
Name: Timer2init
Function: Init timer 2 to interrupt periodically. Call this from
the Arduino setup() function.
Description: The pre-scaler and the timer count divide the timer-counter
clock frequency to give a timer overflow interrupt rate:
Interrupt rate = 16MHz / (prescaler * (255 - TCNT2))
TCCR2B[b2:0] Prescaler Freq [KHz], Period [usec] after prescale
0x0 (TC stopped) 0 0
0x1 1 16000. 0.0625
0x2 8 2000. 0.500
0x3 32 500. 2.000
0x4 64 250. 4.000
0x5 128 125. 8.000
0x6 256 62.5 16.000
0x7 1024 15.625 64.000
Parameters: void
Returns: void
FUNC ***/
void Timer2init() {
// Setup Timer2 overflow to fire every 8ms (125Hz)
// period [sec] = (1 / f_clock [sec]) * prescale * (255-count)
// (1/16000000) * 1024 * (255-130) = .008 sec
TCCR2B = 0x00; // Disable Timer2 while we set it up
TCNT2 = 130; // Reset Timer Count (255-130) = execute ev 125-th T/C clock
TIFR2 = 0x00; // Timer2 INT Flag Reg: Clear Timer Overflow Flag
TIMSK2 = 0x01; // Timer2 INT Reg: Timer2 Overflow Interrupt Enable
TCCR2A = 0x00; // Timer2 Control Reg A: Wave Gen Mode normal
TCCR2B = 0x07; // Timer2 Control Reg B: Timer Prescaler set to 1024
}
/*** FUNC
Name: Timer2 ISR
Function: Handles the Timer2-overflow interrupt
Description: Maintains the 7-segment display
Parameters: void
Returns: void
FUNC ***/
ISR(TIMER2_OVF_vect) {
static unsigned int led_state = 0; // LED state
led_state = !led_state; // toggles the LED state
digitalWrite(TOGGLE_PIN, led_state);
TCNT2 = 130; // reset timer ct to 130 out of 255
TIFR2 = 0x00; // timer2 int flag reg: clear timer overflow flag
};