Ich versuche mit Arduino einen Zeitverzögerungs-Interrupt zu erstellen. Ich möchte die Funktion interrupts () verwenden, da es sich um einen internen Interrupt handelt.
Beispiel: Nehmen wir an, ich möchte ein Licht ein- und ausschalten lassen, nur mit dem Zeitpunkt des Interrupts.
Es gibt Beispielcode, der jedoch externe Interrupts verwendet (attachInterrupt ()). Ich möchte weiterhin die internen Interrupts verwenden.
arduino
microcontroller
interrupts
Aleatory
quelle
quelle
Antworten:
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).
quelle
Die Funktion attachInterrupt () hängt tatsächlich einen Interrupt an eine externe Statusänderung an einem Pin an. Es gibt keine anderen Optionen.
Auf derselben Seite werden die Modusoptionen wie folgt aufgelistet:
Es tut mir leid, dass ich schlechte Nachrichten überbringe, das ist eines der ersten Dinge, nach denen ich auch gesucht habe.
quelle
Dieser Artikel über PWM wird viele Ihrer Zweifel bezüglich der Verwendung von Arduino-Timern beseitigen. Auf Arduino gibt es zwei 8-Bit-Timer und einen 16-Bit-Timer. Es gibt keine High-Level-API zum direkten Anschließen der ISR-Funktion an die Timer, die mit dem Arduino SDK (dh als Standardbibliothek) geliefert wird, sondern eine etwas niedrigere Methode zum Einstellen von Sonderfunktionsregistern und Bitarithmetik / Operationen auf sie. Es gibt jedoch eine vom Benutzer bereitgestellte Bibliothek namens Timer One .
quelle
Arduino verwendet alle drei Timer in ATMega328.
Timer1
(16 Bit) wird für Funktionen wiedelay()
undmillis()
und für die PWM-Ausgabe an den Pins 5 und 6 verwendet. Die anderen beiden Timer -Timer0
undTimer2
werden für die PWM-Ausgabe an den Pins 3, 9, 10, 11 verwendet.Es gibt also keine Arduino-Funktion für Timer-Interrupts. Aber es gibt einen Weg. Mit diesem Code können Sie den Timer-Interrupt aktivieren für
Timer2
:Ich habe diesen Code ohne Test geschrieben, daher ist es möglich, dass ich einen Fehler gemacht habe. Überprüfen Sie in diesem Fall das Datenblatt, S.156 .
Wenn Sie die Timerfrequenz (Prescaler) ändern möchten, ändern Sie einfach das Register
TCCR2A
. Weitere Informationen finden Sie im Datenblatt auf Seite 153. Wenn Sie jedoch die Frequenz des Timers ändern, ändern Sie auch die Frequenz des PWM-Signals an zwei Ausgangspins!quelle
Timer0
undTimer2
sind 8 Bit und nurTimer1
16 Bit.