Я помітив, що досить часто переривання використовують, як звичайну команду або звичайний програмний елемент Тим часом, переривання – це досить і досить своєрідний механізм

Механізм переривання придумали тоді, коли компютер був змушений спілкуватися з такими

«Тугодумами» як принтери Компютер вирішував якесь завдання і виводив результати на принтер Принтер брав байт, друкував символ, і повертався за наступним байтом А компютер, бідний компютер чекав, поки на папері не виявляться всі цифри

У ті часи і придумали, щоб компютер міг продовжувати роботу, принтеру давали можливість перервати роботу компютера, коли принтер готовий прийняти чергову порцію даних У цьому випадку принтер відправляв запит на переривання (роботи компютера), і, якщо переривання йому було дозволено, чекав, коли компютер перерветься, кілька швидкоплинних тактів машинного часу, видасть чергову порцію інформації і повернеться до перерваної роботи

Що означає, компютер перерве свою роботу

Ви знаєте, що працює програма Якщо компютер перебуває в якомусь місці програми, то, переходячи в інше місце програми, як це відбувається при розгалуження програми, компютер повинен повернутися в правильне з точки зору програми місце Щоб програма знала, що вона перервана, а компютер «розумів», де він перервався, створюється спеціальна область оперативної памяті, куди при перериванні заноситься адреса повернення до програми і всі оперативні дані, наприклад, проміжні результати обчислень або адреси, де знаходяться ці дані Ця спеціальна область памяті називається стеком Крім того, обслуговування переривання, того ж принтера, організовано як підпрограма, а адресу цієї підпрограми, його називають вектором переривання, присвоюється перериванню

Таким чином, перериваючись, компютер заносить в стек дані переривання, виставляє адресу переривання, переходить до підпрограми обслуговування переривання, виконує всю підпрограму, яка закінчується командою повернення з переривання За цією командою компютер забирає з стека всі дані про відкладену роботі і продовжує її з того місця, де його перервали

Погодьтеся, досить непростий механізм Якщо застосовувати переривання без особливої ​​потреби, то при розростанні програми цих переривань стає багато, зявляються вкладені переривання (переривання, що викликає інше переривання) і стек може швидко заповнитися надміру Стек у мікроконтролера використовує оперативну память, якої набагато менше, ніж памяті, відведеної для програми Переповнення стека викликає збій в роботі процесора, який важче відшукати, ніж звичайні помилки (хоча і ті, часом, відшукати важко) Так що, використовуйте переривання тоді, коли у мікроконтролера є інша дуже важлива робота, якої він постійно зайнятий, а переривання викликається повільними і рідкісними процесами, що вимагають короткочасних «отлучек» процесора з робочого місця

Давайте, подивимося, як це виглядає для контролера PIC16F628A В якості основної роботи нехай він «блимає лампочкою» Це миготіння, як ви розумієте, просто сигнал, скажімо, це може бути меандр генератора прямокутних імпульсів І нехай є датчик, при спрацьовуванні, що відбувається рідко, якого частота «миготіння» повинна змінитися Отже

У блоці ініціалізації програми ми створюємо змінну pause, Якій присвоюємо початкове значення

Потім починається робота процесора, який встановлює високий рівень напруги на виході RA0 мікроконтролера, робить паузу тривалістю, що визначається змінної pause (У секундах), потім знімає високий рівень з виходу RA0

Цикл нескінченний, процесор постійно цим зайнятий

Замість датчика використовуємо кнопку, яку додамо в наш проект, зєднавши з входом RB0

Чому з ним Про це трохи пізніше

Рис 2533 Програма основної роботи процесора

Щоб використовувати переривання, його слід дозволити, що ми зробимо в блоці ініціалізації нашої програми

Програмний елементПереривання(interrupt) Знаходиться там же, де всі програмні елементи

Вставивши цей програмний елемент в програму, його слід обробити, тобто, вибрати, з чим буде повязано переривання

У мікроконтролера PIC16f628A є кілька штатних переривань, і є можливість створити користувальницьке переривання

Але будь-яке переривання повинно бути дозволено

Рис 2534 Додавання дозволу на переривання

Тепер виберемо переривання зі списку доступних (двічі клацнувши по вставленого нами елементу переривання)

Рис 2535 Вибір виду переривання

Якщо ви поглянете на мікросхему (вона зявляється після вибору моделі) або заглянете в опис мікроконтролера, то переконаєтеся, що виведення RB0 грає роль зовнішнього входу ініціалізації, INT Тому переривання слід вибрати ..

Після вибору виду переривання програма нагадає вам, що слід створити підпрограму обробки переривання Я назвав цей макрос delay Якщо тепер натиснути кнопку діалогу ОК & Змінити макрос, То ви опиняєтеся у вікні редагування підпрограми Де ми запишемо зміну змінної pause

Рис 2536 Підпрограма обслуговування переривання

Якщо ви додали кнопку і світлодіод, якщо не забули їх зєднати з потрібними висновками, то можете запустити налагодження програми Якщо раніше, щоб змусити програму «помітити»

зміна стану кнопки, ми повинні були стежити за одним з входів, то тепер достатньо утримати кнопку довше паузи, щоб тривалість паузи змінилася

Це дуже простий приклад Це дуже проста програма і підпрограма Але, якщо замість світлодіода ви будете включати гірлянду, а замість кнопки в якості датчика використовуєте мікрофон, то гірлянда буде переключатися від бавовни в долоні Що може дуже порадувати в новорічне свято вашого молодшого брата або маленького сина

До речі, про датчики Якщо ви читали останні глави за компютером, то ваш паяльник, мені здається, засумував Чи не час трохи Попая, провівши експерименти за макетної платою

Джерело: Гололобов ВН, – Самовчитель гри на паяльнику (Про електроніці для школярів і не тільки), – Москва 2012