- Необхідні матеріали:
- Що таке переривання і де їх використовувати:
- Електрична схема та пояснення:
- Моделювання переривань у мікроконтролері PIC:
- Пояснення коду:
- Робота переривань PIC16F877A:
У цьому підручнику ми дізнаємося, як використовувати зовнішнє переривання в мікроконтролері PIC і чому / де вони нам знадобляться. Це частина послідовності навчальних посібників з PIC, в якій ми почали вивчати мікроконтролери PIC з нуля; отже, цей підручник передбачає, що ви знайомі з тим, як програмувати мікроконтролер PIC за допомогою MPLABX і як взаємодіяти РК-дисплей з PIC. Якщо ні, поверніться до їх відповідних посилань і прочитайте їх, оскільки я пропускаю більшість інформації, яка там вже була викладена.
Необхідні матеріали:
- PIC16F877A Перф. Дошка
- РК-дисплей 16x2
- Нажимна Кнопка
- Підключення проводів
- Хлібна дошка
- PicKit 3
Що таке переривання і де їх використовувати:
Перш ніж вивчати, як програмувати переривання мікроконтролера PIC, давайте зрозуміємо, що насправді є перериванням і де нам потрібно буде їх використовувати. Крім того, у мікроконтролері є безліч типів переривань, і PIC16F877A має близько 15 з них. Не будемо поки їх усіх плутати в голові.
Так! що таке переривання в мікроконтролерах?
Як ми всі знаємо, мікроконтролери використовуються для виконання набору заздалегідь визначених (запрограмованих) активацій, які запускають необхідні результати на основі вводу. Але, поки ваш мікроконтролер зайнятий виконанням одного фрагмента коду, може виникнути надзвичайна ситуація, коли інша частина вашого коду потребує негайної уваги. Цей інший фрагмент коду, який потребує негайної уваги, слід розглядати як переривання.
Наприклад: Давайте врахуємо, що ви граєте у свою улюблену гру на своєму мобільному телефоні, а контролер (припущення) всередині вашого телефону зайнятий киданням всієї графіки, необхідної для того, щоб ви насолоджувались грою. Але раптом ваша дівчина зателефонує на ваш номер. Зараз найгірше, що може статися - це ваш мобільний контролер, щоб нехтувати дзвінками своїх подруг, оскільки ви зайняті грою. Щоб запобігти цьому кошмару, ми використовуємо щось, що називається перериваннями.
Ці переривання завжди будуть активним переліком для деяких конкретних дій, і коли вони трапляються, вони виконують фрагмент коду, а потім повертаються до звичайної функції. Цей фрагмент коду називається процедурою обслуговування переривань (ISR). Одним практичним проектом, в якому переривання є обов'язковим, є "Цифровий контур спідометра та одометра з використанням мікроконтролера PIC"
У мікроконтролерах існує два основних типи переривань. Вони є зовнішніми і внутрішніми перериваннями. Внутрішні переривання відбуваються всередині мікроскопа для виконання завдання, наприклад, переривання таймера, переривання АЦП тощо. Ці переривання ініціюються програмним забезпеченням для завершення операції таймера або роботи АЦП відповідно.
Зовнішнє переривання - це те, яке може викликати користувач. У цій програмі ми дізнаємося, як використовувати зовнішнє переривання за допомогою кнопки, щоб викликати переривання. Ми використовуватимемо РК-дисплей для відображення чисел, що збільшуються від 0 до 1000, і коли спрацьовує переривання, ми повинні повідомити про це з Постійного ISR служби переривань, а потім продовжити збільшення чисел.
Електрична схема та пояснення:
Схема для використання переривань PIC16F877 наведена на зображенні вище. Вам просто потрібно підключити РК-дисплей до PIC, як це було зроблено в підручнику з взаємодії з РК-дисплеєм.
Тепер, щоб підключити штифт переривання, ми повинні поглянути на таблицю, щоб дізнатись, який штифт ПІК використовується для зовнішнього переривання. У нашому випадку в PIC16F877A для зовнішнього переривання використовується 33- й вивід RBO / INT. Ви не можете використовувати будь-який інший штифт, крім цього. Штекерне з'єднання для цієї електричної схеми показано в таблиці нижче.
S.No: |
Номер PIN-коду |
Ім'я PIN-коду |
Пов'язаний з |
1 |
21 |
RD2 |
RS РК |
2 |
22 |
RD3 |
E РК |
3 |
27 |
RD4 |
D4 РК-дисплея |
4 |
28 |
RD5 |
D5 РК-дисплея |
5 |
29 |
RD6 |
D6 РК-дисплея |
6 |
30 |
RD7 |
D7 РК-дисплея |
7 |
33 |
RBO / INT |
Нажимна Кнопка |
Ми ввімкнули внутрішні підтягуючі резистори на PORT B, отже, ми можемо безпосередньо підключити штифт RB0 до землі за допомогою кнопки. Отже, щоразу, коли цей штифт стає НИЗКИМ, спрацьовує переривання.
З'єднання можна здійснити на дошці хліба, як показано нижче.
Якщо ви дотримувались наших підручників, вам слід було ознайомитись із цією дошкою Perf, яку я використав тут. Якщо ні, вам не потрібно багато думати про це, просто дотримуйтесь принципової схеми, і ви змусите все працювати.
Моделювання переривань у мікроконтролері PIC:
Імітація для цього проекту виконана з використанням Proteus.
Під час моделювання проекту ви повинні побачити послідовність чисел, що збільшуються на РК-дисплеї. Це відбувається всередині головного циклу, і при натисканні кнопки РК-дисплей повинен відображати, що він увійшов до ISR. Ви можете внести свої зміни в код і спробувати протестувати його тут.
Пояснення коду:
Повний код цього проекту можна знайти в кінці цього посібника. Однак програма розбита на важливі фрагменти та пояснена нижче для кращого розуміння.
Як і всі програми, ми повинні починати код, визначаючи конфігурацію контактів для контактів, які ми використовуємо в нашій програмі. Також тут нам потрібно визначити, що ми використовуємо RB0 / INT як зовнішній вивід переривання, а не як вхідний чи вихідний вивід. Наведений нижче рядок коду включає внутрішній підтягуючий резистор на порту B, роблячи 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 мс і відображаємо його на РК-екрані. У нас немає жодного конкретного рядка для перевірки стану штифта 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:
Після того, як ви зрозуміли, як працює переривання, ви можете спробувати його на апаратному забезпеченні та возитись навколо нього. Ця програма, наведена тут, є дуже основним прикладом зовнішнього переривання, коли воно просто змінює відображення РК-екрану при виявленні переривання.
З повною роботою проекту можна ознайомитись у наведеному нижче відео, сподіваючись, ви зрозуміли про переривання та де / як їх використовувати. Якщо у вас є якісь сумніви, ви можете зв’язатися зі мною через форуми або через розділ коментарів.