Noah Stahls Blog zeigt ein Beispiel für das Blinken einer LED mit Timer2 . Mit diesem und dem Datenblatt sollten Sie in der Lage sein, es an den Interrupt anzupassen, den Sie verwenden möchten - dh an den Interrupt, dessen normale Funktion Sie sich am meisten leisten können, aufzugeben oder zu ändern bereit sind. Timer2 wird normalerweise für einige PWM-Funktionen verwendet.
Sein Beispiel zitiert den ATmega2560; Ich kann bestätigen, dass es auch mit einem ATmega328p funktioniert. Schauen Sie sich auf seiner Website nach nützlicheren Beispielen für Arduino-Interrupts um.
Bearbeiten:
Hier ist meine leicht bearbeitete - meistens in den Kommentaren - Version von Noahs Code. Rufen Sie Timer2init () über die Funktion Arduino setup () auf, nachdem Sie alle zugehörigen Datenstrukturen oder Hardware initialisiert haben, da das Timing - und das Unterbrechen - sofort beginnt.
F / ex, ich habe es verwendet, um eine dreistellige 7-Segment-Anzeige zu multiplexen, also habe ich vor dem Initialisieren des Timers die Anzeige-E / A-Register initialisiert und die Anzeigedaten an der Stelle ausgeblendet, an der der ISR danach suchen wird.
Es gibt eine Tabelle in den Kommentaren einiger nützlicher Zeitdaten aus dem Datenblatt und meiner eigenen Berechnungen als Referenz, um ein anderes Zeitschema einzurichten.
Das Makro ISR () sorgt dafür, dass anstelle des Ein- und Ausstiegs einer normalen Funktion ein Interrupt-Ein- und Ausstiegscode für einen ISR erstellt und mit dem richtigen Interrupt-Vektor verknüpft wird. Der Rest dieser Funktion ist 1) der Code, der bei jedem Interrupt ausgeführt werden soll, und 2) der Codecode zum Zurücksetzen des Timers für den nächsten Interrupt.
Wie geschrieben, sollte dies in eine .pde- oder .ino-Skizze (oder eine .cpp-Datei, wenn Sie Eclipse verwenden, f / ex) eingefügt werden. Die Skizze muss # LEDPIN definieren und setup () muss Timer2init () aufrufen. Die Schleifenfunktion kann leer sein oder nicht; Die LED sollte beim Download zu blinken beginnen (im wahrsten Sinne des Wortes, nachdem Timer2init () aufgerufen wurde).
/*
* 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
};