- Vereiste materialen:
- Wat zijn interrupts en waar kunt u ze gebruiken:
- Schakelschema en uitleg:
- Simulatie van onderbrekingen in PIC Microcontroller:
- Code Verklaring:
- De werking van PIC16F877A wordt onderbroken:
In deze tutorial zullen we leren hoe we een externe onderbreking in PIC Microcontroller kunnen gebruiken en waarom / waar we ze nodig hebben. Dit is een deel van de reeks PIC Tutorials waarin we PIC Microcontrollers vanaf nul begonnen te leren; daarom gaat deze tutorial ervan uit dat je bekend bent met hoe je een PIC MCU programmeert met MPLABX en hoe je een LCD met PIC verbindt. Zo niet, ga dan terug naar hun respectievelijke links en lees ze door, want ik zal de meeste informatie overslaan die daar al behandeld was.
Vereiste materialen:
- PIC16F877A Perf bord
- 16x2 LCD-scherm
- Druk op de knop
- Verbindingsdraden
- Broodplank
- PicKit 3
Wat zijn interrupts en waar kunt u ze gebruiken:
Voordat we ingaan op het programmeren van PIC-microcontroller-interrupts, moeten we eerst begrijpen wat een interrupt eigenlijk is en waar we ze zouden moeten gebruiken. Verder zijn er veel soorten interrupts in Microcontroller en PIC16F877A heeft er ongeveer 15. Laten we ze voorlopig niet allemaal in ons hoofd verwarren.
Zo! wat is een onderbreking in microcontrollers?
Zoals we allemaal weten, worden microcontrollers gebruikt om een reeks vooraf gedefinieerde (geprogrammeerde) activeringen uit te voeren die de noodzakelijke uitgangen activeren op basis van de invoer. Maar terwijl uw Microcontroller bezig is met het uitvoeren van een stuk code, kan er een noodsituatie zijn waarbij een ander stuk van uw code onmiddellijke aandacht vereist. Dit andere stuk code dat onmiddellijke aandacht vereist, moet worden behandeld als een onderbreking.
Bijvoorbeeld: laten we eens kijken dat u uw favoriete spel op uw mobiel speelt en dat de controller (aanname) in uw telefoon bezig is met het weergeven van alle afbeeldingen die u nodig heeft om van het spel te genieten. Maar plotseling belt je vriendin naar je nummer. Het ergste dat nu kan gebeuren, is dat de controller van uw mobiele telefoon de oproep van uw vriendinnen negeert omdat u bezig bent met het spelen van een game. Om deze nachtmerrie te voorkomen, gebruiken we iets dat we interrupts noemen.
Deze interrupts zullen altijd een actieve lijst zijn voor bepaalde acties die kunnen plaatsvinden en wanneer ze zich voordoen, voeren ze een stuk code uit en gaan dan terug naar de normale functie. Dit stuk code wordt de interruptserviceroutine (ISR) genoemd. Een praktisch project waarbij interrupt verplicht is, is "Digitale snelheidsmeter en kilometertellercircuit met behulp van PIC-microcontroller"
In microcontrollers zijn er twee hoofdtypen interrupts. Dit zijn externe onderbrekingen en interne onderbrekingen. De interne onderbrekingen vinden plaats in de Microntroller voor het uitvoeren van een taak, bijvoorbeeld Timer Interrupts, ADC Interrupts enz. Deze interrupts worden geactiveerd door de software om respectievelijk de Timer-bewerking of ADC-bewerking te voltooien.
De externe interrupt is degene die kan worden geactiveerd door de gebruiker. In dit programma zullen we leren hoe we een externe onderbreking kunnen gebruiken door een drukknop te gebruiken om een onderbreking te activeren. We zullen een LCD gebruiken om getallen weer te geven die oplopen van 0 tot 1000 en wanneer een onderbreking wordt geactiveerd, moeten we dit melden via de Interrupt Service Routine ISR en dan verdergaan met het verhogen van de nummers.
Schakelschema en uitleg:
Het schakelschema voor het gebruik van PIC16F877-interrupts wordt weergegeven in de bovenstaande afbeelding. U hoeft alleen maar het LCD-scherm op de PIC aan te sluiten, zoals we deden in de tutorial met de LCD-interface.
Om nu de interrupt-pin aan te sluiten, moeten we naar het gegevensblad kijken om te weten welke pin van de PIC wordt gebruikt voor externe interrupt. In ons geval i n PIC16F877A wordt de 33 ste pin RBO / INT gebruikt voor externe interrupt. U kunt geen andere pin gebruiken dan deze pin. De pin-aansluiting voor dit schakelschema wordt weergegeven in de onderstaande tabel.
S.Nee: |
Pincode |
Pin Naam |
Verbonden met |
1 |
21 |
RD2 |
RS van LCD |
2 |
22 |
RD3 |
E van LCD |
3 |
27 |
RD4 |
D4 van LCD |
4 |
28 |
RD5 |
D5 van LCD |
5 |
29 |
RD6 |
D6 van LCD |
6 |
30 |
RD7 |
D7 van LCD |
7 |
33 |
RBO / INT |
Druk op de knop |
We hebben interne pull-up weerstanden ingeschakeld op POORT B, daarom kunnen we de RB0-pin rechtstreeks met aarde verbinden via een drukknop. Dus wanneer deze pin LAAG wordt, wordt er een interrupt geactiveerd.
De aansluitingen kunnen worden gemaakt op een broodplank zoals hieronder weergegeven.
Als je onze tutorials hebt gevolgd, zou je bekend moeten zijn met dit Perf Board dat ik hier heb gebruikt. Als dit niet het geval is, hoeft u er niet veel over na te denken, volg gewoon het schakelschema en u zult de zaken laten werken.
Simulatie van onderbrekingen in PIC Microcontroller:
De simulatie voor dit project is gemaakt met Proteus.
Wanneer u het project simuleert, zou u een reeks getallen moeten zien die worden verhoogd op het LCD-scherm. Dit gebeurt in de hoofdlus en telkens wanneer de drukknop wordt ingedrukt, moet het LCD-scherm aangeven dat het in ISR is gegaan. U kunt uw wijzigingen in de code aanbrengen en deze hier testen.
Code Verklaring:
De volledige code voor dit project vindt u aan het einde van deze tutorial. Het programma is echter opgesplitst in belangrijke delen en hieronder uitgelegd voor een beter begrip.
Zoals alle programma's moeten we de code beginnen door de pinconfiguratie te definiëren voor de pinnen die we in ons programma gebruiken. Ook hier moeten we definiëren dat we RB0 / INT gebruiken als een externe interrupt-pin en niet als een invoer- of uitvoerpin. De onderstaande coderegel maakt de interne pull-up-weerstand op poort B mogelijk door de 7e bit als 0 te maken.
OPTION_REG = 0b00000000;
Vervolgens schakelen we de globale / perifere interrupts in en verklaren dat we RB0 gebruiken als een externe interrupt-pin.
GIE = 1; // Schakel Global Interrupt PEIE = 1 in; // Schakel de perifere onderbreking INTE = 1 in; // Schakel RB0 in als externe onderbrekingspin
Zodra de RB0-pin is gedefinieerd als een externe interrupt-pin, wordt elke keer dat deze laag wordt, de externe interruptvlag INTF 1 en wordt de code in de ongeldige interruptfunctie uitgevoerd omdat de Interrupt Service Routine (ISR) wordt aangeroepen.
void interrupt ISR_example () {if (INTF == 1) // Externe onderbreking gedetecteerd {Lcd_Clear (); Lcd_Set_Cursor (1,1); Lcd_Print_String ("Ingevoerd ISR"); INTF = 0; // wis de interruptvlag nadat je ermee klaar bent __delay_ms (2000); Lcd_Clear (); }}
Zoals je kunt zien, heb ik de interrupt-functie ISR_example genoemd. U kunt het naar wens een naam geven. Binnen de interrupt-functie zullen we controleren of de INTF-vlag hoog is en de benodigde acties uitvoeren. Het is erg belangrijk om de interruptvlag te wissen als u klaar bent met de routine. Alleen dan keert het programma terug naar de hoofdfunctie annuleren. Deze opruiming moet worden gedaan door software die de lijn gebruikt
INTF = 0; // wis de interruptvlag nadat je ermee klaar bent
Binnen de hoofdfunctie verhogen we gewoon een getal voor elke 500 ms en geven we het weer op het LCD-scherm. We hebben geen specifieke lijn om de status van de RB0-pin te controleren. De interrupt blijft altijd actief en telkens wanneer de drukknop wordt ingedrukt, springt hij uit de lege hoofdleiding en voert de lijnen in de ISR uit.
Lcd_Set_Cursor (2,1); Lcd_Print_String ("Inside Main Loop"); Lcd_Set_Cursor (1,1); Lcd_Print_String ("Nummer:"); Lcd_Print_Char (ch1 + '0'); Lcd_Print_Char (ch2 + '0'); Lcd_Print_Char (ch3 + '0'); Lcd_Print_Char (ch4 + '0'); __delay_ms (500); nummer ++;
De werking van PIC16F877A wordt onderbroken:
Als je eenmaal hebt begrepen hoe de interrupt werkt, kun je het uitproberen op de hardware en er wat aan doen. Dit programma dat hier wordt gegeven, is een heel eenvoudig voorbeeld van een externe onderbreking waarbij het alleen de weergave van het LCD-scherm verandert wanneer een onderbreking wordt gedetecteerd.
De volledige werking van het project is te vinden in de onderstaande video. Hoop dat je begreep over interrupts en waar / hoe je ze kunt gebruiken. Als je twijfelt, kun je me bereiken via de forums of via het commentaargedeelte.