- Erforderliche Materialien:
- Was sind Interrupts und wo werden sie verwendet?
- Schaltplan und Erklärung:
- Simulation von Interrupts im PIC-Mikrocontroller:
- Code Erläuterung:
- Funktionieren von PIC16F877A-Interrupts:
In diesem Tutorial erfahren Sie, wie Sie einen externen Interrupt in PIC Microcontroller verwenden und warum / wo wir ihn benötigen. Dies ist ein Teil der Abfolge von PIC-Tutorials, in denen wir begonnen haben, PIC-Mikrocontroller von Grund auf neu zu lernen. In diesem Tutorial wird daher davon ausgegangen, dass Sie mit dem Programmieren einer PIC-MCU mit MPLABX und dem Anschließen eines LCD mit PIC vertraut sind. Wenn nicht, greifen Sie bitte auf die jeweiligen Links zurück und lesen Sie sie durch, denn ich werde die meisten Informationen überspringen, die dort bereits behandelt wurden.
Erforderliche Materialien:
- PIC16F877A Perf Board
- 16x2 LCD-Anzeige
- Druckknopf
- Kabel anschließen
- Brotbrett
- PicKit 3
Was sind Interrupts und wo werden sie verwendet?
Bevor wir uns mit der Programmierung von PIC-Mikrocontroller-Interrupts befassen, sollten wir verstehen, was ein Interrupt tatsächlich ist und wo wir sie verwenden müssten. Darüber hinaus gibt es im Mikrocontroller viele Arten von Interrupts, und PIC16F877A verfügt über etwa 15 davon. Lassen Sie uns sie jetzt nicht alle in unseren Kopf verwirren.
Damit! Was ist ein Interrupt in Mikrocontrollern?
Wie wir alle wissen, werden Mikrocontroller verwendet, um eine Reihe vordefinierter (programmierter) Aktivierungen durchzuführen, die die erforderlichen Ausgänge basierend auf dem Eingang auslösen. Während Ihr Mikrocontroller mit der Ausführung eines Codeteils beschäftigt ist, kann es zu einer Notsituation kommen, in der ein anderes Codeteil sofortige Aufmerksamkeit benötigt. Dieser andere Code, der sofortige Aufmerksamkeit erfordert, sollte als Interrupt behandelt werden.
Beispiel: Nehmen wir an, Sie spielen Ihr Lieblingsspiel auf Ihrem Handy und der Controller (Annahme) in Ihrem Telefon ist damit beschäftigt, alle Grafiken zu werfen, die Sie benötigen, um das Spiel zu genießen. Aber plötzlich ruft deine Freundin deine Nummer an. Das Schlimmste, was passieren kann, ist, dass Ihr Handy-Controller den Anruf Ihrer Freundin vernachlässigt, da Sie gerade ein Spiel spielen. Um diesen Albtraum zu verhindern, verwenden wir sogenannte Interrupts.
Diese Interrupts sind immer eine aktive Liste für bestimmte Aktionen. Wenn sie auftreten, führen sie einen Code aus und kehren dann zur normalen Funktion zurück. Dieser Code wird als Interrupt Service Routine (ISR) bezeichnet. Ein praktisches Projekt, bei dem eine Unterbrechung obligatorisch ist, ist „Digitaler Tachometer und Kilometerzählerschaltung mit PIC-Mikrocontroller“.
In Mikrocontrollern gibt es zwei Haupttypen von Interrupts. Sie sind externer Interrupt und interner Interrupt. Die internen Interrupts treten im Microntroller auf, um eine Aufgabe auszuführen, z. B. Timer-Interrupts, ADC-Interrupts usw. Diese Interrupts werden von der Software ausgelöst, um den Timer-Vorgang bzw. den ADC-Vorgang abzuschließen.
Der externe Interrupt kann vom Benutzer ausgelöst werden. In diesem Programm lernen wir, wie man einen externen Interrupt verwendet, indem man einen Interrupt mit einem Druckknopf auslöst. Wir werden ein LCD verwenden, um Zahlen anzuzeigen, die von 0 auf 1000 inkrementiert werden. Wenn ein Interrupt ausgelöst wird, sollten wir dies von der Interrupt Service Routine ISR benachrichtigen und dann mit dem Inkrementieren der Zahlen fortfahren.
Schaltplan und Erklärung:
Das Schaltbild für die Verwendung von PIC16F877-Interrupts ist im obigen Bild dargestellt. Sie müssen lediglich das LCD mit dem PIC verbinden, wie wir es im Tutorial zum Anschließen von LCD getan haben.
Um nun den Interrupt-Pin zu verbinden, sollten wir uns das Datenblatt ansehen, um zu wissen, welcher Pin des PIC für den externen Interrupt verwendet wird. In unserem Fall i n PIC16F877A der 33 rd pin RBO / INT für externe Unterbrechung benutzt. Sie können keinen anderen Pin als diesen Pin verwenden. Die Pin-Verbindung für diesen Schaltplan ist in der folgenden Tabelle dargestellt.
S.No: |
PIN Nummer |
Pin Name |
Verbunden |
1 |
21 |
RD2 |
RS des LCD |
2 |
22 |
RD3 |
E des LCD |
3 |
27 |
RD4 |
D4 des LCD |
4 |
28 |
RD5 |
D5 des LCD |
5 |
29 |
RD6 |
D6 des LCD |
6 |
30 |
RD7 |
D7 des LCD |
7 |
33 |
RBO / INT |
Druckknopf |
Wir haben interne Pull-up-Widerstände an PORT B aktiviert, daher können wir den RB0-Pin über einen Druckknopf direkt mit Masse verbinden. Wenn dieser Pin LOW wird, wird ein Interrupt ausgelöst.
Die Verbindungen können wie unten gezeigt auf einem Brotbrett hergestellt werden.
Wenn Sie unseren Tutorials gefolgt sind, sollten Sie sich mit diesem Perf Board vertraut gemacht haben, das ich hier verwendet habe. Wenn nicht, müssen Sie nicht viel darüber nachdenken, folgen Sie einfach dem Schaltplan und Sie werden die Dinge zum Laufen bringen.
Simulation von Interrupts im PIC-Mikrocontroller:
Die Simulation für dieses Projekt wird mit Proteus erstellt.
Wenn Sie das Projekt simulieren, sollte auf dem LCD-Display eine Folge von Zahlen angezeigt werden. Dies geschieht innerhalb der Hauptschleife und jedes Mal, wenn der Druckknopf gedrückt wird, sollte das LCD anzeigen, dass es in ISR eingegeben wurde. Sie können Ihre Änderungen im Code vornehmen und versuchen, ihn hier zu testen.
Code Erläuterung:
Den vollständigen Code für dieses Projekt finden Sie am Ende dieses Tutorials. Das Programm ist jedoch in wichtige Abschnitte unterteilt und wird zum besseren Verständnis weiter unten erläutert.
Wie bei allen Programmen müssen wir den Code beginnen, indem wir die Pin-Konfiguration für die Pins definieren, die wir in unserem Programm verwenden. Auch hier müssen wir definieren, dass wir RB0 / INT als externen Interrupt-Pin und nicht als Eingangs- oder Ausgangspin verwenden. Die folgende Codezeile ermöglicht es den internen Pull-up - Widerstand auf PortB durch die 7 Herstellung von Th als 0 - Bit.
OPTION_REG = 0b00000000;
Dann aktivieren wir die globalen / peripheren Interrupts und erklären, dass wir RB0 als externen Interrupt-Pin verwenden.
GIE = 1; // Global Interrupt aktivieren PEIE = 1; // Peripheral Interrupt aktivieren INTE = 1; // RB0 als externen Interrupt-Pin aktivieren
Sobald der RB0-Pin als externer Interrupt-Pin definiert ist, wird jedes Mal, wenn er niedrig wird, das externe Interrupt-Flag INTF zu 1 und der Code innerhalb der Void-Interrupt-Funktion wird ausgeführt, da die Interrupt Service Routine (ISR) aufgerufen wird.
void Interrupt ISR_example () {if (INTF == 1) // Externer Interrupt erkannt {Lcd_Clear (); Lcd_Set_Cursor (1,1); Lcd_Print_String ("Entered ISR"); INTF = 0; // lösche das Interrupt-Flag, nachdem du damit fertig bist __delay_ms (2000); Lcd_Clear (); }}
Wie Sie sehen, habe ich die Interrupt-Funktion als ISR_example bezeichnet. Sie können es nach Ihren Wünschen benennen. Innerhalb der Interrupt-Funktion prüfen wir, ob das INTF-Flag hoch ist, und führen die erforderlichen Aktionen aus. Es ist sehr wichtig , das Interrupt-Flag zu löschen, wenn Sie mit der Routine fertig sind. Erst dann kehrt das Programm zur ungültigen Hauptfunktion zurück. Diese Löschung muss per Software über die Leitung erfolgen
INTF = 0; // lösche das Interrupt-Flag, nachdem du damit fertig bist
Innerhalb der Hauptfunktion erhöhen wir einfach alle 500 ms eine Zahl und zeigen sie auf dem LCD-Bildschirm an. Wir haben keine spezielle Leitung, um den Status des RB0-Pins zu überprüfen. Der Interrupt bleibt immer aktiv und springt jedes Mal, wenn der Druckknopf gedrückt wird, aus dem Leerlauf heraus und führt die Zeilen im ISR aus.
Lcd_Set_Cursor (2,1); Lcd_Print_String ("Inside Main Loop"); Lcd_Set_Cursor (1,1); Lcd_Print_String ("Number:"); Lcd_Print_Char (ch1 + '0'); Lcd_Print_Char (ch2 + '0'); Lcd_Print_Char (ch3 + '0'); Lcd_Print_Char (ch4 + '0'); __delay_ms (500); Nummer ++;
Funktionieren von PIC16F877A-Interrupts:
Sobald Sie verstanden haben, wie der Interrupt funktioniert, können Sie ihn auf der Hardware ausprobieren und herumspielen. Dieses hier gegebene Programm ist ein sehr einfaches Beispiel für einen externen Interrupt, bei dem nur die Anzeige des LCD-Bildschirms geändert wird, wenn ein Interrupt erkannt wird.
Die vollständige Arbeitsweise des Projekts finden Sie in dem unten angegebenen Video. Hoffentlich haben Sie die Interrupts verstanden und wissen, wo / wie sie verwendet werden. Wenn Sie irgendwelche Zweifel haben, können Sie mich über die Foren oder über den Kommentarbereich erreichen.