Inhalt
- Was ist ein Interrupt in einem MicroController?
- Vektor unterbrechen
- Festgebundenes Ereignis
- Interrupt Enable Bit
- Flag-Bit unterbrechen
- Priorität unterbrechen
- Wie funktionieren Interrupts in MicroControllern?
- Allgemeine Vorgehensweise und Code zum Aufrufen eines Interrupts
- 1) Setzen Sie das Interrupt-Aktivierungsbit
- 2) Setzen Sie das Interrupt-Prioritätsbit
- 3) Wählen Sie den jeweiligen Interrupt-Vektor
- 4) Codieren Sie die gewünschte Operation
- 5) Deaktivieren Sie das Interrupt-Flag, wenn Sie die Funktion verlassen
- Arten von Interrupts
Der Autor schloss sein letztes Ingenieurjahrsprojekt mit den dsPic-Mikrocontrollern ab und erhielt umfassende Einblicke in diese Geräte.
Interrupts bilden das Rückgrat der Codierungsmethode in Mikrocontrollern, und ihr umfassendes Verständnis ist für Programmierer von entscheidender Bedeutung, die bereit sind, Codes auf Expertenebene zu erstellen. Dieses Tutorial enthält alle wichtigen Informationen, die Pic-Programmierer benötigen, um Interrupts in ihren Mikrocontroller-Codes und -Anwendungen zu verwenden.
Die Mikrocontroller-Codes der dsPic30f-Serie sowie die Entwicklungs-IDE MplabX des Microchips werden verwendet, um dieses Lernprogramm hier zu demonstrieren. Die gleiche Methode gilt jedoch für alle Pic-Mikrocontroller sowie für Mikrocontroller anderer Hersteller.
Benutzern wird empfohlen, relevante Datenblätter zu konsultieren, um genaue Register- und Bitnamen zu erhalten.
Was ist ein Interrupt in einem MicroController?
Interrupt kann im Allgemeinen als eine Funktion definiert werden, die beim Auftreten eines vordefinierten, fest verknüpften Ereignisses in einem Mikrocontroller und nicht durch einen normalen Funktionsaufruf ausgelöst wird.
Diese Funktion wird normalerweise als Interrupt Service Routine bezeichnet.
Alle Interrupts haben ihre Einzigartigkeit:
- Vektor unterbrechen.
- Vordefiniertes fest verknüpftes Ereignis.
- Interrupt-Aktivierungsbits im Interrupt-Aktivierungsregister.
- Interrupt-Flag-Bits im Interrupt-Flag-Register.
- Priorität unterbrechen.
Vektor unterbrechen
Alle Interrupts werden durch eine bestimmte definiert Interruptvektor das ist nur für diesen Interrupt einzigartig.
Festgebundenes Ereignis
Der Interrupt-Vektor ist anschließend fest mit dem Auftreten von a verbunden vordefiniertes Ereignis in einem Mikrocontroller für:
- Empfangen von Daten im UART-Datenpuffer.
- Daten auf dem CAN-Bus empfangen.
- Vergleichen Sie die Übereinstimmung der PWM-Registerwerte.
- Abschluss der ADC-Konvertierung.
- Viele weitere je nach Typ, Familie und Modell des Mikrocontrollers.
In einer Tabelle am Ende dieses Artikels sind einige Beispiele für diese fest verknüpften Interrupt-auslösenden Ereignisse aufgeführt.
Interrupt Enable Bit
Dieses Bit wird verwendet, um den Interrupt zu aktivieren. Ein Interrupt wird aktiviert, wenn dieses Bit auf Eins gesetzt ist, und deaktiviert, wenn dieser Bot auf Null gesetzt ist.
Flag-Bit unterbrechen
Immer wenn ein mit dem Interrupt verbundenes Ereignis auftritt, wird das Interrupt-Flag überprüft. Wenn der Interrupt 0 ist, wird der Interrupt ausgelöst. Wenn das Interrupt-Flag nicht auf Null gesetzt ist, wird der Interrupt nicht ausgelöst.
Priorität unterbrechen
Wenn mehr als ein Interrupt codiert werden soll, muss entschieden werden, welcher zuerst bedient wird, falls für beide ein Triggerereignis auftritt. Ein Interrupt-Prioritätsbit im Interrupt-Prioritätssteuerregister gibt die Priorität für den jeweiligen Interrupt an. Interrupt mit der höchsten Priorität, d. H. Sechs wird zuerst bedient.
Wie funktionieren Interrupts in MicroControllern?
Interrupts werden ausgelöst, wenn eines der Ereignisse auftritt, mit denen sie fest verknüpft sind, z. B. die oben erläuterten. Sie arbeiten in der folgenden Reihenfolge:
- Ein mit einem Interrupt verbundenes Ereignis tritt auf.
- Der Controller wird auf das Auftreten dieses Ereignisses aufmerksam und überprüft das Interrupt-Flag.
- Wenn ein Triggerereignis für mehr als einen Interrupt empfangen wird, wird die Interruptpriorität überprüft.
- Wenn das Interrupt-Flag gelöscht ist, wird es automatisch gesetzt und der Programmzähler bewegt sich zum jeweiligen Interrupt-Vektor mit der höchsten Priorität im Code.
- Der Code in der jeweiligen Interrupt-Funktion wird unterhalb des Interrupt-Vektors ausgeführt.
- Nachdem die Ausführung der Interrupt-Serviceroutine abgeschlossen ist, wird beim Verlassen der Routine ein Interrupt-Flag gelöscht.
- Das Mikrocontroller-Programm wird an derselben Stelle fortgesetzt, an der es gesprungen ist, um in die Interrupt-Serviceroutine einzutreten.
- Der Interrupt wird erneut ausgeführt, wenn das Ereignis erneut auftritt.
Allgemeine Vorgehensweise und Code zum Aufrufen eines Interrupts
Ein Interrupt kann folgendermaßen initialisiert werden:
1) Setzen Sie das Interrupt-Aktivierungsbit
Das Interrupt-Aktivierungsbit für den jeweiligen Interrupt muss zuerst aus dem Interrupt-Aktivierungsregister aktiviert werden, damit der Interrupt aktiviert und das Auftreten des jeweiligen fest verknüpften Ereignisses aktiviert wird, um den Interrupt auszulösen.
2) Setzen Sie das Interrupt-Prioritätsbit
Wenn in einem Code mehrere Interrupts verwendet werden sollen, können ihnen Prioritäten zugewiesen werden, basierend auf ihrer Wichtigkeit in der Anwendung, wobei die Interrupt-Prioritätsbits im Interrupt-Prioritätssteuerregister verwendet werden.
void Interrupt_Init (void) {IEC2bits.PWMIE = 1; IPC2bits.PWMIP = 1; } // Diese Funktion aktiviert das PWM-Interrupt-Aktivierungsbit im Register Interrupt Enable Control 2. // Diese Funktion kann im Hauptteil vor der while (1) -Schleife über einen normalen Funktionsaufruf aufgerufen werden. // Es ist besser, eine Interrupt-Initialisierungsfunktion zu verwenden, wenn mehrere Interrupts aktiviert werden sollen. // Es ist jedoch nicht erforderlich, diese Funktion zu verwenden, da der Befehl auch direkt in die Hauptfunktion geschrieben werden kann. // Die Interrupt-Priorität wird auf 1 (niedrigste) gesetzt.
3) Wählen Sie den jeweiligen Interrupt-Vektor
Wählen Sie den jeweiligen Interrupt-Vektor und platzieren Sie ihn in der Kopfzeile der Interrupt-Funktion oder Serviceroutine unterbrechen. Der folgende Code zeigt, wie aus dem Interrupt-Vektor eine Interrupt-Serviceroutine erstellt wird.
Eine Liste von Interruptvektoren finden Sie in diesem Artikel ebenfalls als Referenz.
void __attribute __ ((Interrupt, auto_psv)) _PWMInterrupt (void) {// dein Code hier IFS2bits.PWMIF = 0; } // Das Tag "_PWMInterrupt" ist der charakteristische Interrupt-Vektor in dieser Funktion. // Wenn Sie dies durch einen anderen Interrupt-Vektor ersetzen, ändert sich auch die Art des Interrupts.
4) Codieren Sie die gewünschte Operation
Die gewünschte Operation kann in der Interrupt-Funktion codiert werden.
5) Deaktivieren Sie das Interrupt-Flag, wenn Sie die Funktion verlassen
Beim Verlassen des Interrupts muss das jeweilige Interrupt-Flag gelöscht werden, damit der Interrupt erneut ausgelöst werden kann.
Arten von Interrupts
Je nach Typ, Familie und Modell können mehr als 50 Arten von Interrupts in Mikrocontrollern vorhanden sein, die von I2C-Interrupts, SPI-Interrupts, Quadraturcodierer-Interrupts und Timer-Interrupts reichen.
Einige der Interrupts in Pic-Mikrocontrollern sind in der folgenden Tabelle aufgeführt, um das Verständnis zu verbessern.
Name unterbrechen | Vektor unterbrechen | Stimulus auslösen |
---|---|---|
PWM-Interrupt | _PWMInterrupt | PWM-Vergleichsübereinstimmung zwischen Zeitbasisregister und Zählregister. |
ADC-Interrupt | _ADCInterrupt | ADC-Konvertierung abgeschlossen |
UART-Empfangsunterbrechung | _U2RXInterrupt | Empfangen von Daten im UART-Empfangsregister |
UART-Übertragungsunterbrechung | _U2TXInterrupt | Laden von Daten in das UART-Übertragungsregister |
Fehlerunterbrechung | _FLTAInterrupt | Änderung des Logikpegels am FLT-Pin |
Externer Interrupt | _INT3Interrupt | Änderung der Logikstufe an den Int0 / 1-Pins |
Niederspannungsunterbrechung | _LVDInterrupt | Niederspannung erkennen |
Dieser Artikel ist genau und nach bestem Wissen des Autors. Der Inhalt dient nur zu Informations- oder Unterhaltungszwecken und ersetzt nicht die persönliche Beratung oder professionelle Beratung in geschäftlichen, finanziellen, rechtlichen oder technischen Angelegenheiten.