Прерывания МК – для новичков в радиоделе

April 18, 2014 by admin Комментировать »

Я заметил, что достаточно часто прерывания используют, как обычную команду или обычный программный элемент Между тем, прерывание – это весьма и весьма своеобразный механизм

Механизм  прерывания  придумали  тогда, когда  компьютер  был вынужден  общаться  с такими

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

В те  времена и придумали, чтобы компьютер мог продолжать работу, принтеру  давали возможность прервать работу компьютера, когда принтер готов принять очередную порцию данных В этом случае принтер отправлял запрос на прерывание (работы компьютера), и, если прерывание ему было разрешено, ждал, когда компьютер прервётся, несколько быстротечных тактов машинного времени, выдаст очередную порцию информации и вернётся к прерванной работе

Что значит, компьютер прервёт свою работу

Вы знаете, что работает программа Если компьютер находится в каком-то месте программы, то, переходя в другое место программы, как это происходит при ветвлении программы, компьютер должен вернуться в правильное с точки зрения программы место Чтобы программа знала, что она прервана, а компьютер «понимал», где он прервался, создаётся специальная область оперативной памяти, куда при прерывании заносится адрес возврата к программе и все оперативные данные, например, промежуточные результаты вычислений или адреса, где находятся эти данные Эта специальная область памяти называется стеком Кроме того, обслуживание прерывания, того же принтера, организовано как подпрограмма, а адрес этой подпрограммы, его называют вектором прерывания, присваивается прерыванию

Таким образом, прерываясь, компьютер заносит в стек данные прерывания, выставляет адрес прерывания, переходит к подпрограмме обслуживания прерывания, выполняет всю подпрограмму, которая заканчивается командой возврата из прерывания По этой команде компьютер забирает из стека все данные об отложенной работе и продолжает её с того места, где его прервали

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

Давайте, посмотрим, как это выглядит для контроллера PIC16F628A В качестве основной работы пусть он «мигает лампочкой» Это мигание, как вы понимаете, просто сигнал, скажем, это может быть меандр генератора прямоугольных импульсов И пусть есть датчик, при срабатывании, что происходит редко, которого частота «мигания» должна измениться Итак

В блоке инициализации программы мы создаём переменную pause, которой присваиваем начальное значение

Затем начинается работа процессора, который устанавливает высокий уровень напряжения на выходе RA0 микроконтроллера, делает паузу длительностью, определяемой переменной pause (в секундах), затем снимает высокий уровень с выхода RA0

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

Вместо датчика используем кнопку, которую добавим в наш проект, соединив с входом RB0

Почему с ним Об этом чуть позже

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

Чтобы использовать прерывание, его следует разрешить, что мы сделаем в блоке инициализации нашей программы

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

Вставив этот программный элемент в программу, его следует обработать, то есть, выбрать, с чем будет связанно прерывание

У микроконтроллера PIC16f628A есть несколько штатных прерываний, и есть возможность создать пользовательское прерывание

Но любое прерывание должно быть разрешено

Рис 2534 Добавление разрешения на прерывание

Теперь выберем прерывание из списка доступных (дважды щёлкнув по вставленному нами элементу прерывания)

Рис 2535 Выбор вида прерывания

Если вы взглянете на микросхему (она появляется после выбора модели) или заглянете в описание микроконтроллера, то убедитесь, что вывод RB0 играет роль внешнего входа инициализации, INT Поэтому прерывание следует выбрать…

После выбора вида прерывания программа напомнит вам, что следует создать подпрограмму обработки прерывания Я назвал этот макрос delay Если теперь нажать кнопку диалога ОК&ampИзменить макрос, то вы оказываетесь в окне редактирования подпрограммы Где мы запишем изменение переменной pause

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

Если вы добавили кнопку и светодиод, если не забыли их соединить с нужными выводами, то можете  запустить  отладку  программы  Если  раньше,  чтобы  заставить  программу  «заметить»

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

Это очень простой пример Это очень простая программа и подпрограмма Но, если вместо светодиода вы будете включать гирлянду, а вместо кнопки в качестве датчика используете микрофон, то гирлянда будет переключаться от хлопка в ладоши Что может очень порадовать в новогодний праздник вашего младшего брата или маленького сына

Кстати, о датчиках Если вы читали последние главы за компьютером, то  ваш паяльник, мне кажется, заскучал Не пора ли немного попаять, проведя эксперименты за макетной платой

Источник: Гололобов ВН,- Самоучитель игры на паяльнике (Об электронике для школьников и не только), – Москва 2012

Оставить комментарий

микросхемы мощности Устройство импульсов питания пример приемника провода витков генератора выходе напряжение напряжения нагрузки радоэлектроника работы сигнал сигнала сигналов управления сопротивление усилитель усилителя усиления устройства схема теория транзистора транзисторов частоты