Пауль Хоровиц - Искусство схемотехники. Том 3 [Изд.4-е]
- Название:Искусство схемотехники. Том 3 [Изд.4-е]
- Автор:
- Жанр:
- Издательство:Мир
- Год:1993
- Город:Москва
- ISBN:5-03-002954-0 (русск.); 5-03-002336-4; 0-521-37095-7 (англ.)
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Пауль Хоровиц - Искусство схемотехники. Том 3 [Изд.4-е] краткое содержание
Широко известная читателю по предыдущим изданиям монография известных американских специалистов посвящена быстро развивающимся областям электроники. В ней приведены наиболее интересные технические решения, а также анализируются ошибки разработчиков аппаратуры: внимание читателя сосредотачивается на тонких аспектах проектирования и применения электронных схем.
На русском языке издается в трех томах. Том 3 содержит сведения о микропроцессорах, радиотехнических схемах, методах измерения и обработки сигналов, принципах конструирования аппаратуры и проектирования маломощных устройств, а также обширные приложения.
Для специалистов в области электроники, автоматики, вычислительной техники, а также студентов соответствующих специальностей вузов и техникумов.
Искусство схемотехники. Том 3 [Изд.4-е] - читать онлайн бесплатно полную версию (весь текст целиком)
Интервал:
Закладка:
Упражнение 11.16.Объясните, почему можно обойтись без проверки индексного регистра D4 массива DISPLAY после его инкрементирования?
К этому времени Х- и Y-ЦАП уже установились (время установки 1 мкс), поэтому генератор Z-импульса с помощью команды BSET устанавливает бит Z__BLANK (бит 4, см. определения) параллельного порта В, адрес которого, ввиду его частого использования, мы храним в регистре А2. Сбросить бит можно следующей командой, но в этом случае образовался бы слишком короткий (3 мкс) импульс, и изображение было бы бледным (подсветка на 3 мкс каждые 100 мкс). Поскольку, однако, все прерывания завершаются через этот программный блок, мы можем воспользоваться возможностью и сделать полезное дело, одновременно убив время, именно, сообщить таймеру, что он может снять свой запрос на прерывание. Запись в регистр команд и состояния таймера-1 осуществляется с помощью двухэтапного процесса (как это было и в блоке инициализации главной программы): сначала мы посылаем в управляющий регистр микросхемы (адрес $84003) внутренний адрес регистра ($0А), а затем посылаем сам управляющий байт ($20), который интерпретируется микросхемой 8536, как команда на снятие запроса прерывания от таймера-1. Больше до выхода из прерывания ничего делать не нужно, поэтому мы завершаем импульс Z-оси (командой BCLR) и выполняем команду RTE (возврат из исключения). Поместив строки подтверждения прерывания в генератор Z-импульса, мы удлинили импульс подсветки до 10 мкс, с повторением его каждые 100 мкс. Прерывание все равно надо было подтвердить, и мы нашли для этого самое подходящее место. Такая же глюковина использована нами и в другом месте, когда мы в течение аналого-цифрового преобразования посылаем в ЦАП X и Y-координаты точки. Об этом ниже.
Прерывания от таймера: get_data. Эта точка входа используется чаще других, именно, когда усреднитель сигнала выполняет развертку. Мы запускаем АЦП, посылая в его порт байт режима ($03); это число определяет биполярное преобразование в дополнительном коде. Как и раньше, для повышения скорости мы используем косвенную адресацию через регистр A3 (в котором хранится адрес АЦП).
Теперь надо подождать 10 мкс окончания преобразования — прекрасная возможность послать на ЦАП дисплея новую пару X и Y-координат точно так же, как это делается в блоке idle . Эти программные действия заканчиваются на 1 мкс раньше, чем нужно, поэтому мы тянем время с помощью команды NOP (холостая команда), а затем считываем АЦП. Заметьте, насколько это удобнее, чем вводить бит состояния, сигнализирующий о завершении преобразования в АЦП (эта возможность обсуждалась в разд. 11.05 ); не забудьте, однако, добавить еще несколько команд NOP, если вам захочется увеличить тактовую частоту ЦП.
Мы прочитали из АЦП байт в дополнительном (до 2) коде, но наш массив DATA и накопитель ячейки (D7) используют длинные дополнительные числа. Для получения длинного целого числа дважды выполняется команда ЕХТ (расширение знака). Расширение знака представляет собой просто копирование самого старшего бита числа влево, пока не заполнится большее по длине целое слово; эта операция сохраняет значение целого со знаком (простое заполнение нулями не сохраняет значения числа). Расширенное целое добавляется к накапливаемому содержимому ячейки в D7, а счетчик ширины канала dwell__per__bin (D6) декрементируется. Если в нем еще не нуль, возврат осуществляется через z__pulse , как описано выше. Полное время выполнения программы обработчика в этом случае составляет 32,3 мкс плюс 9 мкс на процедуру прерывания ЦП и еще 5 мкс на команду RTE, всего 46,3 мкс. Таким образом, главная программа имеет более половины процессорного времени на выполнение простой задачи обновления массива DISPLAY.
Если накопление в канале завершилось, обработчик устанавливает счетчик ширины канала, добавляет накопленное значение в D7 к соответствующему элементу массива DATA (на который указывает А5), инкрементирует соответствующий элемент массива NORM (через А6), очищает регистр-аккумулятор (D7), декрементирует счетчик каналов и (если в счетчике каналов не нуль, т. е. развертка не завершилась) переходит на z__pulse . Обратите внимание на использование автоинкрементного режима адресации. Дополнительное время, расходуемое обработчиком на выполнение этих операций, составляет 14,8 мкс.
Если завершилась и развертка, о чем говорит нуль в счетчике каналов D5, обработчик устанавливает указатели, ЭЛД-индикатор и выходные сигналы. Затем проверяется, не была ли нажата кнопка СТОП; такую проверку следует обязательно выполнять в конце (или начале) развертки, чтобы данные всегда усреднились по целому числу разверток. Если кнопка СТОП была нажата, программа переходит на метку stop sweep, в результате чего устанавливаются выход КОНЕЦ и стоп-флаг, а в вектор INT5 загружается адрес входной точки idle .
Если кнопка СТОП не нажималась, программа проверяет, не следует ли завершить измерения ввиду отработки заданного на передней панели числа разверток (число оставшихся разверток хранится в памяти в переменной num__sweeps ), поскольку значение 0 обозначает «безостановочная работа», мы сначала проверяем на нуль; если num__sweeps = 0, это значение сохраняется и осуществляется переход на re__trigger , в противном случае значение num__sweeps декрементируется и снова проверяется на нуль. Если теперь оно равно нулю, это значит, что закончилась последняя запланированная развертка; в этом случае осуществляется переход на stop__sweep . Если развертки не исчерпались, выполняется программный блок re__trigger .
Блок re__trigger определяет режим запуска следующей развертки. Если переменная autoloop , установленная программой main после считывания состояния управляющей панели, имеет значение «истина», в вектор INT5 загружается адрес точки входа sweep__start , в противном случае загружается адрес wait__trig .
Заметьте, что в процессе смены вектора нет опасности прерывания, потому что пока ЦП выполняет обработку прерывания, прерывания запрещены; поскольку мы не включаем их в обработчике прерывания, они остаются запрещенными.
Прерывания от таймера: sweep__start и wait__trig. Эти входные точки используются, если следующее прерывание должно начать развертку, либо мы ожидаем импульса внешнего запуска (длительностью на менее 100 мкс!). Соответствующий адрес загружается в вектор INT5 либо в главной программе при нажатии кнопки ПУСК, либо в обработчике прерываний при завершении обработки не последней развертки (в точке re__trigger ); по структурной схеме можно проследить, где это делается. Программный блок sweep__start сразу начинает развертку, и его структура проста: зажигается ЭЛД РАЗВЕРТКА, устанавливается выходной сигнал РАЗВЕРТКА, сбрасывается фиксатор бита кнопки СТОП («запоминание 1»), загружается вектор get__data , а затем происходит естественный переход на метку get__data . При последующих прерываниях вход в обработчик прерываний осуществляется через входную точку get__data .
Читать дальшеИнтервал:
Закладка: