- Potrebni materijali:
- Što su prekidi i gdje ih koristiti:
- Kružni dijagram i objašnjenje:
- Simulacija prekida u PIC mikrokontroleru:
- Objašnjenje koda:
- Rad prekida PIC16F877A:
U ovom uputstvu naučit ćemo kako koristiti vanjski prekid u PIC mikrokontroleru i zašto / gdje će nam trebati. Ovo je dio slijeda PIC tutorijala u kojima smo počeli ispočetka učiti PIC mikrokontrolere; stoga ovaj vodič pretpostavlja da ste upoznati s načinom programiranja PIC MCU-a pomoću MPLABX-a i kako povezati LCD s PIC-om. Ako ne, vratite se na njihove veze i pročitajte ih, jer ću preskočiti većinu informacija koje su tamo već bile pokrivene.
Potrebni materijali:
- PIC16F877A Perf ploča
- LCD zaslon od 16x2
- Pritisnite tipku
- Spajanje žica
- Daska za kruh
- PicKit 3
Što su prekidi i gdje ih koristiti:
Prije nego što počnemo s načinom programiranja prekida PIC mikrokontrolera, shvatimo što je zapravo prekid i gdje bismo ih trebali koristiti. Nadalje, u Microcontrolleru postoji puno vrsta prekida, a PIC16F877A ih ima oko 15. Nemojmo ih zasad sve zbuniti u glavi.
Tako! što je prekid u mikrokontrolerima?
Kao što svi znamo, mikrokontroleri se koriste za izvođenje skupa unaprijed definiranih (programiranih) aktivacija koje na temelju ulaza pokreću potrebne izlaze. No, dok je vaš mikrokontroler zauzet izvršavanjem jednog dijela koda, možda postoji hitna situacija u kojem drugi dio vašeg koda treba hitnu pozornost. Ovaj drugi dio koda kojem je potrebna hitna pažnja trebao bi se tretirati kao prekid.
Na primjer: Uzmimo u obzir da svoju omiljenu igru igrate na svom mobitelu, a kontroler (pretpostavka) u vašem telefonu zauzet je bacanjem svih grafika potrebnih za uživanje u igri. Ali, odjednom vas djevojka nazove na vaš broj. Sada je najgora stvar koja će se dogoditi da vaš mobilni kontroler zanemari poziv svojih djevojaka jer ste zauzeti igranjem igre. Da bismo spriječili da se dogodi ova noćna mora, koristimo nešto što se naziva prekidima.
Ti će prekidi uvijek biti aktivni na popisu da bi se dogodile neke određene radnje, a kada se dogode, izvršavaju komad koda i vraćaju se u normalnu funkciju. Taj se dio koda naziva rutina usluge prekida (ISR). Jedan praktični projekt u kojem je prekid obvezan je „Digitalni krug brzinomera i odometra pomoću PIC mikrokontrolera“
U mikrokontroleru postoje dvije glavne vrste prekida. Oni su vanjski prekid i unutarnji prekid. Interni prekidi javljaju se unutar Microntrollera za izvršavanje zadatka, na primjer Timer Interrupts, ADC Interrupts itd. Te prekide pokreće softver za dovršavanje radnje Timer odnosno ADC.
Vanjski prekid je onaj koji korisnik može pokrenuti. U ovom ćemo programu naučiti kako koristiti vanjski prekid pomoću gumba za pokretanje prekida. Upotrijebit ćemo LCD zaslon za prikaz brojeva koji se povećavaju od 0 do 1000, a kada se aktivira prekid, trebali bismo o tome obavijestiti iz ISR Interrupt Service Rutine, a zatim se vratiti na povećanje broja.
Kružni dijagram i objašnjenje:

Shema sklopa za korištenje prekida PIC16F877 dana je na gornjoj slici. Jednostavno morate povezati LCD s PIC-om kao što smo to učinili u udruživanju vodiča za LCD.
Sada da bismo povezali pin prekida, trebali bismo pogledati tablicu podataka kako bismo znali koji se pin PIC-a koristi za vanjski prekid. U našem slučaju ja n PIC16F877A 33 rd pin RBO / INT se koristi za vanjsku prekida. Ne možete koristiti nijednu drugu pribadaču osim ove pribadače. Pin-veza za ovaj dijagram sklopa prikazana je u donjoj tablici.
| S.Ne: | Pin broj | Naziv pribadače | Spojen na | 
| 1 | 21 | RD2 | RS LCD | 
| 2 | 22 | RD3 | E od LCD-a | 
| 3 | 27 | RD4 | D4 LCD-a | 
| 4 | 28 | RD5 | D5 LCD-a | 
| 5 | 29 | RD6 | D6 LCD-a | 
| 6 | 30 | RD7 | D7 LCD-a | 
| 7 | 33 | RBO / INT | Pritisnite tipku | 
Omogućili smo unutarnje otpornike na izvlačenje na PORTU B, tako da možemo pritisnuti tipku RB0 izravno na zemlju. Dakle, kad god ovaj pin dobije LOW, aktivirat će se prekid.
Veze se mogu uspostaviti na ploči za kruh, kao što je prikazano dolje.

Ako ste slijedili naše vodiče, trebali ste se upoznati s ovom Perf Boardom koju sam ovdje koristio. Ako ne, ne trebate puno razmišljati o tome, jednostavno slijedite shemu spojeva i sve će se raditi.
Simulacija prekida u PIC mikrokontroleru:
Simulacija za ovaj projekt napravljena je pomoću Proteusa.

Kada simulirate projekt, trebali biste vidjeti slijed brojeva koji se povećavaju na LCD zaslonu. To se događa unutar glavne petlje i kad god se pritisne tipka, LCD bi trebao prikazati da je ušao u ISR. Možete izvršiti svoje izmjene u kodu i pokušati ga testirati ovdje.
Objašnjenje koda:
Kompletni kod za ovaj projekt nalazi se na kraju ovog vodiča. Međutim, program je podijeljen na važne dijelove i objašnjen u nastavku za vaše bolje razumijevanje.
Kao i svi programi, i kod moramo započeti definiranjem konfiguracije pinova za pinove koje koristimo u našem programu. Također ovdje moramo definirati da koristimo RB0 / INT kao vanjski pin prekida, a ne kao ulazni ili izlazni pin. Donja linija koda omogućuje unutarnje pull-up otpornik na portB tako što je 7 -og jednako 0.
OPTION_REG = 0b00000000;

Tada omogućujemo globalne / periferne prekide i izjavljujemo da koristimo RB0 kao vanjski pin za prekide.
GIE = 1; // Omogući globalni prekid PEIE = 1; // Omogući periferni prekid INTE = 1; // Omogući RB0 kao vanjski prekidački pin
Jednom kada je RB0 pin definiran kao vanjski pin prekida, svaki put kad se smanji, vanjska zastavica prekida INTF postat će 1, a kôd unutar funkcije prekida prekida će se izvršiti budući da će se pozvati Rutina usluge prekida (ISR).
void interrupt ISR_example () {if (INTF == 1) // Otkriven vanjski prekid {Lcd_Clear (); Lcd_Set_Cursor (1,1); Lcd_Print_String ("Uneseni ISR"); INTF = 0; // obriši zastavicu prekida nakon što je gotovo __delay_ms (2000); Lcd_Clear (); }}
Kao što vidite, imenovao sam funkciju prekida ISR_example. Možete ga imenovati prema svojoj želji. Unutar funkcije prekida provjerit ćemo je li oznaka INTF visoka i izvršiti potrebne radnje. Vrlo je važno očistiti zastavicu prekida nakon što završite s rutinom. Tek tada program će se vratiti na glavnu funkciju void. To čišćenje mora izvršiti softver pomoću linije
INTF = 0; // obrišite zastavicu prekida nakon što završite s njom
Unutar glavne funkcije samo povećavamo broj za svakih 500 ms i prikazujemo ga na LCD zaslonu. Nemamo nikakvu posebnu liniju za provjeru statusa RB0 pina. Prekid će uvijek ostati aktivan i kad god se pritisne tipka, iskočit će iz praznine i izvršiti linije u ISR-u.
Lcd_Set_Cursor (2,1); Lcd_Print_String ("Unutar glavne petlje"); Lcd_Set_Cursor (1,1); Lcd_Print_String ("Broj:"); Lcd_Print_Char (ch1 + '0'); Lcd_Print_Char (ch2 + '0'); Lcd_Print_Char (ch3 + '0'); Lcd_Print_Char (ch4 + '0'); __zakasniti_ms (500); broj ++;
Rad prekida PIC16F877A:
Nakon što shvatite kako prekid funkcionira, možete ga isprobati na hardveru i petljati oko njega. Ovaj ovdje dani program vrlo je osnovni primjer vanjskog prekida gdje on samo mijenja prikaz LCD zaslona kad se prepozna prekid.

Kompletni rad projekta možete pronaći u video prilogu dolje. Nadam se da ste razumjeli o prekidima i gdje / kako ih koristiti. Ako sumnjate, možete me kontaktirati putem foruma ili putem odjeljka za komentare.

