Arbeiten Sie in diesem Teil des Tutorials werden wir über Interrupts sprechen z. B. mit der Theke. Interrupts verbessern die Verwendung von Mikrocontrollern in einem riesigen Weg. Interrupts machen Ihre Programme reagieren auf die Hardware der Mikrocontroller, die möglicherweise eine Reaktion aus dem Kreislauf außerhalb der Mikrocontroller.
In Grundbegriffe ist ein Interrupt genau das, was es heißt als. Es unterbricht eine laufende Programm Normalfluss um eine andere Aufgabe (andere Code-Block, die Sie programmieren) zu tun. Sagen Sie zum Beispiel Ihr Programm tut normale blinkenden LEDs und Sie wollen es auf einen PIR-Sensor (verbunden mit einem Interrupt-Pin) reagieren, und geht auf einen speziellen Code-Block ein akustisches Signal ertönen einem akustischen Signals mit einer anderen Pin verbunden machen. Wenn man den Mikrocontroller dazu sagt, stoppt das Programm tot und gehen Sie zu dem Code, der die den Interrupt (machen einen Signalton) gehört. Nach dem Interrupt Code ausgeführt wird, nimmt die gestoppten Programms genau, wo es aufgehört. In einigen Beispielen wäre unterbricht eine Alternative zum Abrufen, die Programm-Zyklen erfordern würde. Sagen Sie, dass Ihr Programm fehlt nur einen Signalton ausgibt, wenn jemand den PIR-Sensor geht. Ihr Programm könnte, dass der Stift zu sehen, ob es einen hohen Wert über und über in der nie endenden Schleife (während (1)) hat Tests zu halten. Alternativ entfernen Sie alle Polling-Programm-Code um die Pin für ein hoher Wert zu testen und den Interrupt, automatisch um die Beep-Code zu gelangen, wenn der Mikrocontroller den hohen Werten spürt.
Welche Arten von Interrupts gibt es für den AVR-Mikrocontroller? Interrupts können für Veranstaltungen wie z. B. eine Zählernummer, eine Pin ändern Zustand (von niedrig bis hoch oder umgekehrt) serielle Kommunikation empfangen von Informationen oder der Analog zu Digital, nachdem festgestellt wurde, dass eine Konvertierung festgelegt werden. Hier ist eine Liste von Interrupt-Vektoren, die Sie verwenden können. Weitere Tutorials zu machen verwenden von vielen dieser Vektoren.
Werden wir den Timer/Counter als Beispiel verwenden. Sagen wir den Timer/Counter eine Zahl, die die TCNT1 (Zähler) müssen übereinstimmen. Die Anzahl entsprechend gehen in ein Register OCR1A genannt (Ausgabe vergleichen Register). Die "1" steht für die spezifischen Zähler verwenden wir die 16-Bit-Version ist. Wir haben zwei OCR, das A und das B. Wir verwenden in diesem Beispiel A. Aber wissen wir, ob der Zähler auf Null zurückgesetzt wird, wenn die Übereinstimmung hergestellt ist? Wir wollen auf jeden Fall TCNT1 zurück auf Null gehen also der Graf startet über und wir bekommen ein weiteres Match bei unserer vorgesehenen Anzahl, aber dies ist nicht in Code, wie wir es letztes Mal gemacht (denken Sie daran die TCNT1 = 0;). Dieses Mal wollen wir einen anderen Schalter im TCCR1B Steuerelement Register genannt WGM12 einschalten (Waveform Generation Modus für Timer 1). Die #2 in diesen Switch stellt nur welche es ist, da gibt es ein paar, WGM. Wir werden auch die CS10 und CS11 wieder verwenden, um prescaling auf 64 wie das Intro video Timer eingestellt.
Dann wird der Timer/Counter müssen wissen, dass wir beabsichtigen, die Interrupt-Funktion verwenden. Dies geschieht durch die TIMSK (Timer/Counter Interrupt Maske Register). Wir müssen nur ein Schalter in diesem Register aktivieren: die OCIE1A (Ausgabe vergleichen A Match Interrupt aktivieren) Schalter. Einmal die Nummer setzen in der OCR1A durch den Leistungsindikator abgestimmt ist, wird das Programm unterbrochen werden, um die LED zu wechseln. Für ein Interrupt zu passieren müssen wir aktivieren, die globale Interrupts "sei()", dann müssen wir den Interrupt für die Timer/Counter zu aktivieren und schließlich die Interrupt-Service-Routine (ISR) erstellt werden müssen. Die Interrupt-Service-Routine ist ebenso wie die Funktionen, die in der Schaltfläche Spiel Beispiel vorgenommen wurden. Die Interrupt-Service-Routine ist nur einen Codeblock außerhalb der Haupt-Routine und beginnt mit dem ISR mit der Vektor in Klammern "(Vektor)", durch den Codeblock in Klammern "{Code}" erlaubt. Für die Timer/Counter (16-Bit-Version), und die Tatsache, dass wir mit die A-Version von der OCR1, Vektor heißt: TIMER1_COMPA_vect. So die Routine wäre: ISR(TIMER1_COMPA_vect) {Code zum Ausführen}. Wir verwendeten eine Reihe im Intro zu Timer-Video, das eine Sekunde vertreten: 15625, daher wir für die OCR1A verwenden. Aber die Zahl sollten Indizierung von 0, also wir die Anzahl 15624 stattdessen verwenden müssen.