Il blog di Noah Stahl ha un esempio di lampeggiamento di un LED con Timer2 . Con questo e la scheda tecnica, dovresti essere in grado di adattarlo a qualsiasi interruzione che desideri utilizzare, ovvero l'interruzione la cui normale funzione ti puoi permettere di rinunciare o che sei disposto a modificare. Timer2 viene solitamente utilizzato per alcune funzioni PWM.
Il suo esempio cita l'ATmega2560; Posso confermare che funziona anche con un ATmega328p. Cerca nel suo sito esempi di interruzioni Arduino più utili.
Modificare:
Ecco la mia versione leggermente modificata - principalmente nei commenti - della versione del codice di Noè. Chiama Timer2init () dalla funzione setup () di Arduino dopo aver inizializzato qualsiasi struttura di dati o hardware correlata, poiché il tempismo - e l'interruzione - inizierà una volta che lo fai.
Per esempio, l'ho usato per multiplexare un display a 7 segmenti a 3 cifre, quindi prima di inizializzare il timer, ho inizializzato i registri I / O del display e cancellato i dati del display nel punto in cui l'ISR lo cercherà.
C'è una tabella nei commenti di alcuni dati di temporizzazione utili dalla scheda tecnica e i miei calcoli come riferimento per impostare un altro schema di temporizzazione.
La macro ISR () si occupa della creazione di un codice di ingresso e di uscita di interrupt per un ISR anziché di una normale voce di ingresso e uscita e di collegarlo al vettore di interrupt corretto. Il resto di quella funzione è 1) il codice da eseguire ad ogni interruzione e 2) il codice per resettare il timer per l'interruzione successiva.
Come scritto, questo dovrebbe cadere in uno schizzo .pde o .ino (o in un file .cpp, se usi eclipse, f / ex). Lo schizzo deve #definire LEDPIN e setup () deve chiamare Timer2init (). La funzione loop può essere vuota o no; il LED dovrebbe iniziare a lampeggiare durante il download (bene, letteralmente, dopo che viene chiamato Timer2init ()).
/*
* 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
};