- Reikalingos medžiagos:
- Kas yra pertraukimai ir kur juos naudoti:
- Grandinės schema ir paaiškinimas:
- PIC mikrovaldiklio pertraukimų modeliavimas:
- Kodo paaiškinimas:
- PIC16F877A pertraukimų veikimas:
Šioje pamokoje sužinosime, kaip naudoti išorinį pertraukimą PIC mikrovaldiklyje ir kodėl / kur mums jų reikės. Tai yra dalis PIC mokymo programų, kuriose pradėjome mokytis PIC mikrovaldiklių nuo nulio; taigi šioje pamokoje daroma prielaida, kad esate susipažinę su tuo, kaip programuoti PIC MCU naudojant MPLABX ir kaip susieti LCD su PIC. Jei ne, prašau grįžti prie jų atitinkamų nuorodų ir perskaityti jas, nes praleisiu didžiąją dalį informacijos, kuri jau buvo ten aprašyta.
Reikalingos medžiagos:
- PIC16F877A Perf Board
- 16x2 LCD ekranas
- Paspauskite mygtuką
- Laidų sujungimas
- Bandomoji Lenta
- „PicKit 3“
Kas yra pertraukimai ir kur juos naudoti:
Prieš pradėdami programuoti PIC mikrovaldiklių pertraukiklius, leiskite mums suprasti, kas iš tikrųjų yra pertraukimas ir kur juos turėtume naudoti. Be to, mikrovaldiklyje yra daugybė pertraukimų tipų, o PIC16F877A turi apie 15 iš jų. Kol kas nepainiokime jų visų į galvą.
Taigi! kas yra mikrovaldiklių pertraukimas?
Kaip mes visi žinome, mikrovaldikliai naudojami tam, kad būtų galima atlikti iš anksto nustatytų (užprogramuotų) aktyvinimų rinkinį, kuris, atsižvelgiant į įvestį, suaktyvina būtinus išėjimus. Tačiau, kol jūsų mikrovaldiklis yra užimtas vykdant vieną kodo dalį, gali kilti avarinė situacija, kai kitam jūsų kodo elementui reikia nedelsiant skirti dėmesio. Šis kitas kodo elementas, į kurį reikia nedelsiant atkreipti dėmesį, turėtų būti traktuojamas kaip pertraukimas.
Pvz.: Apsvarstykime, kad žaidžiate mėgstamą žaidimą mobiliajame telefone, o valdiklis (prielaida) jūsų telefone yra užimtas metant visą grafiką, kurios reikia, kad galėtumėte mėgautis žaidimu. Bet staiga tavo mergina paskambina tavo numeriu. Blogiausia, kas nutiko, kad jūsų mobiliųjų telefonų valdiklis nepaiso jūsų mergaičių skambučio, nes esate užsiėmęs žaidimu. Norėdami išvengti šio košmaro, mes naudojame tai, kas vadinama pertraukimais.
Šie pertraukimai visada bus aktyvūs kai kurių konkrečių veiksmų sąraše, ir jiems įvykus, jie įvykdys kodo dalį ir vėl grįš į įprastą funkciją. Ši kodo dalis vadinama pertraukimo tarnybos rutina (ISR). Vienas praktinis projektas, kurio pertraukimas yra privalomas, yra „Skaitmeninė spidometro ir odometro grandinė naudojant PIC mikrovaldiklį“
Mikrovaldikliuose yra du pagrindiniai pertraukimų tipai. Jie yra išorinis pertraukimas ir vidinis pertraukimas. Vidiniai pertraukimai įvyksta mikrovaldiklyje, kad būtų galima atlikti užduotį, pavyzdžiui, laikino pertraukimo, ADC pertraukimo ir pan. Šiuos pertraukimus programinė įranga suaktyvina, kad atitinkamai užbaigtų laikmačio arba ADC operaciją.
Išorinis pertraukimas yra tas, kurį gali sukelti vartotojas. Šioje programoje sužinosime, kaip naudoti išorinį pertraukimą, paspaudus mygtuką, kad sukeltumėte pertraukimą. Mes naudosime skystųjų kristalų ekraną, kad būtų rodomi skaičiai, didėjantys nuo 0 iki 1000, o kai įvyksta pertraukimas, turėtume apie tai pranešti iš „Interrupt Service Routine ISR“ ir tada tęsti skaičių didinimą.
Grandinės schema ir paaiškinimas:
PIC16F877 pertraukimų naudojimo schema pateikta aukščiau pateiktame paveikslėlyje. Paprasčiausiai turite prijungti skystųjų kristalų ekraną prie PIC, kaip mes darėme sąsajoje su LCD mokomąja medžiaga.
Dabar, norėdami prijungti pertraukimo kaištį, turėtume pažvelgti į duomenų lapą, kad žinotume, kuris PIC kaištis naudojamas išoriniam pertraukimui. Mūsų atveju i n PIC16F877A numatytus 33 RD kaištis RBO / INT yra naudojamas išorės nutraukti. Negalite naudoti jokių kitų kaiščių, išskyrus šį kaištį. Šios grandinės schemos kaiščių jungtis parodyta žemiau esančioje lentelėje.
S.Ne: |
PIN kodas |
PIN vardas |
Prisijungęs prie |
1 |
21 |
RD2 |
LCD ekranas |
2 |
22 |
RD3 |
LCD ekranas |
3 |
27 |
RD4 |
D4 skystųjų kristalų ekranas |
4 |
28 |
RD5 |
D5 skystųjų kristalų ekranas |
5 |
29 |
RD6 |
D6 skystųjų kristalų ekranas |
6 |
30 |
RD7 |
D7 skystųjų kristalų ekranas |
7 |
33 |
RBO / INT |
Paspauskite mygtuką |
Mes įgalinome vidinius traukimo rezistorius PORT B, taigi mes galime tiesiogiai prijungti RB0 kaištį prie žemės per mygtuką. Taigi, kai tik šis kaištis bus LOW, bus suaktyvintas pertraukimas.
Jungtis galima padaryti duonos lentoje, kaip parodyta žemiau.
Jei laikėtės mūsų pamokų, turėtumėte susipažinti su šia „Perf Board“, kurią čia naudojau. Jei ne, jums nereikia apie tai daug galvoti, tiesiog vadovaukitės grandinės schema ir viskas veiks.
PIC mikrovaldiklio pertraukimų modeliavimas:
Šio projekto modeliavimas atliekamas naudojant „Proteus“.
Kai imituosite projektą, LCD ekrane turėtumėte pamatyti skaičių sekos didėjimą. Tai atsitinka pagrindinėje kilpoje ir, kai tik paspaudžiamas mygtukas, LCD turi rodyti, kad jis pateko į ISR. Galite atlikti pakeitimus kode ir pabandyti jį išbandyti čia.
Kodo paaiškinimas:
Visą šio projekto kodą galite rasti šios pamokos pabaigoje. Tačiau programa yra padalyta į svarbius gabalus ir paaiškinta toliau, kad geriau suprastumėte.
Kaip ir visos programos, turime pradėti kodą apibrėždami kaiščių, kuriuos naudojame savo programoje, kaiščių konfigūraciją. Taip pat čia turime apibrėžti, kad mes naudojame RB0 / INT kaip išorinį pertraukimo kaištį, o ne kaip įvesties ar išvesties kaištį. Žemiau esanti kodo eilutė įgalina vidinį prisitraukimo rezistorių prievadą B paverčiant 7 -ąjį bitą lygiu 0.
PASIRINKIMAS_REG = 0b00000000;
Tada įgaliname visuotinius / periferinius pertraukimus ir pareiškiame, kad RB0 naudojame kaip išorinį pertraukimo kaištį.
GIE = 1; // Įgalinti visuotinį pertraukimą PEIE = 1; // Įgalinti periferinį pertraukimą INTE = 1; // Įjungti RB0 kaip išorinį pertraukimo kaištį
Kai RB0 kaištis bus apibrėžtas kaip išorinis pertraukimo kaištis, kiekvieną kartą, kai jis bus žemas, išorinio pertraukimo vėliava INTF taps 1, o tuštumos pertraukimo funkcijos kodas bus įvykdytas, nes bus iškviestas pertraukiamosios tarnybos režimas (ISR).
negaliojantis pertraukimas ISR_example () {if (INTF == 1) // Aptiktas išorinis pertraukimas {Lcd_Clear (); „Lcd_Set_Cursor“ (1,1); Lcd_Print_String ("Įvestas ISR"); INTF = 0; // išvalyti pertraukimo vėliavą, kai tai padaroma __delay_ms (2000); Lcd_Clear (); }}
Kaip matote, pertraukimo funkciją pavadinau ISR_example. Galite jį pavadinti pagal savo norą. Pertraukimo funkcijos viduje mes patikrinsime, ar INTF vėliava yra aukšta, ir atliksime reikiamus veiksmus. Labai svarbu išvalyti pertraukimo žymą, kai baigsite tvarką. Tik tada programa grįš į negaliojančią pagrindinę funkciją. Šį kliringą turi atlikti programinė įranga, naudodama liniją
INTF = 0; // išvalykite pertraukimo vėliavą, kai tai padarysite
Viduje pagrindinėje funkcijoje mes tiesiog padidiname skaičių už kiekvieną 500 ms ir parodome jį LCD ekrane. Mes neturime jokios konkrečios eilutės, skirtos patikrinti RB0 kaiščio būseną. Pertraukimas visada bus aktyvus ir, kai tik paspausite mygtuką, jis iššoks iš tuščio pagrindinio ir atliks ISR linijas.
„Lcd_Set_Cursor“ (2,1); Lcd_Print_String („Viduje pagrindinė kilpa“); „Lcd_Set_Cursor“ (1,1); Lcd_Print_String ("Skaičius:"); Lcd_Print_Char (ch1 + '0'); Lcd_Print_Char (ch2 + '0'); Lcd_Print_Char (ch3 + '0'); Lcd_Print_Char (ch4 + '0'); __delay_ms (500); skaičius ++;
PIC16F877A pertraukimų veikimas:
Kai suprasite, kaip veikia pertraukimas, galite tai išbandyti aparatinėje įrangoje ir smuikuoti aplink ją. Ši čia pateikta programa yra labai paprastas išorinio pertraukimo pavyzdys, kai ji tik pakeičia LCD ekrano ekraną, kai aptinkamas pertraukimas.
Visą projekto darbą galite rasti žemiau pateiktame vaizdo įraše. Tikimės, kad supratote apie pertraukimus ir kur / kaip juos naudoti. Jei turite kokių nors abejonių, galite susisiekti su manimi per forumus arba per komentarų skiltį.