Искусство схемотехники. Том 3 [Изд.4 е] - Пауль Хоровиц страница 17.

Шрифт
Фон

Теперь надо подождать 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.

Вход в обработчик через входную точку wait__trig осуществляется, если следующая развертка не должна начаться до получения внешнего сигнала запуска (параллельный порт А, бит 7). Поскольку нажатие на кнопку СТОП должно "пересиливать" запуск, программа сначала анализирует состояние входа СТОП (и переходит при наличии этого сигнала на метку stop__sweep), а затем входа внешнего запуска; если сигнал запуска отсутствует, происходит переход на метку idle, если присутствует - на метку sweep__start.

11.08. Характеристики

Измерительный прибор на основе микропроцессора можно сконструировать таким образом, чтобы весь сбор данных осуществлялся быстрой аппаратурой, а микропроцессор выполнял лишь функции начального запуска и вывода информации. Такой прибор будет работать с максимальной скоростью, определяемой быстродействием аппаратуры, а микропроцессор придаст ему гибкость и облегчит работу с ним. Разумеется, вы платите сложностью и стоимостью аппаратуры; кроме того, гибкость прибора может оказаться невысокой из-за фиксированной аппаратной организации. Если в противоположность такому подходу вы упрощаете аппаратуру и используете процессор для обработки данных в реальном времени, как это сделано в нашем примере, вы можете удешевить аппаратуру и повысить гибкость прибора за счет, возможно, его быстродействия. Во многих случаях, однако, быстродействие не имеет решающего значения, и выбор оказывается однозначным.

В нашем случае базовая частота выборок и, следовательно, ширина канала ограничиваются скоростью работы процессора. Программа обработки любого прерывания должна завершиться до поступления следующего. При проектировании нашего прибора мы оценили необходимый объем обработки и решили, в значительной степени интуитивно, что 100 мкс хватит для ее выполнения. Естественно, уверенности у нас не было, но в случае необходимости мы были готовы пойти на уменьшение частоты выборок.

Посмотрим теперь на числа. Технические характеристики МП 68008, которые представляют собой том объемом 100 страниц, включают таблицы времен выполнения команд (в числе тактов). С помощью этих таблиц мы рассчитали длительности выполнения программных блоков, упоминавшиеся в тексте. Ниже приведены расчетные данные (с учетом операций векторизации и возврата) для обработчика прерываний;

Входная точка · Время выполнения (мкс)

idle 37

det__data 46,3 (внутри канала)

61 (конец канала)

92 (конец развертки, ручной СТОП)

105 (конец развертки, программный останов)

113 (конец развертки, ожидание внешнего запуска)

114 (конец развертки, автозапуск)

sweep__start 61

wait__trig 46 (нет запуска)

69 (запуск)

Большая часть приведенных длительностей не превышает "длительности пульса" усреднителя сигналов (100 мкс), что, конечно, очень хорошо. В трех случаях, однако, время обработки прерывания оказывается больше 100 мкс. Первая ситуация (конец развертки, программный останов) не страшна, поскольку затрата нескольких липших микросекунд после того, как все данные собраны, не имеет значения. Точно так же вряд ли вас обеспокоит вторая критическая ситуация (ожидание внешнего запуска), так как между сигналом внешнего запуска и началом очередной развертки всегда можно допустить некоторое время ожидания. Однако от последней ситуации (конец развертки, автозапуск) можно ожидать неприятностей, так как в режиме автозапуска мы ожидаем значение полного периода, точно равное 256 х ширина канала. В действительности, однако, здесь все в порядке по следующей причине. При использовании усреднителя сигналов в режиме автозапуска внешнее оборудование всегда запускается от усреднителя (для чего и предусмотрен выходной сигнал РАЗВЕРТКА), и если период будет отличаться на долю процента от ожидаемого, никакой беды не будет. Если, однако, вам необходимо завершать обработку за время, меньшее 100 мкс, используйте МП 68008 с тактовой частотой 10 МГц, отчего все длительности окажутся меньше на 20 %; это даст для наихудшего случая значение, меньшее 100 мкс (фактически 91 мкс). Однако при использовании более быстрого процессора не забудьте подправить программу обработчика, чтобы предоставить АЦП достаточное время для преобразования.

В целом, наше предположение, что МП 68008 позволит осуществлять выборку с частотой 10 кГц, оправдалось. Авторам это особенно приятно, так как мы написали все до последнего параграфа, и лишь тогда сами узнали, что были правы. Очевидно также, что безнадежно добиться от нашего прибора частоты 20 кГц без перехода на аппаратную обработку данных.

Ваша оценка очень важна

0
Шрифт
Фон

Помогите Вашим друзьям узнать о библиотеке