Выбрать главу

Рис. 11.17. Передняя панель усреднителя сигналов.

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

Можно перечислить еще целый ряд дополнений, которые улучшили бы наш прибор, но мы от них отказались, чтобы не усложнять описываемую здесь программу. Можно было предусмотреть второй аналоговый вход (микросхема 670 содержит два АЦП), переменное число ячеек, несколько «банков» памяти для хранения данных, цифровые выходы для индикации номера текущей ячейки, а также аналоговые сигналы, пропорциональные номеру ячейки (для контроля аналоговых величин). Это все довольно очевидные, но не принципиальные усовершенствования; более важной является возможность пересылать накопленные данные в микроЭВМ, для чего лучше всего использовать один из последовательных портов.

Даже в рамках выбранной нами конструкции можно было ввести дополнительные режимы. В частности, микропроцессорная система с аналого-цифровыми и цифро-аналоговыми преобразователями значительно выиграет при включении в нее аналоговых мультиплексоров, позволяющих связать выходы ЦАП со входами АЦП. В этом случае вы сможете выполнять программное тестирование всех преобразователей в качестве элемента общей процедуры тестирования при включении питания (куда также входит проверка памяти, портов и т. д.). Можно даже проверять, с помощью АЦП, напряжение (я) источника питания.

Упражнение 11.11. Покажите, как это сделать, если ко входам АЦП подключены аналоговые мультиплексоры. Вам потребуется предусмотреть адрес порта, по которому из ЦП будут направляться команды выбора мультиплексора.

11.07. Программирование: детали

Обзор. Программы обычно сложны. Программы реального времени на языке ассемблера сложны всегда. Однако вместо того, чтобы рассматривать упрощенную программу, которая в действительности работать не сможет, мы собираемся привести реальную законченную программу, годную для использования в нашем приборе, во всем ее великолепии (и безобразии). Чтобы помочь вам в ней разобраться, мы будем рассматривать ее постепенно, слой за слоем. Лучше всего воспользоваться методом «нисходящего проектирования», когда сначала определяются основные функции программы, порядок их выполнения и протокол обмена информацией между основными модулями программы. После этого можно перейти к структурным схемам конкретных программных модулей. Наконец, пишутся реальные программные строки на языке ассемблера.

Замечание: дальнейшее описание насыщено деталями. Читатели, желающие получить лишь общее представление, могут опустить обсуждение вопросов программирования, перейдя сразу к разд. 11.08 или 11.09.

На рис. 11.18 изображена общая структура, сильно упрощенная.

Рис. 11.18. Программирование: общая структура.

В ОЗУ мы организовали три массива: массив DATA из 256 32-разрядных («длинных») целых чисел для хранения текущих данных для каждого канала; массив NORM из 256 16-разрядных («слова») целых чисел для хранения количества полных разверток для каждого канала, что нужно для нормализации данных в режиме автомасштабирования; и, наконец, массив DISPLAY из 256 байт для хранения данных, непрерывно поступающих на дисплей. Основные функции программы заключаются в следующем: добавление в массив DATA новых данных из АЦП при одновременной модификации массива NORM; масштабирование этих длинных чисел с преобразованием их в байты массива (в режиме автомасштабирования — с использованием массива NORM, а при ручном задании масштаба - путем сдвига); непрерывный вывод этих байтов на экран.