- Potrebné materiály:
- Čo sú to prerušenia a kde ich použiť:
- Schéma zapojenia a vysvetlenie:
- Simulácia prerušenia v mikrokontroléri PIC:
- Vysvetlenie kódu:
- Fungovanie prerušenia PIC16F877A:
V tomto výučbe sa dozvieme, ako používať externé prerušenie v mikrokontroléri PIC a prečo / kde ich budeme potrebovať. Toto je časť postupnosti PIC tutoriálov, v ktorých sme sa začali od nuly učiť mikrokontroléry PIC; preto tento tutoriál predpokladá, že ste oboznámení s tým, ako programovať PIC MCU pomocou MPLABX a ako prepojiť LCD s PIC. Pokiaľ nie, vráťte sa prosím k ich príslušným odkazom a prečítajte si ich prostredníctvom žľabu, pretože preskočím väčšinu informácií, ktoré tam už boli obsiahnuté.
Potrebné materiály:
- PIC16F877A Perf Board
- 16 x 2 LCD displej
- Tlačidlo
- Pripojenie drôtov
- Chlebová doska
- PicKit 3
Čo sú to prerušenia a kde ich použiť:
Predtým, ako sa pustíme do programovania prerušení mikrokontroléra PIC, pochopme, čo to vlastne prerušenie je a kde by sme ich potrebovali použiť. Ďalej existuje veľa druhov prerušenia v mikrokontroléri a PIC16F877A ich má asi 15. Nezamieňajme si ich zatiaľ všetky do hlavy.
Takže! čo je prerušenie v mikrokontroléroch?
Ako všetci vieme, mikrokontroléry sa používajú na vykonávanie množiny preddefinovaných (programovaných) aktivácií, ktoré na základe vstupu spúšťajú potrebné výstupy. Zatiaľ čo je váš mikrokontrolér zaneprázdnený vykonávaním jedného kusu kódu, môže nastať núdzová situácia, keď si druhý kúsok vášho kódu vyžaduje okamžitú pozornosť. Tento ďalší kúsok kódu, ktorý si vyžaduje okamžitú pozornosť, by sa mal považovať za prerušenie.
Napríklad: Uvažujme, že hráte svoju obľúbenú hru na mobile a ovládač (predpoklad) vo vašom telefóne je zaneprázdnený vrhaním všetkej grafiky, ktorá je potrebná na to, aby ste si hru mohli vychutnať. Ale zrazu tvoja priateľka zavolá na tvoje číslo. Najhoršia vec, ktorá sa teraz môže stať, je, že ovládač mobilných telefónov zanedbá volanie vašej priateľky, pretože ste zaneprázdnení hraním hry. Aby sme zabránili vzniku tejto nočnej mory, používame niečo, čo sa volá prerušovanie.
Tieto prerušenia budú vždy aktívnym zoznamom niektorých konkrétnych akcií, ktoré sa majú stať, a keď k nim dôjde, vykonajú kus kódu a potom sa dostanú späť k normálnej funkcii. Táto časť kódu sa nazýva rutina prerušenia služby (ISR). Jedným z praktických projektov, v ktorých je prerušenie povinné, je „Obvod digitálneho tachometra a počítadla kilometrov pomocou mikrokontroléra PIC“.
V mikrokontroléroch existujú dva hlavné typy prerušenia. Sú to Externé prerušenie a Interné prerušenie. Vnútorné prerušenia sa vyskytujú vo vnútri mikronastaviča na vykonanie úlohy, napríklad prerušenia časovača, prerušenia ADC atď. Tieto prerušenia spúšťa softvér na dokončenie operácie časovača, respektíve operácie ADC.
Vonkajšie prerušenie je také, ktoré môže byť spustené používateľom. V tomto programe sa naučíme, ako používať externé prerušenie pomocou tlačidla na spustenie prerušenia. Použijeme LCD na zobrazenie čísel, ktoré sa zvyšujú od 0 do 1 000, a keď sa spustí prerušenie, mali by sme o tom informovať z ISR programu prerušenia služby a potom pokračovať späť v zvyšovaní čísel.
Schéma zapojenia a vysvetlenie:
Schéma zapojenia pre použitie prerušenia PIC16F877 je uvedená na obrázku vyššie. Jednoducho musíte pripojiť LCD k PIC, ako sme to urobili pri prepojení LCD tutoriálu.
Teraz, aby sme pripojili prerušovací kolík, mali by sme sa pozrieť do údajového listu a zistiť, ktorý kolík PIC sa používa pre externé prerušenie. V našom prípade aj n PIC16F877A suma 33 rd pin RBO / INT je použitý pre externé prerušenia. Nemôžete použiť iný pin ako tento. Pinové zapojenie pre túto schému zapojenia je uvedené v nasledujúcej tabuľke.
S.No: |
PIN kód |
Názov špendlíka |
Pripojený k |
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 |
Stlačte tlačidlo |
Na porte PORT B sme povolili interné pull up rezistory, takže môžeme priamo pripojiť pin RB0 k zemi pomocou tlačidla Push. Takže vždy, keď bude tento pin NÍZKY, spustí sa prerušenie.
Pripojenia je možné vykonať na doske typu Bread, ako je to znázornené nižšie.
Ak ste sledovali naše návody, mali by ste sa oboznámiť s touto Perf Board, ktorú som tu použil. Ak nie, nemusíte nad tým veľmi premýšľať, jednoducho postupujte podľa schémy zapojenia a dostanete veci do poriadku.
Simulácia prerušenia v mikrokontroléri PIC:
Simulácia tohto projektu sa vytvára pomocou programu Proteus.
Keď simulujete projekt, mali by ste vidieť, že sa na LCD displeji zvyšuje postupnosť čísel. To sa deje vo vnútri hlavnej slučky a vždy, keď je stlačené tlačidlo, na LCD by sa malo zobraziť, že vstúpil do ISR. V kóde môžete vykonať svoje úpravy a vyskúšať ho tu vyskúšať.
Vysvetlenie kódu:
Celý kód tohto projektu nájdete na konci tohto tutoriálu. Program je však rozdelený na dôležité časti a pre lepšie pochopenie je vysvetlený nižšie.
Rovnako ako všetky programy, aj tento program musí začínať definovaním konfigurácie pinov pre piny, ktoré používame v našom programe. Tiež tu musíme definovať, že používame RB0 / INT ako pin externého prerušenia a nie ako vstupný alebo výstupný pin. Nižšie uvedený riadok kódu umožňuje vnútorné pull-up rezistor na Portbou tým, že sa 7 th kúsok ako 0 ° C.
OPTION_REG = 0b00000000;
Potom povolíme globálne / periférne prerušenia a deklarujeme, že ako externý prerušovací pin používame RB0.
GIE = 1; // Povoliť globálne prerušenie PEIE = 1; // Povoliť periférne prerušenie INTE = 1; // Povoliť RB0 ako externý pin prerušenia
Akonáhle je pin RB0 definovaný ako pin externého prerušenia, zakaždým, keď sa zníži, stane sa príznak externého prerušenia INTF 1 a vykoná sa kód vo vnútri funkcie prerušenia void, pretože sa bude volať rutina prerušenia služby (ISR).
void interrupt ISR_example () {if (INTF == 1) // Bolo zistené externé prerušenie {Lcd_Clear (); Lcd_Set_Cursor (1,1); Lcd_Print_String ("Zadané ISR"); INTF = 0; // vymaže príznak prerušenia po dokončení __delay_ms (2000); Lcd_Clear (); }}
Ako vidíte, funkciu prerušenia som pomenoval ako ISR_example. Môžete ho pomenovať podľa vášho želania. Vo vnútri funkcie prerušenia skontrolujeme, či je príznak INTF vysoký, a vykonáme potrebné akcie. Po dokončení rutiny je veľmi dôležité vyčistiť príznak prerušenia. Iba potom sa program vráti späť do neplatnej hlavnej funkcie. Toto zúčtovanie musí byť vykonané softvérom pomocou linky
INTF = 0; // vymaže príznak prerušenia po vykonaní
Vo vnútri hlavnej funkcie iba zvyšujeme číslo na každých 500 ms a zobrazujeme ho na obrazovke LCD. Nemáme žiadny konkrétny riadok na kontrolu stavu kolíka RB0. Prerušenie zostane vždy aktívne a vždy, keď stlačíte tlačidlo, vyskočí z neplatnej hlavnej a vykoná riadky v ISR.
Lcd_Set_Cursor (2,1); Lcd_Print_String ("vo vnútri hlavnej slučky"); Lcd_Set_Cursor (1,1); Lcd_Print_String ("Číslo:"); Lcd_Print_Char (ch1 + '0'); Lcd_Print_Char (ch2 + '0'); Lcd_Print_Char (ch3 + '0'); Lcd_Print_Char (ch4 + '0'); __delay_ms (500); číslo ++;
Fungovanie prerušenia PIC16F877A:
Keď pochopíte, ako prerušenie funguje, môžete ho vyskúšať na hardvéri a popasovať sa s ním. Tento program uvedený v tomto dokumente je veľmi základným príkladom externého prerušenia, pri ktorom iba zmení zobrazenie obrazovky LCD, keď sa zistí prerušenie.
Kompletné fungovanie projektu nájdete vo videu uvedenom nižšie. Dúfam, že ste pochopili prerušenia a kde / ako ich použiť. Ak máte pochybnosti, môžete ma kontaktovať na fórach alebo v sekcii komentárov.