- Potrebni materiali:
- Kaj so prekinitve in kje jih uporabiti:
- Shema vezja in razlaga:
- Simulacija prekinitev v mikrokrmilniku PIC:
- Razlaga kode:
- Delovanje prekinitev PIC16F877A:
V tej vadnici bomo izvedeli, kako uporabljati zunanjo prekinitev v mikrokrmilniku PIC in zakaj / kje jih bomo potrebovali. To je del zaporedja vadnic PIC, v katerih smo se PIC mikrokrmilniki začeli učiti od začetka; zato ta vadnica predpostavlja, da ste seznanjeni s tem, kako programirati PIC MCU z uporabo MPLABX in kako povezati LCD s PIC. V nasprotnem primeru se vrnite na njihove povezave in jih preberite, saj bom preskočil večino informacij, ki so bile tam že zajete.
Potrebni materiali:
- PIC16F877A Perf Board
- LCD zaslon 16x2
- Pritisni gumb
- Povezovanje žic
- Odbor za kruh
- PicKit 3
Kaj so prekinitve in kje jih uporabiti:
Preden začnemo s programiranjem prekinitev mikrokrmilnika PIC, nam povejte, kaj je pravzaprav prekinitev in kje bi jih morali uporabiti. Poleg tega je v mikrokrmilniku veliko vrst prekinitev, PIC16F877A pa jih ima približno 15. Za zdaj si jih ne zamenjajmo vseh v glavi.
Torej! kaj je prekinitev v mikrokrmilnikih?
Kot vsi vemo, se mikrokrmilniki uporabljajo za izvajanje nabora vnaprej določenih (programiranih) aktivacij, ki na podlagi vhoda sprožijo potrebne izhode. Toda, medtem ko je vaš mikrokrmilnik zaposlen z izvajanjem enega dela kode, lahko pride do izrednih razmer, ko je treba drug del vaše kode nemudoma posvetiti pozornost. Ta drugi del kode, ki potrebuje takojšnjo pozornost, je treba obravnavati kot prekinitev.
Na primer: Upoštevajte, da igrate svojo najljubšo igro na mobilnem telefonu in da je krmilnik (predpostavka) v vašem telefonu zaseden z metanjem vse grafike, ki je potrebna za uživanje v igri. Ampak nenadoma tvoje dekle pokliče na tvojo številko. Zdaj se vam je najslabše zgodilo, da vaš mobilni upravljalec zanemari klic deklet, saj ste zasedeni z igro. Da bi preprečili to nočno moro, uporabljamo nekaj, kar imenujemo prekinitve.
Te prekinitve bodo vedno aktivne na seznamu za nekatera posebna dejanja in ko se pojavijo, izvršijo del kode in se nato vrnejo v normalno funkcijo. Ta del kode se imenuje prekinitvena rutina (ISR). Praktični projekt, pri katerem je prekinitev obvezna, je »Digitalni krogotok in števec kilometrov z uporabo mikrokrmilnika PIC«
V mikrokrmilnikih sta dve glavni vrsti prekinitev. So zunanja prekinitev in notranja prekinitev. Notranje prekinitve se pojavijo znotraj Microntrollerja za izvajanje naloge, na primer prekinitve s časovnikom, prekinitve ADC itd. Te prekinitve sproži programska oprema za dokončanje delovanja časovnika oziroma ADC.
Zunanja prekinitev je tista, ki jo lahko sproži uporabnik. V tem programu se bomo naučili uporabljati zunanjo prekinitev s pritiskom na gumb za sprožitev prekinitve. Z LCD-zaslonom bomo prikazali številke, ki se povečajo od 0 do 1000, in ko se sproži prekinitev, bi morali o tem obvestiti ISR Interrupt Service Rutine in nato nadaljevati s povečevanjem številk.
Shema vezja in razlaga:
Shema vezja za uporabo prekinitev PIC16F877 je podana na zgornji sliki. Preprosto morate LCD povezati s PIC, kot smo to storili pri vajah za povezovanje LCD.
Zdaj, da priključimo prekinitveni zatič, bi morali pogledati podatkovni list, da ugotovimo, kateri zatič PIC se uporablja za zunanje prekinitve. V našem primeru i n PIC16F877A 33 rd pin RBO / INT se uporablja za zunanjo prekinitev. Ne morete uporabiti nobenega drugega zatiča, razen tega. Pin-povezava za ta diagram vezja je prikazana v spodnji tabeli.
S. Št: |
PIN številka |
Pripnite ime |
Povezan z |
1. |
21. |
RD2 |
RS LCD |
2. |
22. |
RD3 |
E LCD |
3. |
27. |
RD4 |
D4 LCD |
4. |
28. |
RD5 |
D5 LCD |
5. |
29. |
RD6 |
D6 LCD |
6. |
30. |
RD7 |
D7 LCD |
7. |
33 |
RBO / INT |
Pritisni gumb |
Na PORT B smo omogočili notranje uporovne upore, zato lahko s pritiskom na tipko RB0 neposredno priključimo na maso. Torej, kadar bo ta pin NIZK, se bo sprožila prekinitev.
Povezave lahko izvedete na plošči za kruh, kot je prikazano spodaj.
Če ste sledili našim vadnicam, bi se morali seznaniti s to Perf Board, ki sem jo uporabil tukaj. V nasprotnem primeru vam ni treba veliko razmišljati o tem, preprosto sledite vezju in stvari bodo delovale.
Simulacija prekinitev v mikrokrmilniku PIC:
Simulacija za ta projekt je narejena z uporabo Proteusa.
Ko simulirate projekt, boste na LCD zaslonu videli zaporedje številk, ki se povečujejo. To se zgodi znotraj glavne zanke in vsakič, ko pritisnete tipko, mora LCD prikazati, da je vstopil v ISR. Lahko spremenite kodo in jo poskusite preizkusiti tukaj.
Razlaga kode:
Popolno kodo za ta projekt najdete na koncu te vadnice. Vendar je program razdeljen na pomembne dele in je za vaše boljše razumevanje razložen spodaj.
Kot vsi programi moramo tudi pri kodi začeti z definiranjem konfiguracije zatičev za zatiče, ki jih uporabljamo v našem programu. Tudi tu moramo določiti, da uporabljamo RB0 / INT kot zunanji prekinitveni zatič in ne kot vhodni ali izhodni zatič. Spodnja vrstica kode omogoča notranji vlečni-up upor na portB tako, da je 7 th bit kot 0.
OPTION_REG = 0b00000000;
Nato omogočimo prekinitve Global / Peripheral in izjavimo, da uporabljamo RB0 kot zunanji prekinitveni zatič.
GIE = 1; // Omogoči globalno prekinitev PEIE = 1; // omogoči periferno prekinitev INTE = 1; // Omogoči RB0 kot zunanji prekinitveni zatič
Ko je zatič RB0 definiran kot zunanji prekinitveni zatič, bo vsakič, ko bo nizka, zunanja zastavica prekinitve INTF postala 1 in koda znotraj funkcije prekinitve praznine se bo izvedla, odkar bo poklicana rutina prekinitvene storitve (ISR).
void interrupt ISR_example () {if (INTF == 1) // Zunanja prekinitev zaznana {Lcd_Clear (); Lcd_Set_Cursor (1,1); Lcd_Print_String ("Vnesen ISR"); INTF = 0; // počistite zastavico prekinitve, ko končate z njo __delay_ms (2000); Lcd_Clear (); }}
Kot lahko vidite, sem funkcijo prekinitve poimenoval ISR_example. Lahko ga poimenujete po svoji želji. Znotraj funkcije prekinitve bomo preverili, ali je zastavica INTF visoka in izvedli potrebna dejanja. Ko končate z rutino, je zelo pomembno, da počistite zastavico prekinitve. Šele nato se bo program vrnil v glavno funkcijo void. To čiščenje mora opraviti programska oprema, ki uporablja linijo
INTF = 0; // počistite zastavico prekinitve, ko končate z njo
Znotraj glavne funkcije le povečamo število za vsakih 500 ms in jo prikažemo na LCD zaslonu. Nimamo nobene posebne vrstice za preverjanje stanja zatiča RB0. Prekinitev bo vedno ostala aktivna in vsakič, ko pritisnete gumb, bo skočil iz praznega glavnega dela in izvede vrstice v ISR.
Lcd_Set_Cursor (2,1); Lcd_Print_String ("Znotraj glavne zanke"); Lcd_Set_Cursor (1,1); Lcd_Print_String ("Številka:"); Lcd_Print_Char (ch1 + '0'); Lcd_Print_Char (ch2 + '0'); Lcd_Print_Char (ch3 + '0'); Lcd_Print_Char (ch4 + '0'); __zakasnitev_ms (500); številka ++;
Delovanje prekinitev PIC16F877A:
Ko ste razumeli, kako deluje prekinitev, jo lahko preizkusite na strojni opremi in se z njo poigrate. Ta program, ki je naveden tukaj, je zelo osnovni primer zunanje prekinitve, kjer samo spremeni zaslon LCD, ko zazna prekinitev.
Celotno delovanje projekta najdete v spodnjem videoposnetku. Upam, da ste razumeli prekinitve in kje / kako jih uporabiti. Če dvomite, me lahko pokličete prek forumov ali v oddelku za komentarje.