Le blog de Noah Stahl a un exemple de clignotement d'une LED avec Timer2 . Avec cela et la fiche technique, vous devriez être en mesure de l'adapter à l'interruption que vous souhaitez utiliser - c'est-à-dire l'interruption dont vous pouvez vous permettre d'abandonner la fonction normale ou que vous êtes prêt à modifier. Timer2 est généralement utilisé pour certaines fonctions PWM.
Son exemple cite l'ATmega2560; Je peux confirmer qu'il fonctionne également avec un ATmega328p. Parcourez son site pour des exemples d'interruptions Arduino plus utiles.
Éditer:
Voici ma version légèrement modifiée - principalement dans les commentaires - du code de Noah. Appelez Timer2init () à partir de la fonction de configuration Arduino () après avoir initialisé toutes les structures de données ou le matériel associés, car le chronométrage - et l'interruption - commencera une fois que vous le ferez.
F / ex, je l'ai utilisé pour multiplexer un affichage à 3 chiffres à 7 segments, donc avant d'initialiser la minuterie, j'ai initialisé les registres d'E / S d'affichage et effacé les données d'affichage à l'endroit où l'ISR le recherchera.
Il y a un tableau dans les commentaires de quelques données de synchronisation utiles de la fiche technique et mes propres calculs pour référence pour mettre en place un autre schéma de synchronisation.
La macro ISR () prend soin de créer un code d'entrée et de sortie d'interruption pour un ISR à la place de l'entrée et de la sortie d'une fonction normale, et de le lier avec le vecteur d'interruption approprié. Le reste de cette fonction est 1) le code à exécuter à chaque interruption, et 2) le code de code pour réinitialiser le temporisateur pour la prochaine interruption.
Tel qu'il est écrit, cela devrait se retrouver dans une esquisse .pde ou .ino (ou un fichier .cpp, si vous utilisez eclipse, f / ex). L'esquisse doit # définir LEDPIN, et setup () doit appeler Timer2init (). La fonction de boucle peut être vide ou non; la LED devrait commencer à clignoter au téléchargement (enfin, littéralement, après l'appel de 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
};