- Potřebné materiály:
- Co jsou to přerušení a kde je použít:
- Schéma zapojení a vysvětlení:
- Simulace přerušení v mikrokontroléru PIC:
- Vysvětlení kódu:
- Fungování přerušení PIC16F877A:
V tomto tutoriálu se naučíme, jak používat externí přerušení v mikrokontroléru PIC a proč / kde je budeme potřebovat. Toto je část sekvence PIC tutoriálů, ve kterých jsme se začali učit mikrokontroléry PIC od nuly; proto tento výukový program předpokládá, že jste obeznámeni s tím, jak programovat PIC MCU pomocí MPLABX a jak propojit LCD s PIC. Pokud ne, vraťte se prosím k jejich příslušným odkazům a přečtěte si je, protože budu přeskakovat většinu informací, které tam již byly zahrnuty.
Potřebné materiály:
- PIC16F877A Perf Board
- 16x2 LCD displej
- Stiskněte tlačítko
- Připojení vodičů
- Chlebová deska
- PicKit 3
Co jsou to přerušení a kde je použít:
Než se pustíme do toho, jak programovat přerušení mikrokontroléru PIC, pochopme, co vlastně Interrupt je a kde je budeme muset použít. Dále je v mikrokontroléru spousta typů přerušení a PIC16F877A jich má asi 15. Nezaměňme si je zatím všechny do hlavy.
Tak! co je přerušení v mikrokontrolérech?
Jak všichni víme, mikrokontroléry se používají k provádění sady předdefinovaných (programovaných) aktivací, které spouštějí potřebné výstupy na základě vstupu. Ale zatímco je váš mikrokontrolér zaneprázdněn prováděním jedné části kódu, může nastat nouzová situace, kdy další část vašeho kódu vyžaduje okamžitou pozornost. S touto další částí kódu, která vyžaduje okamžitou pozornost, by mělo být zacházeno jako s přerušením.
Například: Vezměme v úvahu, že hrajete svou oblíbenou hru na mobilním telefonu a ovladač (předpoklad) uvnitř vašeho telefonu je zaneprázdněn házením veškeré grafiky, která je potřebná k tomu, abyste si hru mohli užít. Ale najednou vaše přítelkyně zavolá na vaše číslo. Nejhorší věcí, která se nyní může stát, je to, že váš ovladač mobilních telefonů zanedbá volání vaší přítelkyně, protože jste zaneprázdněni hraním hry. Abychom zabránili tomu, aby se tato noční můra stala, používáme něco, čemu se říká přerušení.
Tato přerušení budou vždy aktivním výpisem některých konkrétních akcí, které se mají stát, a když k nim dojde, provedou část kódu a poté se vrátí zpět k normální funkci. Tato část kódu se nazývá rutina přerušení služby (ISR). Jedním z praktických projektů, u nichž je přerušení povinné, je „Digitální obvod rychloměru a počítadla kilometrů využívající mikrokontrolér PIC“.
V mikrokontrolérech existují dva hlavní typy přerušení. Jsou to Externí přerušení a Interní přerušení. Interní přerušení se vyskytují uvnitř Microntroller za účelem provedení úkolu, například přerušení časovače, přerušení ADC atd. Tato přerušení jsou spuštěna softwarem k dokončení operace časovače nebo operace ADC.
Externí přerušení je takové, které může uživatel spustit. V tomto programu se naučíme, jak používat externí přerušení pomocí tlačítka pro spuštění přerušení. Použijeme LCD k zobrazení čísel zvyšujících se od 0 do 1000 a když je spuštěno přerušení, měli bychom o tom informovat z ISR Interrupt Service Rutine a poté pokračovat zpět v zvyšování čísel.
Schéma zapojení a vysvětlení:
Schéma zapojení pro použití přerušení PIC16F877 je uvedeno na obrázku výše. Jednoduše musíte připojit LCD k PIC, jako jsme to udělali v tutoriálu o propojení LCD.
Nyní, abychom připojili přerušovací kolík, měli bychom se podívat na datový list, abychom věděli, který kolík PIC se používá pro externí přerušení. V našem případě i n PIC16F877A částka 33 rd pin RBO / INT je použit pro externí přerušení. Nelze použít žádný jiný pin než tento. Pin připojení pro toto schéma zapojení je uvedeno v tabulce níže.
S.No: |
Číslo PIN |
Název PIN |
Připojen 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 |
Stiskněte tlačítko |
Na PORT B jsme povolili interní pull up rezistory, proto můžeme přímo připojit pin RB0 k zemi pomocí tlačítka Push. Takže kdykoli bude tento pin NÍZKÝ, spustí se přerušení.
Připojení lze provést na desce chleba, jak je uvedeno níže.
Pokud jste sledovali naše výukové programy, měli byste se seznámit s touto Perf Board, kterou jsem zde použil. Pokud ne, nemusíte o tom moc přemýšlet, jednoduše postupujte podle schématu zapojení a vše funguje.
Simulace přerušení v mikrokontroléru PIC:
Simulace tohoto projektu se provádí pomocí programu Proteus.
Když simulujete projekt, měli byste vidět, jak se na LCD displeji zvyšuje posloupnost čísel. To se děje uvnitř hlavní smyčky a kdykoli je stisknuto tlačítko, na LCD by se mělo zobrazit, že vstoupilo do ISR. V kódu můžete provést úpravy a zkusit jej otestovat zde.
Vysvětlení kódu:
Kompletní kód pro tento projekt najdete na konci tohoto kurzu. Program je však rozdělen na důležité části a pro lepší pochopení je vysvětlen níže.
Stejně jako všechny programy musíme zahájit kód definováním konfigurace pinů pro piny, které používáme v našem programu. Také zde musíme definovat, že používáme RB0 / INT jako externí kolík přerušení a ne jako vstupní nebo výstupní kolík. Níže uvedený řádek kódu umožňuje vnitřní pull-up rezistor na PORTB tím, že se 7 th kousek jak 0 ° C.
OPTION_REG = 0b00000000;
Poté povolíme přerušení Global / Peripheral a deklarujeme, že používáme RB0 jako externí pin přerušení.
GIE = 1; // Povolit globální přerušení PEIE = 1; // Povolit periferní přerušení INTE = 1; // Povolit RB0 jako externí Přerušovací kolík
Jakmile je pin RB0 definován jako pin externího přerušení, pokaždé, když se sníží, bude příznak externího přerušení INTF nastaven na 1 a kód uvnitř funkce přerušení void bude spuštěn, protože bude volán rutina přerušení služby (ISR).
void interrupt ISR_example () {if (INTF == 1) // Zjištěno externí přerušení {Lcd_Clear (); Lcd_Set_Cursor (1,1); Lcd_Print_String ("Zadáno ISR"); INTF = 0; // vymaže příznak přerušení po dokončení __delay_ms (2000); Lcd_Clear (); }}
Jak vidíte, funkci přerušení jsem pojmenoval ISR_example. Můžete jej pojmenovat podle svého přání. Uvnitř funkce přerušení zkontrolujeme, zda je příznak INTF vysoký, a provedeme potřebné akce. Po dokončení rutiny je velmi důležité vymazat příznak přerušení. Teprve potom se program vrátí zpět do hlavní funkce neplatnosti. Toto zúčtování musí být provedeno softwarem pomocí linky
INTF = 0; // vymaže příznak přerušení po dokončení
Uvnitř hlavní funkce pouze zvyšujeme číslo každých 500 ms a zobrazujeme jej na LCD obrazovce. Nemáme žádnou konkrétní linku ke kontrole stavu kolíku RB0. Přerušení zůstane vždy aktivní a při každém stisknutí tlačítka vyskočí z neplatné hlavní a provede řádky v ISR.
Lcd_Set_Cursor (2,1); Lcd_Print_String ("Inside Main Loop"); 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 ++;
Fungování přerušení PIC16F877A:
Jakmile pochopíte, jak přerušení funguje, můžete to vyzkoušet na hardwaru a hrát si s ním. Tento program, který je zde uveden, je velmi základním příkladem externího přerušení, kdy pouze změní zobrazení obrazovky LCD, když je detekováno přerušení.
Kompletní fungování projektu najdete ve videu níže. Doufám, že jste pochopili přerušení a kde / jak je použít. Máte-li jakékoli pochybnosti, můžete mě kontaktovat na fórech nebo v sekci komentářů.