- Nødvendige materialer:
- Hva er avbrudd og hvor du kan bruke dem:
- Kretsdiagram og forklaring:
- Simulering av avbrudd i PIC Microcontroller:
- Kode Forklaring:
- Arbeid av PIC16F877A avbryter:
I denne opplæringen vil vi lære hvordan du bruker et eksternt avbrudd i PIC Microcontroller og hvorfor / hvor vi trenger dem. Dette er en del av sekvensen av PIC Tutorials der vi begynte å lære PIC Microcontrollers fra bunnen av; Derfor forutsetter denne opplæringen at du er kjent med hvordan du programmerer en PIC MCU ved hjelp av MPLABX og hvordan du kobler en LCD til PIC. Hvis ikke, kan du falle tilbake til deres respektive lenker og lese dem gjennom, for jeg vil hoppe over det meste av informasjonen som allerede var dekket der.
Nødvendige materialer:
- PIC16F877A Perf Board
- 16x2 LCD-skjerm
- Trykknapp
- Koble ledninger
- Brødtavle
- PicKit 3
Hva er avbrudd og hvor du kan bruke dem:
Før vi går inn i hvordan du programmerer PIC-mikrocontrolleravbrudd, la oss forstå hva en Interrupt egentlig er, og hvor vi trenger å bruke dem. Videre er det mange typer avbrudd i Microcontroller, og PIC16F877A har omtrent 15 av dem. La oss ikke forvirre dem alle inn i hodet vårt for nå.
Så! hva er et avbrudd i mikrokontrollere?
Som vi alle vet brukes mikrokontrollere til å utføre et sett med forhåndsdefinerte (programmerte) aktiveringer som utløser de nødvendige utgangene basert på inngangen. Men mens Microcontroller er opptatt med å utføre ett stykke kode, kan det være en nødssituasjon der andre deler av koden din trenger øyeblikkelig oppmerksomhet. Denne andre koden som trenger øyeblikkelig oppmerksomhet, bør behandles som et avbrudd.
For eksempel: La oss vurdere at du spiller favorittspillet ditt på mobilen din, og kontrolleren (antagelse) inne i telefonen din er opptatt med å kaste all grafikken som trengs for at du skal kunne nyte spillet. Men plutselig ringer kjæresten din til nummeret ditt. Nå, det verste som skal skje er at mobilkontrolleren din forsømmer at venninnene dine ringer siden du er opptatt med å spille et spill. For å forhindre at dette marerittet skjer, bruker vi noe som kalles interrupts.
Disse avbruddene vil alltid være aktive oppføringer for at noen spesielle handlinger skal skje, og når de oppstår, utfører de et stykke kode og kommer deretter tilbake til normal funksjon. Denne koden kalles interrupt service routine (ISR). Et praktisk prosjekt der avbrudd er obligatorisk er "Digital hastighetsmåler og kilometertellerkrets ved bruk av PIC Microcontroller"
I mikrokontrollere er det to hovedtyper av avbrudd. De er eksternt avbrudd og internt avbrudd. Interne interrupts forekommer inne i Microntroller for å utføre en oppgave, for eksempel Timer Interrupts, ADC Interrupts etc.. Disse interrupts utløses av programvaren for å fullføre henholdsvis Timer-operasjonen eller ADC-operasjonen.
Den eksterne forstyrrelsen er den som kan utløses av brukeren. I dette programmet vil vi lære hvordan du bruker et eksternt avbrudd ved å bruke en trykknapp for å utløse et avbrudd. Vi vil bruke en LCD-skjerm for å vise tall som øker fra 0 til 1000, og når et avbrudd utløses, bør vi varsle om det fra Interrupt Service Routine ISR og deretter fortsette å øke numrene.
Kretsdiagram og forklaring:
Kretsskjemaet for bruk av PIC16F877 avbrudd er gitt i bildet ovenfor. Du må bare koble LCD-skjermen til PIC, slik vi gjorde i grensesnittet mellom LCD-opplæringen.
Nå for å koble til avbruddspinnen, bør vi se på databladet for å vite hvilken pinne av PIC som brukes til ekstern avbrudd. I vårt tilfelle i n PIC16F877A den 33 rd tapp RBO / INT anvendes til utvortes avbruddet. Du kan ikke bruke noen annen pin enn denne pin. Pin-tilkoblingen for dette kretsskjemaet er vist i tabellen nedenfor.
S. nei: |
PIN-kode |
Pin-navn |
Koblet til |
1 |
21 |
RD2 |
RS på LCD |
2 |
22 |
RD3 |
E av LCD |
3 |
27 |
RD4 |
D4 av LCD |
4 |
28 |
RD5 |
D5 av LCD |
5 |
29 |
RD6 |
D6 av LCD |
6 |
30 |
RD7 |
D7 av LCD |
7 |
33 |
RBO / INT |
Trykknapp |
Vi har aktivert interne trekkmotstander på PORT B, og derfor kan vi koble RB0-pinnen direkte til bakken via en trykknapp. Så når denne pinnen blir LAV, vil et avbrudd utløses.
Tilkoblingene kan gjøres på et brødbrett som vist nedenfor.
Hvis du har fulgt veiledningene våre, burde du ha blitt kjent med dette Perf Board som jeg har brukt her. Hvis ikke, trenger du ikke tenke mye på det, bare følg kretsskjemaet, så får du ting til å fungere.
Simulering av avbrudd i PIC Microcontroller:
Simuleringen for dette prosjektet er laget med Proteus.
Når du simulerer prosjektet, bør du se en sekvens av tall økes på LCD-skjermen. Dette skjer inne i hovedsløyfen, og når trykknappen trykkes, skal LCD-skjermen vise at den har inngått ISR. Du kan gjøre endringene i koden og prøve å teste den her.
Kode Forklaring:
Den komplette koden for dette prosjektet finner du på slutten av denne veiledningen. Programmet er imidlertid delt inn i viktige biter og forklart nedenfor for bedre forståelse.
Som alle programmer må vi begynne koden ved å definere pin-konfigurasjonen for pinnene vi bruker i programmet vårt. Også her må vi definere at vi bruker RB0 / INT som en ekstern avbruddspinne og ikke som en inngangs- eller utgangspinne. Den under kodelinje gjør det mulig for intern pull-up-motstand på PortB ved å gjøre 7 th bit som 0.
OPTION_REG = 0b00000000;
Deretter aktiverer vi de globale / perifere avbruddene og erklærer at vi bruker RB0 som en ekstern avbruddspinne.
GIE = 1; // Aktiver Global Interrupt PEIE = 1; // Aktiver perifer interrupt INTE = 1; // Aktiver RB0 som ekstern avbrytingspinne
Når RB0-pinnen er definert som en ekstern avbruddspinne, vil det eksterne avbruddsflagget INTF bli 1 til hver gang den blir lav, og koden i tomromsavbruddsfunksjonen blir utført siden Interrupt Service Routine (ISR) blir kalt.
ugyldig avbrudd ISR_eksempel () {hvis (INTF == 1) // Ekstern avbrudd oppdaget {Lcd_Clear (); Lcd_Set_Cursor (1,1); Lcd_Print_String ("Angitt ISR"); INTF = 0; // tøm avbruddsflagget etter ferdig med det __delay_ms (2000); Lcd_Clear (); }}
Som du kan se har jeg kalt avbruddsfunksjonen som ISR_eksempel. Du kan navngi det etter ønske. Inne i avbrytingsfunksjonen vil vi sjekke om INTF-flagget er høyt og utføre de nødvendige handlingene. Det er veldig viktig å fjerne avbruddsflagget når du er ferdig med rutinen. Først da går programmet tilbake til ugyldig hovedfunksjon. Denne ryddingen må gjøres med programvare som bruker linjen
INTF = 0; // fjern avbruddsflagget etter at du er ferdig med det
Inne i hovedfunksjonen øker vi bare et tall for hver 500 ms og viser det på LCD-skjermen. Vi har ingen spesifikk linje for å kontrollere statusen til RB0-pinnen. Avbruddet forblir alltid aktivt, og når trykknappen trykkes, hopper den ut av ugyldig hoved og utfører linjene 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'); __forsink_ms (500); nummer ++;
Arbeid av PIC16F877A avbryter:
Når du har forstått hvordan avbruddet fungerer, kan du prøve det på maskinvaren og fikle rundt det. Dette programmet som er gitt her er et veldig grunnleggende eksempel på ekstern avbrudd der det bare endrer visningen på LCD-skjermen når en avbrudd oppdages.
Hele arbeidet med prosjektet finner du i videoen nedenfor. Håper du forsto om avbrudd og hvor / hvordan du bruker dem. Hvis du er i tvil, kan du nå meg via forumene eller gjennom kommentarseksjonen.