- Nødvendige materialer:
- Hvad er afbrydelser, og hvor skal du bruge dem:
- Kredsløbsdiagram og forklaring:
- Simulering af afbrydelser i PIC Microcontroller:
- Kode Forklaring:
- Arbejde med PIC16F877A Interrupts:
I denne vejledning lærer vi, hvordan man bruger en ekstern afbrydelse i PIC Microcontroller, og hvorfor / hvor vi har brug for dem. Dette er en del af sekvensen af PIC Tutorials, hvor vi begyndte at lære PIC Microcontrollers fra bunden; derfor antager denne tutorial, at du er fortrolig med, hvordan du programmerer en PIC MCU ved hjælp af MPLABX, og hvordan du interfacer en LCD med PIC. Hvis ikke, skal du falde tilbage til deres respektive links og læse dem gennem, for jeg springer over de fleste af de oplysninger, der allerede var dækket der.
Nødvendige materialer:
- PIC16F877A Perf Board
- 16x2 LCD-skærm
- Trykknap
- Tilslutning af ledninger
- Brødbræt
- PicKit 3
Hvad er afbrydelser, og hvor skal du bruge dem:
Før vi går ind i, hvordan man programmerer PIC-mikrocontroller-afbrydelser, lad os forstå, hvad en Interrupt faktisk er, og hvor vi har brug for at bruge dem. Der er desuden mange typer afbrydelser i Microcontroller, og PIC16F877A har omkring 15 af dem. Lad os ikke forveksle dem alle ind i vores hoved for nu.
Så! hvad er en afbrydelse i mikrokontrollere?
Som vi alle ved, bruges mikrocontrollere til at udføre et sæt foruddefinerede (programmerede) aktiveringer, der udløser de nødvendige output baseret på input. Men mens din Microcontroller er optaget af at udføre et stykke kode, kan der være en nødsituation, hvor andet stykke af din kode har brug for øjeblikkelig opmærksomhed. Dette andet stykke kode, der kræver øjeblikkelig opmærksomhed, skal behandles som en afbrydelse.
For eksempel: Lad os overveje, at du spiller dit yndlingsspil på din mobil, og at controlleren (antagelse) inde i din telefon har travlt med at kaste al den grafik, der er nødvendig for at du kan nyde spillet. Men pludselig ringer din kæreste til dit nummer. Nu er det værste, der skal ske, at din mobiltelefoncontroller forsømmer dine venindes opkald, da du har travlt med at spille et spil. For at forhindre, at dette mareridt sker, bruger vi noget, der kaldes interrupts.
Disse afbrydelser vil altid være aktive på listen for at bestemte handlinger skal ske, og når de opstår, udfører de et stykke kode og vender derefter tilbage til den normale funktion. Dette stykke kode kaldes interrupt service routine (ISR). Et praktisk projekt, hvor afbrydelse er obligatorisk, er "Digital Speedometer og kilometertællerkredsløb ved hjælp af PIC Microcontroller"
I mikrokontrollere er der to hovedtyper af afbrydelser. De er ekstern afbrydelse og intern afbrydelse. De interne interrupts forekommer inde i Microntroller til at udføre en opgave, for eksempel Timer Interrupts, ADC Interrupts osv. Disse interrupts udløses af softwaren til at fuldføre henholdsvis Timer-operationen eller ADC-operationen.
Den eksterne afbrydelse er den, der kan blive udløst af brugeren. I dette program lærer vi, hvordan man bruger en ekstern afbrydelse ved at bruge en trykknap til at udløse en afbrydelse. Vi bruger et LCD-display til at vise numre, der øges fra 0 til 1000, og når en afbrydelse udløses, skal vi underrette om det fra Interrupt Service Routine ISR og derefter fortsætte tilbage med at inkrementere numrene.
Kredsløbsdiagram og forklaring:
Kredsløbsdiagrammet til brug af PIC16F877 afbrydelser er vist i ovenstående billede. Du skal simpelthen forbinde LCD'et til PIC, som vi gjorde i grænsefladen mellem LCD-tutorial.
For at forbinde afbrydelsesstiften skal vi se på databladet for at vide, hvilken stift af PIC der bruges til ekstern afbrydelse. I vores tilfælde i n PIC16F877A 33 rd pin RBO / INT anvendes til eksterne afbryder. Du kan ikke bruge nogen anden pin end denne pin. Pin-forbindelsen til dette kredsløbsdiagram er vist i nedenstående tabel.
S. nej: |
Pinkode |
Pin-navn |
Forbundet til |
1 |
21 |
RD2 |
RS på LCD |
2 |
22 |
RD3 |
E af LCD |
3 |
27 |
RD4 |
D4 af LCD |
4 |
28 |
RD5 |
D5 af LCD |
5 |
29 |
RD6 |
D6 af LCD |
6 |
30 |
RD7 |
D7 af LCD |
7 |
33 |
RBO / INT |
Trykknap |
Vi har aktiveret interne pull up-modstande på PORT B, og derfor kan vi forbinde RB0-stiften direkte til jorden via en trykknap. Så når denne pin bliver LAV, udløses et afbrydelse.
Forbindelserne kan foretages på et brødbræt som vist nedenfor.
Hvis du har fulgt vores tutorials, skulle du have gjort dig bekendt med dette Perf Board, som jeg har brugt her. Hvis ikke, behøver du ikke tænke meget over det, bare følg kredsløbsdiagrammet, så får du tingene til at fungere.
Simulering af afbrydelser i PIC Microcontroller:
Simuleringen til dette projekt er lavet ved hjælp af Proteus.
Når du simulerer projektet, skal du se en række af numre, der øges på LCD-skærmen. Dette sker inde i hovedsløjfen, og når der trykkes på trykknappen, skal LCD-displayet vise, at det er kommet ind i ISR. Du kan foretage dine ændringer i koden og prøve at teste den her.
Kode Forklaring:
Den komplette kode for dette projekt kan findes i slutningen af denne vejledning. Men programmet er opdelt i vigtige bidder og forklaret nedenfor for din bedre forståelse.
Som alle programmer er vi nødt til at begynde koden ved at definere pin-konfigurationen for de ben, som vi bruger i vores program. Også her skal vi definere, at vi bruger RB0 / INT som en ekstern afbrydelsesstift og ikke som en indgangs- eller udgangsstift. Nedenstående linje kode gør det muligt for intern pull-up modstand på PortB ved at gøre 7 th bit som 0.
OPTION_REG = 0b00000000;
Derefter aktiverer vi de globale / perifere afbrydelser og erklærer, at vi bruger RB0 som en ekstern afbrydelsesstift.
GIE = 1; // Aktiver Global Interrupt PEIE = 1; // Aktivér den perifere afbrydelse INTE = 1; // Aktivér RB0 som ekstern Interrupt pin
Når RB0-stiften er defineret som en ekstern afbrydelsesstift, bliver det eksterne afbrydelsesflag INTF hver gang den bliver lav, og koden inden for tomrumsafbrydelsesfunktionen bliver udført, da Interrupt Service Routine (ISR) kaldes.
ugyldig afbrydelse ISR_eksempel () {hvis (INTF == 1) // Ekstern afbrydelse registreret {Lcd_Clear (); Lcd_Set_Cursor (1,1); Lcd_Print_String ("Indtastet ISR"); INTF = 0; // ryd afbrydelsesflaget efter færdig med det __delay_ms (2000); Lcd_Clear (); }}
Som du kan se, har jeg navngivet afbrydelsesfunktionen som ISR_eksempel. Du kan navngive det efter dit ønske. Inde i afbrydelsesfunktionen kontrollerer vi, om INTF-flagget er højt og udfører de nødvendige handlinger. Det er meget vigtigt at rydde afbrydelsesflagget, når du er færdig med rutinen. Først derefter vender programmet tilbage til ugyldig hovedfunktion. Denne clearing skal udføres ved hjælp af software, der bruger linjen
INTF = 0; // ryd afbrydelsesflaget efter færdig med det
Inde i hovedfunktionen øger vi bare et tal for hver 500 ms og viser det på LCD-skærmen. Vi har ikke nogen specifik linje til at kontrollere status for RB0-stiften. Afbrydelsen forbliver altid aktiv, og når der trykkes på trykknappen, hopper den ud af det ugyldige hoved og udfører linjerne i ISR.
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'); __forsink_ms (500); nummer ++;
Arbejde med PIC16F877A Interrupts:
Når du først har forstået, hvordan afbrydelsen fungerer, kan du prøve det på hardwaren og fikle rundt om det. Dette program, der er givet her, er et meget grundlæggende eksempel på ekstern afbrydelse, hvor det bare ændrer displayet på LCD-skærmen, når en afbrydelse registreres.
Den komplette bearbejdning af projektet kan findes i videoen nedenfor. Håber du forstod om afbrydelser og hvor / hvordan du bruger dem. Hvis du er i tvivl, kan du nå mig gennem foraene eller gennem kommentarsektionen.