- Необходими материали:
- Какво представляват прекъсванията и къде да ги използваме:
- Електрическа схема и обяснение:
- Симулация на прекъсвания в PIC микроконтролер:
- Обяснение на кода:
- Работа на прекъсвания PIC16F877A:
В този урок ще научим как да използваме външно прекъсване в PIC Microcontroller и защо / къде ще ни трябват. Това е част от последователността на PIC уроци, в които започнахме да изучаваме PIC микроконтролери от нулата; следователно този урок предполага, че сте запознати с това как да програмирате PIC MCU с помощта на MPLABX и как да свържете LCD с PIC. Ако не, моля, върнете се към съответните им връзки и ги прочетете, защото ще пропусна повечето от информацията, която вече е била покрита там.
Необходими материали:
- PIC16F877A Perf Board
- 16x2 LCD дисплей
- Натисни бутона
- Свързване на проводници
- Дъска за хляб
- PicKit 3
Какво представляват прекъсванията и къде да ги използваме:
Преди да се заемем с това как да програмираме PIC микроконтролер прекъсвания, нека разберем какво всъщност е прекъсването и къде трябва да ги използваме. Освен това има много видове прекъсвания в микроконтролера и PIC16F877A има около 15 от тях. Нека не ги бъркаме засега в главата си.
Така! какво е прекъсване в микроконтролери?
Както всички знаем, микроконтролерите се използват за извършване на набор от предварително дефинирани (програмирани) активирания, които задействат необходимите изходи въз основа на входа. Но докато вашият микроконтролер е зает с изпълнението на една част от кода, може да има извънредна ситуация, при която друга част от вашия код да се нуждае от незабавно внимание. Тази друга част от кода, която се нуждае от незабавно внимание, трябва да се третира като прекъсване.
Например: Нека помислим, че играете любимата си игра на мобилния си телефон и контролерът (предположението) във вашия телефон е зает, като хвърля всички графики, необходими за да се насладите на играта. Но изведнъж приятелката ти се обажда на твоя номер. Най-лошото нещо, което може да се случи, е вашият мобилен контролер да пренебрегне обаждането на вашите приятелки, тъй като сте заети да играете игра. За да не се случи този кошмар, използваме нещо, наречено прекъсвания.
Тези прекъсвания винаги ще бъдат активни в списъка за някои конкретни действия и когато се появят, те изпълняват парче код и след това се връщат към нормалната функция. Тази част от кода се нарича рутинна услуга за прекъсване (ISR). Един практичен проект, в който прекъсването е задължително, е „Цифрови вериги за скоростомер и одометър, използващи PIC микроконтролер“
В микроконтролерите има два основни типа прекъсвания. Те са външно прекъсване и вътрешно прекъсване. Вътрешните прекъсвания възникват вътре в Microntroller за изпълнение на задача, например таймерни прекъсвания, прекъсвания ADC и др. Тези прекъсвания се задействат от софтуера, за да завършат съответно операцията таймер или ADC.
Външното прекъсване е това, което може да бъде задействано от потребителя. В тази програма ще научим как да използваме външно прекъсване, като използваме бутон за задействане на прекъсване. Ще използваме LCD за показване на числа, нарастващи от 0 до 1000 и когато се задейства прекъсване, трябва да уведомим за това от ISR на Interrupt Service Rutine и след това да продължим обратно към увеличаване на числата.
Електрическа схема и обяснение:
Схемата на схемата за използване на прекъсвания PIC16F877 е дадена на горното изображение. Просто трябва да свържете LCD дисплея към PIC, както направихме при урок за свързване на LCD.
Сега, за да свържем щифта за прекъсване, трябва да разгледаме листа с данни, за да знаем кой щифт на PIC се използва за външно прекъсване. В нашия случай i n PIC16F877A 33 - ия пин RBO / INT се използва за външно прекъсване. Не можете да използвате друг пин, различен от този. Pin връзката за тази електрическа схема е показана в таблицата по-долу.
S.No: |
ПИН номер |
Име на ПИН |
Свързан с |
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 |
Натисни бутона |
Активирахме вътрешни издърпващи резистори на PORT B, поради което можем директно да свържем щифта RB0 към земята чрез бутон. Така че всеки път, когато този пин стане НИЗКИ, ще се задейства прекъсване.
Връзките могат да бъдат осъществени на дъска за хляб, както е показано по-долу.
Ако сте следвали нашите уроци, трябва да сте се запознали с тази Perf Board, която използвах тук. Ако не, не е нужно да мислите много за това, просто следвайте схемата и ще получите нещата да работят.
Симулация на прекъсвания в PIC микроконтролер:
Симулацията за този проект е направена с помощта на Proteus.
Когато симулирате проекта, трябва да видите последователност от числа, които се увеличават на LCD дисплея. Това се случва вътре в основния контур и при всяко натискане на бутона LCD трябва да показва, че е влязъл в ISR. Можете да направите своите промени в кода и да опитате да го тествате тук.
Обяснение на кода:
Пълният код за този проект може да бъде намерен в края на този урок. Програмата обаче е разделена на важни парчета и е обяснена по-долу за по-добро разбиране.
Подобно на всички програми, ние трябва да започнем кода, като дефинираме конфигурацията на щифтовете за щифтовете, които използваме в нашата програма. Също така тук трябва да дефинираме, че използваме RB0 / INT като външен щифт за прекъсване, а не като входен или изходен щифт. Долният ред на кода позволява вътрешния издърпващ резистор на portB, като прави 7 -ми бит като 0.
OPTION_REG = 0b00000000;
След това активираме глобалните / периферни прекъсвания и декларираме, че използваме RB0 като външен щифт за прекъсване.
GIE = 1; // Активиране на глобално прекъсване PEIE = 1; // Активиране на периферното прекъсване INTE = 1; // Активиране на RB0 като външен щифт за прекъсване
След като пинът RB0 се дефинира като външен щифт за прекъсване, всеки път, когато стане нисък, флага за външно прекъсване INTF ще стане 1 и кодът във функцията за прекъсване на празнотата ще бъде изпълнен, тъй като ще бъде извикана рутинната услуга за прекъсване (ISR).
void interrupt ISR_example () {if (INTF == 1) // Външно прекъсване е открито {Lcd_Clear (); Lcd_Set_Cursor (1,1); Lcd_Print_String ("Въведена ISR"); INTF = 0; // изчистване на знамето за прекъсване след приключване с него __delay_ms (2000); Lcd_Clear (); }}
Както можете да видите, аз съм нарекъл функцията за прекъсване като ISR_example. Можете да го назовете според вашето желание. Във функцията за прекъсване ще проверим дали флагът на INTF е висок и ще извършим необходимите действия. Много е важно да изчистите знамето за прекъсване, след като приключите с рутината. Само тогава програмата ще се върне към основната функция void. Това изчистване трябва да се извърши чрез софтуер, използващ линията
INTF = 0; // изчистване на знамето за прекъсване след приключване с него
Вътре в основната функция просто увеличаваме число на всеки 500 ms и го показваме на LCD екрана. Нямаме конкретна линия за проверка на състоянието на щифта RB0. Прекъсването винаги ще остане активно и всеки път, когато бутонът бъде натиснат, той ще изскочи от невалиден главен и ще изпълни редовете в ISR.
Lcd_Set_Cursor (2,1); Lcd_Print_String ("Вътре в главния контур"); Lcd_Set_Cursor (1,1); Lcd_Print_String ("Номер:"); Lcd_Print_Char (ch1 + '0'); Lcd_Print_Char (ch2 + '0'); Lcd_Print_Char (ch3 + '0'); Lcd_Print_Char (ch4 + '0'); __delay_ms (500); номер ++;
Работа на прекъсвания PIC16F877A:
След като сте разбрали как работи прекъсването, можете да го изпробвате на хардуера и да го играете. Тази програма, дадена тук, е много основен пример за външно прекъсване, където просто променя дисплея на LCD екрана, когато се открие прекъсване.
Цялостната работа на проекта може да бъде намерена във видеото, дадено по-долу. Надявам се, че сте разбрали за прекъсванията и къде / как да ги използвате. Ако имате някакви съмнения, можете да се свържете с мен чрез форумите или чрез раздела за коментари.