- Необходимые материалы:
- Что такое прерывания и где их использовать:
- Принципиальная схема и пояснения:
- Моделирование прерываний в микроконтроллере PIC:
- Пояснение к коду:
- Работа прерываний PIC16F877A:
В этом руководстве мы узнаем, как использовать внешнее прерывание в микроконтроллере PIC и зачем и где они нам понадобятся. Это часть серии руководств по PIC, в которых мы начали изучать микроконтроллеры PIC с нуля; следовательно, в этом руководстве предполагается, что вы знакомы с тем, как программировать PIC MCU с помощью MPLABX и как взаимодействовать с ЖК-дисплеем с PIC. Если нет, вернитесь к соответствующим ссылкам и прочтите их до конца, потому что я пропущу большую часть информации, которая там уже упоминалась.
Необходимые материалы:
- PIC16F877A Perf Board
- ЖК-дисплей 16x2
- Нажать кнопку
- Подключение проводов
- Хлебная доска
- PicKit 3
Что такое прерывания и где их использовать:
Прежде чем приступить к программированию прерываний микроконтроллера PIC, давайте разберемся, что такое прерывание на самом деле и где нам нужно его использовать. Кроме того, в микроконтроллере много типов прерываний, а в PIC16F877A их около 15. Не будем пока все забивать себе в голову.
Так! что такое прерывание в микроконтроллерах?
Как мы все знаем, микроконтроллеры используются для выполнения набора предопределенных (запрограммированных) активаций, которые запускают необходимые выходы в зависимости от входа. Но пока ваш микроконтроллер занят выполнением одной части кода, может возникнуть чрезвычайная ситуация, когда другая часть вашего кода требует немедленного внимания. Этот другой фрагмент кода, требующий немедленного внимания, следует рассматривать как прерывание.
Например: представим, что вы играете в свою любимую игру на своем мобильном телефоне, а контроллер (предположение) внутри вашего телефона загружает всю графику, которая необходима вам, чтобы вы могли наслаждаться игрой. Но вдруг на твой номер звонит девушка. Теперь худшее, что может случиться, - это то, что контроллер вашего мобильного телефона будет игнорировать звонок вашей подруги, поскольку вы заняты игрой. Чтобы предотвратить этот кошмар, мы используем так называемые прерывания.
Эти прерывания всегда будут активными, перечисляя некоторые конкретные действия, которые должны произойти, и когда они происходят, они выполняют фрагмент кода, а затем возвращаются к нормальной функции. Этот фрагмент кода называется процедурой обслуживания прерывания (ISR). Одним из практических проектов, в которых прерывание является обязательным, является «Схема цифрового спидометра и одометра с использованием микроконтроллера PIC».
В микроконтроллерах есть два основных типа прерываний. Это внешнее прерывание и внутреннее прерывание. Внутренние прерывания возникают внутри Microntroller для выполнения задачи, например прерывания от таймера, прерывания от АЦП и т. Д. Эти прерывания запускаются программным обеспечением для завершения операции таймера или операции АЦП соответственно.
Внешнее прерывание - это прерывание, которое может вызвать пользователь. В этой программе мы узнаем, как использовать внешнее прерывание, используя кнопку для запуска прерывания. Мы будем использовать ЖК-дисплей для отображения чисел, увеличивающихся от 0 до 1000, и когда срабатывает прерывание, мы должны уведомить об этом из процедуры обработки прерывания ISR, а затем вернуться к увеличению числа.
Принципиальная схема и пояснения:
Принципиальная схема использования прерываний PIC16F877 приведена на изображении выше. Вам просто нужно подключить ЖК-дисплей к PIC, как мы делали в руководстве по подключению ЖК-дисплея.
Теперь, чтобы подключить вывод прерывания, мы должны взглянуть на таблицу, чтобы узнать, какой вывод PIC используется для внешнего прерывания. В нашем случае в PIC16F877A 33- й контакт RBO / INT используется для внешнего прерывания. Вы не можете использовать никакой другой вывод, кроме этого. Подключение контактов для этой принципиальной схемы показано в таблице ниже.
S.No: |
Пин код |
Имя контакта |
Соединен с |
1 |
21 год |
RD2 |
RS LCD |
2 |
22 |
RD3 |
E LCD |
3 |
27 |
RD4 |
D4 ЖК-дисплея |
4 |
28 |
RD5 |
D5 ЖК-дисплея |
5 |
29 |
RD6 |
D6 ЖК-дисплея |
6 |
30 |
RD7 |
D7 ЖК-дисплея |
7 |
33 |
RBO / INT |
Нажать кнопку |
Мы включили внутренние подтягивающие резисторы на ПОРТ B, поэтому мы можем напрямую подключить вывод RB0 к земле с помощью кнопки. Таким образом, всякий раз, когда этот вывод становится LOW, будет срабатывать прерывание.
Подключения можно выполнить на плате для хлеба, как показано ниже.
Если вы следовали нашим руководствам, вы должны были ознакомиться с этой Perf Board, которую я использовал здесь. Если нет, вам не нужно много думать об этом, просто следуйте принципиальной схеме, и вы все заработаете.
Моделирование прерываний в микроконтроллере PIC:
Моделирование для этого проекта выполнено с использованием Proteus.
Когда вы моделируете проект, вы должны увидеть последовательность чисел, увеличивающуюся на ЖК-дисплее. Это происходит внутри основного цикла, и всякий раз, когда нажимается кнопка, ЖК-дисплей должен отображать, что она вошла в ISR. Вы можете внести изменения в код и попробовать его здесь.
Пояснение к коду:
Полный код этого проекта можно найти в конце этого руководства. Однако программа разбита на важные части и объясняется ниже для вашего лучшего понимания.
Как и все программы, мы должны начать код с определения конфигурации контактов для контактов, которые мы используем в нашей программе. Также здесь нам нужно определить, что мы используем RB0 / INT как вывод внешнего прерывания, а не как вывод ввода или вывода. В приведенной ниже строке кода включается внутренний подтягивающий резистор на порту B, делая 7- й бит равным 0.
OPTION_REG = 0b00000000;
Затем мы включаем глобальные / периферийные прерывания и объявляем, что мы используем RB0 в качестве вывода внешнего прерывания.
ЭДД = 1; // Разрешить глобальное прерывание PEIE = 1; // Разрешить периферийное прерывание INTE = 1; // Включение RB0 как внешнего вывода прерывания
Как только вывод RB0 определен как вывод внешнего прерывания, каждый раз, когда он становится низким, флаг внешнего прерывания INTF становится равным 1, и код внутри функции прерывания void будет выполняться, поскольку будет вызвана подпрограмма обслуживания прерывания (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 main. Эта очистка должна выполняться программным обеспечением с использованием строки
INTF = 0; // очищаем флаг прерывания после того, как закончили с ним
Внутри основной функции мы просто увеличиваем число каждые 500 мс и отображаем его на ЖК-экране. У нас нет специальной строки для проверки статуса вывода RB0. Прерывание всегда будет оставаться активным, и всякий раз, когда нажимается кнопка, оно выскакивает из void main и выполняет строки в 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:
Как только вы поймете, как работает прерывание, вы можете опробовать его на оборудовании и поиграться с ним. Данная программа, представленная здесь, является очень простым примером внешнего прерывания, когда она просто изменяет отображение ЖК-экрана при обнаружении прерывания.
Полную работу проекта можно посмотреть в видео ниже. Надеюсь, вы поняли, что такое прерывания и где и как их использовать. Если у вас есть какие-либо сомнения, вы можете связаться со мной через форумы или через раздел комментариев.