- Потребни материјали:
- Шта су прекиди и где их користити:
- Шема и објашњење:
- Симулација прекида у ПИЦ микроконтролеру:
- Објашњење кода:
- Рад прекида ПИЦ16Ф877А:
У овом упутству ћемо научити како се користи спољни прекид у ПИЦ микроконтролеру и зашто / где ће нам требати. Ово је део низа ПИЦ туторијала у којима смо почели да учимо ПИЦ микроконтролере од нуле; стога овај водич претпоставља да сте упознати са начином програмирања ПИЦ МЦУ-а помоћу МПЛАБКС-а и како повезати ЛЦД са ПИЦ-ом. Ако не, вратите се на њихове везе и прочитајте их, јер ћу прескочити већину информација које су тамо већ биле покривене.
Потребни материјали:
- ПИЦ16Ф877А Перф Боард
- ЛЦД екран од 16к2
- Тастер
- Повезивање жица
- Даска за хлеб
- ПицКит 3
Шта су прекиди и где их користити:
Пре него што се позабавимо начином програмирања прекида ПИЦ микроконтролера, схватимо шта је заправо прекид и где бисмо требали да их користимо. Даље, постоји много врста прекида у микроконтролеру, а ПИЦ16Ф877А их има око 15. Немојмо их за сада збунити у својој глави.
Тако! шта је прекид у микроконтролеру?
Као што сви знамо, микроконтролери се користе за извођење скупа унапред дефинисаних (програмираних) активација које покрећу потребне излазе на основу улаза. Али, док је ваш микроконтролер заузет извршавањем једног дела кода, можда постоји хитна ситуација када другом делу вашег кода треба хитна пажња. Овај други део кода коме је потребна хитна пажња треба третирати као прекид.
На пример: Узмимо у обзир да своју омиљену игру играте на свом мобилном телефону, а контролер (претпоставка) у вашем телефону је заузет бацајући сву графику потребну за уживање у игри. Али, одједном вас девојка позове на ваш број. Сада је најгора ствар коју ће ваш мобилни контролер занемарити позив девојака јер сте заузети играњем игре. Да бисмо спречили ову ноћну мору, користимо нешто што се назива прекидима.
Ови прекиди ће увек бити активни на попису да би се догодиле неке одређене радње, а када се догоде, извршавају део кода и враћају се у нормалну функцију. Овај део кода назива се рутина услуге прекида (ИСР). Један практични пројекат у коме је прекид обавезан је „Дигитални круг брзиномера и одометра помоћу ПИЦ микроконтролера“
У микроконтролеру постоје две главне врсте прекида. Они су спољни и унутрашњи прекиди. Интерни прекиди се јављају унутар Мицронтроллера за извршавање задатка, на пример тајмер прекида, АДЦ прекида итд. Ове прекиде покреће софтвер да би довршио рад тајмера или АДЦ рад.
Спољни прекид је онај који корисник може да покрене. У овом програму ћемо научити како да користимо спољни прекид помоћу дугмета за покретање прекида. Користићемо ЛЦД за приказ бројева који се увећавају од 0 до 1000, а када се активира прекид, требало би да о томе обавестимо из ИСР Интеррупт Сервице Рутине, а затим да наставимо са увећавањем бројева.
Шема и објашњење:
Шема кола за употребу прекида ПИЦ16Ф877 дата је на горњој слици. Једноставно морате повезати ЛЦД са ПИЦ-ом као што смо то урадили приликом повезивања ЛЦД упутства.
Сада да бисмо повезали пин прекида, требали бисмо погледати таблицу података да бисмо знали који пин ПИЦ-а се користи за спољни прекид. У нашем случају ја Н ПИЦ16Ф877А од 33 тх ПИН РБО / инт је користи за спољашњу прекид. Не можете користити било који други пин осим овог. Пин веза за овај дијаграм кола је приказана у доњој табели.
С.Но: |
Пин број |
Пин Наме |
Повезан |
1 |
21 |
РД2 |
РС ЛЦД |
2 |
22 |
РД3 |
Е ЛЦД |
3 |
27 |
РД4 |
Д4 ЛЦД-а |
4 |
28 |
РД5 |
Д5 ЛЦД-а |
5 |
29 |
РД6 |
Д6 ЛЦД-а |
6 |
30 |
РД7 |
Д7 ЛЦД-а |
7 |
33 |
РБО / ИНТ |
Тастер |
Омогућили смо унутрашње отпорнике на извлачење на ПОРТ Б, тако да можемо директно повезати РБ0 пин на масу помоћу тастера. Дакле, кад год овај пин добије ЛОВ, покреће се прекид.
Везе се могу успоставити на плочи за хлеб као што је приказано доле.
Ако сте пратили наше водиче, требало је да се упознате са овом Перф Боард-ом коју сам овде користио. Ако не, не морате пуно размишљати о томе, једноставно следите шему кола и постаће све исправно.
Симулација прекида у ПИЦ микроконтролеру:
Симулација за овај пројекат направљена је коришћењем Протеуса.
Када симулирате пројекат, на ЛЦД екрану бисте требали видети низ бројева који се повећавају. То се дешава унутар главне петље и кад год се притисне тастер, ЛЦД би требао приказати да је ушао у ИСР. Можете извршити своје измене у коду и покушати да га тестирате овде.
Објашњење кода:
Комплетни код за овај пројекат налази се на крају овог водича. Међутим, програм је подељен на важне делове и објашњен у наставку за ваше боље разумевање.
Као и сви програми, и код морамо започети дефинисањем конфигурације пинова за пинове које користимо у нашем програму. Такође овде морамо да дефинишемо да користимо РБ0 / ИНТ као спољни пин за прекидање, а не као улазни или излазни пин. Ред доле кода омогућава унутрашњи пулл-уп отпорник на портБ тако што ће 7. бит бити 0.
ОПТИОН_РЕГ = 0б00000000;
Затим омогућавамо глобалне / периферне прекиде и изјављујемо да користимо РБ0 као спољни пин за прекид.
ГИЕ = 1; // Омогући глобални прекид ПЕИЕ = 1; // Омогућавање периферног прекида ИНТЕ = 1; // Омогући РБ0 као спољни пин за прекидање
Једном када се РБ0 пин дефинира као спољни пин за прекид, сваки пут када се смањи, заставица спољног прекида ИНТФ постаће 1 и код унутар функције прекида за воид ће се извршавати од позива Рутина услуге прекида (ИСР).
воид интеррупт ИСР_екампле () {иф (ИНТФ == 1) // Откривен спољни прекид {Лцд_Цлеар (); Лцд_Сет_Цурсор (1,1); Лцд_Принт_Стринг ("Унесен ИСР"); ИНТФ = 0; // обришите заставицу прекида након завршетка са њом __делаи_мс (2000); Лцд_Цлеар (); }}
Као што видите, именовао сам функцију прекида ИСР_екампле. Можете га именовати према својој жељи. Унутар функције прекида ћемо проверити да ли је ознака ИНТФ висока и извршити потребне радње. Веома је важно очистити заставицу за прекид након што завршите са рутином. Тек тада ће се програм вратити на главну функцију воид. Ово чишћење мора извршити софтвер помоћу линије
ИНТФ = 0; // обришите заставицу прекида након што завршите с њом
Унутар главне функције само повећавамо број за сваких 500 мс и приказујемо га на ЛЦД екрану. Немамо ниједну одређену линију за проверу статуса РБ0 пина. Прекид ће увек остати активан и сваки пут када се притисне тастер искаче из празног главног и извршава линије у ИСР-у.
Лцд_Сет_Цурсор (2,1); Лцд_Принт_Стринг ("Унутар главне петље"); Лцд_Сет_Цурсор (1,1); Лцд_Принт_Стринг ("Број:"); Лцд_Принт_Цхар (цх1 + '0'); Лцд_Принт_Цхар (цх2 + '0'); Лцд_Принт_Цхар (цх3 + '0'); Лцд_Принт_Цхар (цх4 + '0'); __делаи_мс (500); број ++;
Рад прекида ПИЦ16Ф877А:
Једном када схватите како прекид функционише, можете га испробати на хардверу и петљати око њега. Овај овде дати програм је врло основни пример спољног прекида где он само мења приказ ЛЦД екрана када се детектује прекид.
Комплетан рад пројекта можете пронаћи у видео запису датом у наставку. Надам се да сте разумели прекиде и где / како их користити. Ако сумњате, можете ме контактирати путем форума или одељка за коментаре.