Читаем Искусство схемотехники. Том 3 (Изд.4-е) полностью

МП 68008, как уже описывалось выше, распознает прерывания, а также разнообразные «исключения», перечисленные в таблице, и сохранив в стеке текущие PC и SR, осуществляет переход на команду, адрес которой извлекается из вектора, соответствующего данному исключению. Так, если вы попытаетесь разделить на нуль, ЦП сохранит в стеке содержимое счетчика команд и регистра состояния, а затем перейдет на команду, 32-разрядный адрес которой хранится в байтах памяти с абсолютными адресами $014—$017. Точно так же обслуживаются и прерывания, причем для векторов прерываний с полным подтверждением отведены ячейки с адресами $100-$3FF, а для векторов автовекторизуемых прерываний — ячейки $064-$07F. Вы можете выполнять в обработчике прерываний любые действия; завершить их следует командой RTE (возврат из исключения). Чтобы избежать путаницы, ЦП запрещает прерывания после передачи управления обработчику и разрешает их снова при выполнении команды RTE. Если у вас уж слишком закрученный обработчик, вам может понадобиться разрешить прерывания (только более приоритетных уровней) внутри обработчика, что можно сделать, послав соответствующий байт в регистр состояния.

Программа bad__int. Из рис. 11.20 и текста программы 11.3 легко представить ход выполнения программы bad__int, в задачу которой входит упорядоченный сброс выходных сигналов и вывод на ЭЛД какой-то бросающейся в глаза информации. Стартовый адрес этой программы, определяемый компоновщиком после сборки всех настраиваемых строк, загружается (главной программой в процессе начальной загрузки) во все зарезервированные для векторов ячейки (в начале памяти), перечисленные в таблице. Любое исключение или ложное прерывание (т. е. что угодно, кроме прерывания уровня 5) заставляет ЦП выполнить описанную выше процедуру с передачей управления на программу bad__int. Сначала выключается сигнал Z-оси, чтобы исключение, случайно возникшее в середине программного импульса Z-оси, не оставило луч дисплея включенным на полную яркость (к тому же в одной точке). Далее стоит сбросить сигнал на выходе РАЗВЕРТКА и установить сигнал на выходе КОНЕЦ, поскольку в предшествующих измерениях все равно нет смысла.

Теперь проявим остроумие. Пошлем в порт ЭЛД 01Н и войдем в бесконечный цикл, в котором это число циклически сдвигается влево и после биологически заметной задержки снова посылается на ЭЛД. Результатом такой операции будет «шагающий бит» на ЭЛД-индикаторе, картина, которая заставит встрепенуться самого измученного оператора. Поскольку в цикле нет команды RTE, процесс этот будет идти бесконечно. Чтобы снова начать измерения, оператор должен нажать кнопку СБРОС.

Упражнение 11.15. Придумайте более совершенный алгоритм, позволяющий оператору определить, какое исключение привело к сбою. Подсказка: всего имеется немного менее 256 исключений; ЭЛД-индикатор содержит 8 бит. Можете ли вы написать программу, реализующую ваше решение?


Прерывания от таймера: четыре точки входа. Теперь у нас не осталось никаких отговорок. Нырнем. Текст обработчика прерываний входит в программу 11.3; его структурная схема изображена на рис. 11.21.




Рис. 11.21.Структурная схема обработчика прерываний.


Обработчик имеет четыре точки входа, соответствующие различным состояниям прибора. Они обозначены idle, wait__trig, sweep__start и get__data. Программа, в зависимости от общего состояния прибора, автоматически изменяет содержимое вектора прерываний (ячейка $074), связывая прерывание с той или иной точкой входа. Если вы не желаете накапливать данные, вы входите в обработчик в точке idle; на экран выводится одна точка и осуществляется возврат. Если войти в обработчик в точке get__data, программа считывает АЦП, проверяет, не возникли ли состояния «конец ячейки» или «конец развертки» (обрабатывая их соответствующим образом) и обновляет дисплей. При входе в точке sweep__start устанавливается требуемое состояние ЭЛД и выходных сигналов и осуществляется переход в точку get__data.

Наконец, вход wait__trig служит для проверки наличия сигнала внешнего запуска и перехода либо на sweep__strat, либо на idle. В обработчике прерываний имеются и другие метки (например z__pulse), но они не являются входными точками, а служат для переходов внутри программы.

Перейти на страницу:
Нет соединения с сервером, попробуйте зайти чуть позже