- Nepieciešamie materiāli:
- Kas ir pārtraukumi un kur tos izmantot:
- Shēmas shēma un skaidrojums:
- Pārtraukumu simulācija PIC mikrokontrollerī:
- Koda skaidrojums:
- PIC16F877A pārtraukumu darbība:
Šajā apmācībā mēs uzzināsim, kā izmantot ārējo traucējumu PIC mikrokontrollerī un kāpēc / kur mums tie būs nepieciešami. Šī ir daļa no PIC apmācību secības, kurā mēs sākām mācīties PIC mikrokontrollerus no jauna; tāpēc šajā apmācībā tiek pieņemts, ka esat iepazinies ar to, kā programmēt PIC MCU, izmantojot MPLABX, un kā saskarni veidot LCD ar PIC. Ja nē, lūdzu, atgriezieties pie viņu attiecīgajām saitēm un izlasiet tās, jo es izlaidīšu lielāko daļu informācijas, kas tur jau bija ietverta.
Nepieciešamie materiāli:
- PIC16F877A Perf Board
- 16x2 LCD displejs
- Uzspied pogu
- Vadu savienošana
- Maizes dēlis
- PicKit 3
Kas ir pārtraukumi un kur tos izmantot:
Pirms sākat programmēt PIC mikrokontrolleru pārtraukumus, ļaujiet mums saprast, kas patiesībā ir pārtraucējs un kur mums tie būtu jāizmanto. Turklāt mikrokontrollerī ir daudz dažādu veidu traucējumu, un PIC16F877A ir apmēram 15 no tiem. Tagad nejauksim tos visus savā galvā.
Tātad! kāds ir mikrokontrolleru pārtraukums?
Kā mēs visi zinām, mikrokontrolleri tiek izmantoti, lai veiktu iepriekš definētu (ieprogrammētu) aktivizāciju kopumu, kas, pamatojoties uz ievadi, aktivizē nepieciešamos rezultātus. Bet, kamēr jūsu mikrokontrolleris ir aizņemts ar viena koda daļas izpildi, var būt ārkārtas situācija, kad citai koda daļai nepieciešama tūlītēja uzmanība. Šis cits koda fragments, kam jāpievērš tūlītēja uzmanība, jāuzskata par pārtraukumu.
Piemēram: Ļaujiet mums padomāt, ka jūs spēlējat savu iecienīto spēli mobilajā tālrunī, un tālrunī esošais kontrolieris (pieņēmums) ir aizņemts, izmetot visu grafiku, kas nepieciešama spēles izbaudīšanai. Bet pēkšņi jūsu draudzene zvana uz jūsu numuru. Tagad vissliktākais, kas notiek, ir tas, ka mobilo ierīču kontrolieris atstāj novārtā draudzenes zvanu, jo esat aizņemts spēlējot spēli. Lai novērstu šo murgu, mēs izmantojam kaut ko tādu, ko sauc par pārtraukumiem.
Šie pārtraukumi vienmēr būs aktīvs saraksts ar dažām konkrētām darbībām, un, kad tie notiek, viņi izpilda koda daļu un pēc tam atgriežas pie normālās funkcijas. Šo koda fragmentu sauc par pārtraukšanas pakalpojuma rutīnu (ISR). Viens praktisks projekts, kurā pārtraukums ir obligāts, ir “Digitālā spidometra un odometra shēma, izmantojot PIC mikrokontrolleru”
Mikrokontrolleros ir divi galvenie pārtraukumu veidi. Tie ir ārējie traucējumi un iekšējie traucējumi. Iekšējie pārtraukumi notiek mikrokontrollera iekšpusē, lai veiktu uzdevumu, piemēram, taimera pārtraukumi, ADC pārtraukumi utt. Šos pārtraukumus programmatūra aktivizē, lai attiecīgi pabeigtu taimera darbību vai ADC darbību.
Ārējais pārtraukums ir tāds, kuru var aktivizēt lietotājs. Šajā programmā mēs iemācīsimies izmantot ārēju pārtraukumu, izmantojot spiedpogu, lai aktivizētu pārtraukumu. Mēs izmantosim LCD, lai parādītu skaitļus, kas palielinās no 0 līdz 1000, un, kad tiek aktivizēts pārtraukums, mums par to jāpaziņo no Interrupt Service Routine ISR un tad jāturpina skaitļu palielināšana.
Shēmas shēma un skaidrojums:
Ķēdes shēma PIC16F877 pārtraukumu izmantošanai ir dota iepriekš redzamajā attēlā. Jums vienkārši jāpieslēdz LCD ar PIC, kā mēs to darījām, saskaroties ar LCD apmācību.
Tagad, lai savienotu pārtraukuma tapu, mums vajadzētu apskatīt datu lapu, lai uzzinātu, kura PIC tapa tiek izmantota ārējam pārtraukumam. Mūsu gadījumā es n PIC16F877A 33 rd pin RBO / INT tiek izmantoti ārējās pārtraukt. Jūs nevarat izmantot nevienu citu piespraudes, izņemot šo tapu. Šīs ķēdes shēmas tapu savienojums ir parādīts zemāk esošajā tabulā.
S.Nē: |
PIN kods |
Piespraudes nosaukums |
Savienots ar |
1 |
21 |
RD2 |
LCD LCD |
2 |
22 |
RD3 |
LCD ekrāns |
3 |
27 |
RD4 |
LCD D4 |
4 |
28 |
RD5 |
LCD D5 |
5 |
29 |
RD6 |
LCD D6 |
6 |
30 |
RD7 |
LCD D7 |
7 |
33 |
RBO / INT |
Uzspied pogu |
Mēs esam iespējojuši PORT B iekšējos pievilkšanas rezistorus, tādējādi mēs varam tieši savienot RB0 tapu ar zemi, izmantojot spiedpogu. Tātad ikreiz, kad šī tapa kļūst LOW, tiks aktivizēts pārtraukums.
Savienojumus var veikt uz maizes dēļa, kā parādīts zemāk.
Ja esat sekojis mūsu apmācībām, jums vajadzētu iepazīties ar šo Perf Board, kuru esmu šeit izmantojis. Ja nē, jums par to nav daudz jādomā, vienkārši sekojiet shēmai un viss darbosies.
Pārtraukumu simulācija PIC mikrokontrollerī:
Šī projekta simulācija tiek veikta, izmantojot Proteus.
Simulējot projektu, LCD displejā vajadzētu redzēt skaitļu secību, kas tiek palielināta. Tas notiek galvenajā cilpā, un ikreiz, kad tiek nospiesta spiedpoga, LCD displejā jāparāda, ka tas ir ievadīts ISR. Jūs varat veikt izmaiņas kodā un mēģināt to pārbaudīt šeit.
Koda skaidrojums:
Pilns šī projekta kods ir atrodams šīs apmācības beigās. Tomēr programma ir sadalīta svarīgos gabalos un skaidrota tālāk, lai jūs labāk saprastu.
Tāpat kā visām programmām, arī mums ir jāsāk kods, nosakot tapu konfigurāciju tapām, kuras mēs izmantojam mūsu programmā. Arī šeit mums ir jādefinē, ka mēs izmantojam RB0 / INT kā ārēju pārtraukuma tapu, nevis kā ievades vai izejas tapu. Turpmāk koda rindiņa ļauj iekšējo pull-up rezistors par portB padarot 7 th tikpat 0.
OPTION_REG = 0b00000000;
Tad mēs iespējojam globālos / perifēros traucējumus un paziņojam, ka mēs izmantojam RB0 kā ārēju pārtraukuma tapu.
GIE = 1; // Iespējot globālo pārtraukumu PEIE = 1; // Iespējot perifēro traucējumu INTE = 1; // Iespējot RB0 kā ārējo pārtraucošo tapu
Kad RB0 tapa ir definēta kā ārējā pārtraukuma tapa, katru reizi, kad tā kļūst zema, ārējā pārtraukuma karodziņš INTF kļūs par 1 un kods tukšuma pārtraukšanas funkcijas iekšpusē tiks izpildīts, jo tiks izsaukta pārtraucošā servisa kārtība (ISR).
void break ISR_example () {if (INTF == 1) // Tika konstatēts ārējs pārtraukums {Lcd_Clear (); Lcd_Set_Cursor (1,1); Lcd_Print_String ("Ievadīts ISR"); INTF = 0; // notīrīt pārtraukuma karodziņu pēc tam, kad tas ir izdarīts __delay_ms (2000); Lcd_Clear (); }}
Kā redzat, pārtraukuma funkciju esmu nosaucis kā ISR_example. Jūs to varat nosaukt atbilstoši savai vēlmei. Pārtraukšanas funkcijas iekšpusē mēs pārbaudīsim, vai INTF karogs ir augsts, un veiksim nepieciešamās darbības. Kad esat pabeidzis kārtību, ir ļoti svarīgi notīrīt pārtraukuma karodziņu. Tikai pēc tam programma atgriezīsies pie tukšās galvenās funkcijas. Šī tīrīšana jāveic programmatūrai, izmantojot līniju
INTF = 0; // notīriet pārtraukuma karodziņu, kad esat to izdarījis
Pamatfunkcijas iekšpusē mēs vienkārši palielinām skaitli par katrām 500 ms un parādām to LCD ekrānā. Mums nav konkrētas līnijas, lai pārbaudītu RB0 tapas statusu. Pārtraukums vienmēr paliks aktīvs, un ikreiz, kad tiek nospiesta spiedpoga, tas izlec no tukšās maģistrāles un izpilda līnijas ISR.
Lcd_Set_Cursor (2,1); Lcd_Print_String ("Inside Main Loop"); Lcd_Set_Cursor (1,1); Lcd_Print_String ("Skaitlis:"); Lcd_Print_Char (ch1 + '0'); Lcd_Print_Char (ch2 + '0'); Lcd_Print_Char (ch3 + '0'); Lcd_Print_Char (ch4 + '0'); __kavēšanās_ms (500); skaitlis ++;
PIC16F877A pārtraukumu darbība:
Kad esat sapratis, kā notiek pārtraukums, varat to izmēģināt aparatūrā un vijoties ap to. Šī šeit sniegtā programma ir ļoti vienkāršs ārējā pārtraukuma piemērs, kad tā vienkārši maina LCD ekrāna displeju, kad tiek konstatēts pārtraukums.
Pilnīga projekta darbība ir atrodama zemāk esošajā videoklipā. Ceru, ka sapratāt par pārtraukumiem un kur / kā tos izmantot. Ja jums ir kādas šaubas, varat ar mani sazināties, izmantojot forumus vai komentāru sadaļu.