- Material som krävs:
- Vad är avbrott och var du ska använda dem:
- Kretsschema och förklaring:
- Simulering av avbrott i PIC Microcontroller:
- Kodförklaring:
- Arbeta med PIC16F877A-avbrott:
I den här handledningen lär vi oss hur man använder ett externt avbrott i PIC Microcontroller och varför / var vi behöver dem. Detta är en del av sekvensen av PIC-handledning där vi började lära oss PIC-mikrokontroller från grunden; därför antar denna handledning att du är bekant med hur man programmerar en PIC MCU med MPLABX och hur man gränssnitt en LCD med PIC. Om inte, var snäll och fall tillbaka till deras respektive länkar och läs dem igenom, för jag kommer att hoppa över det mesta av den information som redan var täckt där.
Material som krävs:
- PIC16F877A Perf Board
- 16x2 LCD-skärm
- Tryckknapp
- Anslutande ledningar
- Brödbräda
- PicKit 3
Vad är avbrott och var du ska använda dem:
Innan vi går in i hur man programmerar PIC-mikrokontrolleravbrott, låt oss förstå vad ett avbrott egentligen är och var vi skulle behöva använda dem. Dessutom finns det många typer av avbrott i Microcontroller och PIC16F877A har cirka 15 av dem. Låt oss inte förvirra dem alla i vårt huvud för nu.
Så! vad är ett avbrott i mikrokontroller?
Som vi alla vet används mikrokontroller för att utföra en uppsättning fördefinierade (programmerade) aktiveringar som utlöser nödvändiga utgångar baserat på ingången. Men medan din Microcontroller är upptagen med att utföra en kod kod kan det finnas en nödsituation där andra delar av din kod behöver omedelbar uppmärksamhet. Denna andra kod som behöver omedelbar uppmärksamhet bör behandlas som ett avbrott.
Till exempel: Låt oss överväga att du spelar ditt favoritspel på din mobil och att styrenheten (antagande) inuti din telefon är upptagen med att kasta all grafik som behövs för att du ska kunna njuta av spelet. Men plötsligt ringer din flickvän till ditt nummer. Nu är det värsta som ska hända att din mobilkontroll för att försumma dina flickvänner ringer eftersom du är upptagen med att spela ett spel. För att förhindra att denna mardröm inträffar använder vi något som kallas avbrott.
Dessa avbrott kommer alltid att vara aktiva för att vissa specifika åtgärder ska hända och när de inträffar utför de en kodkod och återgår sedan till normal funktion. Denna kod kallas interrupt service routine (ISR). Ett praktiskt projekt där avbrott är obligatoriskt är ”Digital hastighetsmätare och vägmätarkrets med PIC Microcontroller”
I mikrokontroller finns det två huvudtyper av avbrott. De är External Interrupt och Internal Interrupt. De interna avbrotten inträffar inuti Microntroller för att utföra en uppgift, till exempel Timer Interrupts, ADC Interrupts etc.
Det externa avbrottet är det som kan utlösas av användaren. I det här programmet lär vi oss hur man använder ett externt avbrott genom att använda en tryckknapp för att utlösa ett avbrott. Vi kommer att använda en LCD för att visa siffror som ökar från 0 till 1000 och när ett avbrott utlöses bör vi meddela om det från Interrupt Service Routine ISR och sedan fortsätta tillbaka till att öka siffrorna.
Kretsschema och förklaring:
Kretsschemat för användning av PIC16F877-avbrott ges i bilden ovan. Du måste helt enkelt ansluta LCD-skärmen till PIC som vi gjorde i gränssnittet för LCD-handledning.
Nu för att ansluta avbrottsstiftet, bör vi titta på databladet för att veta vilken stift i PIC som används för extern avbrott. I vårt fall i n PIC16F877A den 33 : e stift RBO / INT används för externt avbrott. Du kan inte använda någon annan stift än denna stift. Pin-anslutningen för detta kretsschema visas i tabellen nedan.
S. nej: |
Pinkod |
Pin-namn |
Anslutna till |
1 |
21 |
RD2 |
RS på LCD |
2 |
22 |
RD3 |
E av LCD |
3 |
27 |
RD4 |
D4 på LCD |
4 |
28 |
RD5 |
D5 på LCD |
5 |
29 |
RD6 |
D6 på LCD |
6 |
30 |
RD7 |
D7 på LCD |
7 |
33 |
RBO / INT |
Tryckknapp |
Vi har aktiverat interna uppdragningsmotstånd på PORT B, därför kan vi direkt ansluta RB0-stiftet till jord via en tryckknapp. Så när denna stift blir LÅG utlöses ett avbrott.
Anslutningarna kan göras på en brödbräda enligt bilden nedan.
Om du har följt våra tutorials borde du ha bekant dig med detta Perf Board som jag har använt här. Om inte, behöver du inte tänka mycket på det, helt enkelt följa kretsschemat så får du saker att fungera.
Simulering av avbrott i PIC Microcontroller:
Simuleringen för detta projekt är gjord med Proteus.
När du simulerar projektet bör du se en sekvens med siffror som ökas på LCD-skärmen. Detta händer inne i huvudslingan och när tryckknappen trycks in ska LCD-skärmen visa att den har gått in i ISR. Du kan göra dina ändringar i koden och testa den här.
Kodförklaring:
Den fullständiga koden för detta projekt hittar du i slutet av denna handledning. Men programmet är uppdelat i viktiga bitar och förklaras nedan för din bättre förståelse.
Som alla program måste vi börja koden genom att definiera stiftkonfigurationen för de stift som vi använder i vårt program. Även här måste vi definiera att vi använder RB0 / INT som en extern avbrottsstift och inte som en ingångs- eller utgångsstift. Nedanstående kodrad möjliggör det interna uppdragningsmotståndet på port B genom att göra den 7: e biten till 0.
OPTION_REG = 0b00000000;
Sedan aktiverar vi de globala / perifera avbrotten och förklarar att vi använder RB0 som en extern avbrottsstift.
GIE = 1; // Aktivera Global Interrupt PEIE = 1; // Enable the Peripheral Interrupt INTE = 1; // Aktivera RB0 som extern avbrottsstift
När RB0-stiftet har definierats som ett externt avbrottsstift kommer varje externt avbrottsflagga INTF att bli 1 och koden inuti tomrumsavbrottsfunktionen kommer att köras eftersom Interrupt Service Routine (ISR) kommer att anropas.
ogiltigt avbrott ISR_exempel () {if (INTF == 1) // Extern avbrott upptäckt {Lcd_Clear (); Lcd_Set_Cursor (1,1); Lcd_Print_String ("Entered ISR"); INTF = 0; // rensa avbrottsflaggan efter att ha gjort det __delay_ms (2000); Lcd_Clear (); }}
Som du kan se har jag kallat avbrottsfunktionen som ISR_exempel. Du kan namnge det enligt dina önskemål. Inuti avbrottsfunktionen kommer vi att kontrollera om INTF-flaggan är hög och utföra nödvändiga åtgärder. Det är mycket viktigt att rensa avbrottsflaggan när du är klar med rutinen. Först då återgår programmet till ogiltig huvudfunktion. Denna rensning måste göras med programvara som använder linjen
INTF = 0; // rensa avbrottsflaggan efter att ha gjort det
Inuti huvudfunktionen ökar vi bara ett nummer för varje 500 ms och visar det på LCD-skärmen. Vi har ingen specifik linje för att kontrollera status för RB0-stiftet. Avbrottet förblir alltid aktivt och när tryckknappen trycks in hoppar den ur det ogiltiga huvudet och utför raderna i ISR.
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'); __fördröja_ms (500); nummer ++;
Arbeta med PIC16F877A-avbrott:
När du väl har förstått hur avbrottet fungerar kan du testa det på hårdvaran och fissa runt det. Detta program som ges här är ett mycket grundläggande exempel på extern avbrott där det bara ändrar displayen på LCD-skärmen när ett avbrott upptäcks.
Det fullständiga arbetet med projektet finns i videon nedan. Hoppas du förstod om avbrott och var / hur man använder dem. Om du är osäker kan du nå mig via forumen eller genom kommentarsektionen.