Составители:
30
3. В подпрограмме сохраняется состояние программы (ACC, PSW,
регистры), выполняется некоторая функция, восстанавливается состояние и
происходит возврат в прерванную программу.
Управление прерываниями:
1. Установить маску прерывания и бит разрешения прерываний EA.
2. Выбрать тип прерывания (по спаду H/L или по уровню L) для внешних
сигналов INT0, INT1.
3. Сформировать вектор прерывания в таблице векторов по
фиксированному адресу – (jmp на
программу обработки в Ассемблере).
4. Подготовить программу обработки, которая завершается командой
возврата из прерывания reti (в Ассемблере).
5. Основная программа и программа обработки прерываний должны быть
смещены в памяти Code на размер таблицы векторов прерывания (в опциях С51
проекта Кейл и в сегментах для Ассемблера).
6. В программе на Ассемблере резервировать Стек для прерываний
и
подпрограмм (по умолчанию в С51 назначается SP=07).
7. В программе на Ассемблере предусматривается сохранение состояния
(контекста) программы и восстановление. Для сохранения и восстановления ак-
тивных регистров r0-r7 могут быть использованы два варианта – сохранение ре-
гистров в Стеке и сохранение переключением регистрового банка.
Обращение к подпрограмме в С51
Void Ex00(void) interrupt 0 using 1
{ }
Ex00- имя подпрограммы обработки прерывания.
Interrupt – служебное слово-признак функции и 0-номер прерывания.
Using 1 – регистровый банк 1 используется в подпрограмме.
Указывая номер банка регистров, автоматически сохраняем контекст
программы из регистров общего назначения текущего банка. При этом в про-
грамме обработки прерывания используется новый регистровый банк. При вы-
ходе из программы прерывания
автоматически восстанавливается регистровый
банк и регистровый контекст на момент прерывания.
В языке С51 шаги 3-7 выполняются автоматически, в Ассемблере
программируются.
Пример.
Программа обработки внешнего прерывания INT0 (ввод по прерыванию)
#include <reg51.h>
intt0() interrupt 0 //подпрограмма обработки прерывания, ввод по готовности
{ выполнить ввод с порта 2/10 числа и преобразовать в двоичное }
Страницы
- « первая
- ‹ предыдущая
- …
- 28
- 29
- 30
- 31
- 32
- …
- следующая ›
- последняя »