Искусство схемотехники. Том 3 (Изд.4-е) - Хоровиц Пауль. Страница 18
Если кнопка СТОП не нажималась, программа проверяет, не следует ли завершить измерения ввиду отработки заданного на передней панели числа разверток (число оставшихся разверток хранится в памяти в переменной 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 кГц без перехода на аппаратную обработку данных.
11.09. Некоторые дополнительные соображения
В процессе разработки прибора мы, сталкиваясь с различными возможными вариантами элементов аппаратного или программного обеспечения, должны были принять какое-то решение. Во многих случаях выбор варианта не был однозначным. Чаще всего, правда, «наилучшее решение» представлялось очевидным, но иногда альтернативный вариант был ничем не хуже; в таких случаях, как правило, мы старались выбрать решение, отличающееся максимальной простотой или иллюстрирующее наиболее употребительную методику (избегая хитроумных приемов, основанных на тонких особенностях аппаратуры), а также приводящее к упрощению программы. В реальной жизни (в противоположность книгам) вполне естественно использовать особенности аппаратуры; естественно также писать сложные программы. Рассмотрим некоторые элементы нашего проекта, допускающие альтернативные решения.