Schritt 2: Strukturierung Timer unterbricht
Timer-Setup-Code erfolgt innerhalb der setup() {} Funktion in ein Arduino-Skizze.
Der Code für das Einrichten von Zeitgeber-Interrupts ist ein wenig beängstigend zu sehen, aber es ist eigentlich nicht so schwer. Ich ziemlich genau die gleichen wesentlichen Stück Code zu kopieren und ändern der Vorteiler und vergleichen Spiel registrieren, um die richtigen Interrupt-Frequenz einstellen.
Die Hauptstruktur des Interrupt-Setup sieht wie folgt aus:
Beachten Sie, wie der Wert der OCR #A (Compare Match-Wert) für jeden der diese Timer-Einstellungen ändert. Wie im letzten Schritt erklärte, war dies nach der folgenden Gleichung berechnet:
Vergleichen Sie Match Register = [16.000, 000Hz / (Vorteiler * gewünscht Interrupt-Frequenz)] - 1
Denken Sie daran, dass bei Verwendung von Timer 0 und 2 diese Zahl kleiner als 256 und weniger als 65536 für timer1 sein muss
Beachten Sie auch, wie die Setups zwischen den drei Timer in der Linie abweichen die CTC-Modus aktiviert wird:
TCCR0A | = (1 << WGM01); //for timer0
TCCR1B | = (1 << WGM12); //for timer1
TCCR2A | = (1 << WGM21); //for timer2
Dies folgt direkt aus dem Datenblatt des ATMEL 328/168.
Beachten Sie schließlich, wie das Setup für die Prescalers die Tabellen im letzten Schritt folgt (die Tabelle für Timer 0 oben wiederholt),
TCCR2B | = (1 << CS22); Gesetztes CS #2 Bit für 64 Vorteiler für Timer 2
TCCR1B | = (1 << CS11); Gesetztes CS #1 Bit für 8 Vorteiler für Timer 1
TCCR0B | = (1 << CS02) | (1 << CS00); Setzen Sie CS #2 und CS #0 Bits für 1024 Vorteiler für Timer 0
Beachten Sie im letzten Schritt gibt es verschiedene Optionen für die verschiedenen Timer prescaling. Timer2 muss beispielsweise nicht die Möglichkeit, 1024 Vorteiler.
Die Befehle, die Sie während dieser Zeitgeber-Interrupts ausführen möchten befinden sich in der Arduino-Skizze gekapselt in folgendem:
ISR(TIMER0_COMPA_vect) {//change 0 und 1 für timer1 und 2 für timer2
Interrupt-Befehle hier
}
Dieses Stück Code sollte außerhalb der setup() und loop() Funktionen befinden. Versuchen Sie auch, um die Interrupt-Routine so kurz wie möglich zu halten, vor allem, wenn Sie mit einer hohen Frequenz unterbrochen sind. Es kann sich auch lohnen, Adressierung die Anschlüsse/Pins des ATMEL Chips direkt anstelle mit den Funktionen digitalWrite() und digitalRead(). Finden Sie mehr Infos über dieses hier.
Beispiel-die folgende Skizze einrichtet und führt 3 Timer-Interrupts:
//timer interrupts //by Amanda Ghassaei //June 2012
Die Bilder oben zeigen die Ergebnisse dieser Zeitgeber-Interrupts. Abb. 2 zeigt die LED an Pin 13 Einschalten eine Sekunde lang angeschlossen Fig 1 zeigt ein Rechtecksignal, oszillierend zwischen 0 und 5V bei 1kHz (timer0 Interrupt), dann für eine Sekunde (timer1 Interrupt) auszuschalten, Abb. 3 zeigt eine Pulswelle oszillierend zwischen 0 und 5 v bei einer Frequenz von 4khz (timer2 Interrupt).