Программирование параллельного порта.
Рассмотрим внутреннюю структуру параллельного порта. В состав входят: двунаправленный 8 - разрядный буфер данных; блок управлением записью чтением и три восьми разрядных канала ввода/вывода - порты А, В и С для обмена информации с внешними устройствами, адреса портов соответственно 00, 01 и 10. Режим работы каждого из каналов программируется с помощью управляющего слова. Управляющее слово может задать один из трех режимов: основной режим ввода/вывода (режим 0), стробируемый ввод/вывод (режим 1) и режим двунаправленной передачи информации (режим 2). Канал А может работать в любом из трех режимов, канал В - в режимах 0 и 1. Канал С может быть использован для передачи данных только в режиме 0.
Для вывода в параллельный порт должны быть использованы три порта, два из них для передачи данных - результата функции и один порт для установки бита готовности данных и определение сбоя в ПЗУ. Будет использовать режим 0, который применяется при синхронном обмене или при программной организации асинхронного обмена. Микросхема параллельного порта в этом режиме может рассматриваться как устройство, состоящее из четырех портов: 2 - восьмиразрядных и 2 - четырехразрядных, независимо настраиваемых на ввод или вывод.
Разряд 0 порта С устанавливается в 1 как только данные поступили в параллельный порт (порты А и В). Этот бит сбрасывается ПЭВМ, когда она прочитает данные из порта, в нуль. Это новое значение должен считать микропроцессор и только после этого начать обрабатывать новые значения. Механизм такой проверки реализуется следующим способом: организуется цикл, работа которого заключается в том, что каждый раз значение из порта считывается в аккумулятор и его содержимое проверяется на нуль. Такая проверка должна занять не более одного прохода цикла, потому что ПЭВМ работает на много быстрее, чем устройство ввода. Также в порте С используется разряд 1, который свидетельствует о том, что произошел сбой в ПЗУ. Обнулим содержимое порта С вначале программы (после установки режима), чтобы показать его начальное состояние и чтобы не возникло ситуации: ошибка в ПЗУ и данные готовы.
Для работы с параллельным портом необходимо вначале его проинициализировать, то есть задать ему режим работы. За это отвечает управляющее слово, к которому можно обратится в пространстве ввода/вывода по адресу 03h. В седьмой разряд запишем 1 (установка режимов каналов), а в остальные разряды запишем нули, следовательно параллельный порт будет работать в режиме 0 и все порты будут настроены на вывод информации.
Сама программа с необходимыми пояснениями представлена в Приложении. Там же описаны такты и размер каждой выполняемой команды. Первое значение необходимо для построения временных диаграмм работы системы, а второе - для подсчета всего объема программы.
Этот этап является переходной ступенью между анализом проектируемой системы и соединением ее элементов между собой на функциональной схеме. В ходе анализа задания, определили какую элементную базу будет использовать, теперь определим основные моменты соединения элементов.
Микропроцессорное устройство состоит из самого микропроцессора, генератора тактовых импульсов, а также из буферных регистров и шинных формирователей. Последние два элемента используются для демультиплексирования шины адреса/данных. Здесь рассматриваются все эти элементы как один блок, из-за того что при построение любой системы на базе К1810 эти элементы всегда должны в него входить. Системную магистраль разделим на шину адреса, шину данных и шину управления. К ним подключим наш обобщенный блок, а также ПЗУ, порт ввода и вывода, которые необходимо присоединить при помощи дешифратора адреса. Дешифратор необходим для точного выбора микросхемы, чтобы не было путаницы при обращении в пространстве ввода/вывода и пространстве памяти, которые друг от друга отделены. Непосредственное взаимодействие используемых блоков с шинами показано с помощью стрелок, направленных к и/или от соответствующим шинам. Структурная схема устройства ввода приведена на рисунке 9.
Теперь мы пришли к самому интересному этапу разработки системы - непосредственное соединение выводов элементов. Опишем наиболее интересные аспекты проектирования системы, функциональная схема которой выполнена как отдельный чертеж на формате А2. Но вначале рассмотрим работу системы после ее включения. По окончанию сигнала RESET, первая команда начинает выбираться из ячейки памяти с физическим адресом FFFF0h. И поэтому сюда необходимо поставить команду перехода JMP, которая перейдет по метки на начальный адрес программы, находящейся в ПЗУ. Адресом начала программы для микропроцессора будет 11111000000000, так как используем в системе только выводы AD14. AD0. А начало программы будет находится в ПЗУ начиная с адреса 000000000. Вся программа занимает 80 байт, следовательно можно было взять ПЗУ меньшего объема, но тогда необходимо подключать их большее число, потому что надо обеспечивать пересылку байта. ПЗУ представлено двумя блоками, для того чтобы каждое слово передавалось за один цикл шины, слова располагаются только с четных адресов. Использованием сигналов
и А0, приводит к следующим пересылкам: 00 - пересылается слово, 10 - младший байт, 01 - старший байт, 11 - устройство не выбрано. Остальные адреса кроме и А0, и адресов, определяющих адрес внутри ПЗУ, участвуют в выборе микросхемы. Выбор микросхемы памяти осуществляется по 4 - м выводам, два из которых имеют активный уровень 0 и два других - 1. Первые из них заземлим, а на вторые подадим сигнал с логики адресов, чтобы при обращении к памяти там была единица. Вернемся к линии RESET к которой также подключен параллельный порт. Этот сигнал обнуляет управляющее слово и устанавливает все порты в режим ввода.Рассмотрим формирование управляющих сигналов: запись в порт (
), чтение порта ( ) и чтение памяти ( ), которые непосредственно участвуют либо в разрешении выбора микросхемы, либо подаются на соответствующие выводы микросхемы, как для К580ВВ55 (для входов и ). Сигналы формируются на основании 3 - х выводов микропроцессора , и , которые вырабатываются в зависимости от того, происходит обращение к порту или памяти.Порты ввода и вывода подключаются аналогично ПЗУ. У них существует свой единственный адрес, по которому происходит обращение к микросхеме. В качестве порта ввода используется две микросхемы К1810ИР82, которые обеспечивают передачу 16 - разрядных данных. Помимо поступления на них входных данных, также подается стробирующий сигнал, который разрешает запись данных в микросхему. Он подается как входное значение для устройства ввода для того, чтобы микропроцессор успевал обрабатывать данные, то есть возникновении ситуации: запись данных вместо других, еще не обработанных, свелась к нулю.
Более простое подключение, относительно выбора порта происходит в микросхеме К580ВВ55. Так как у нее уже есть два входа А0 и А1, по которым происходит выбор порта параллельного интерфейса. Передача данных и сигнала их готовности обеспечивается портами А, В и С этой микросхемы.
В заключении несколько слов о генераторе тактовых импульсов. Если быстродействие всех внешних устройств системы согласовано с быстродействием МП и нет необходимости в режиме ожидания, то входы готовности подключаются к источнику питания, а входы разрешения анализа заземляются. При этом сигнал READY вырабатывается схемой синхронизации готовности под действием внутреннего сигнала синхронизации СLK.
В ряде случаев, особенно при разработке программного обеспечения для МПС реального времени, важным является время выполнения той или иной программы, поэтому для каждого формата команды указывается число тактов N, требуемых для ее выполнения. Количество тактов для каждой команды приведено в приложении. Всю программу можно разбить на следующие части: инициализация системы (тест ПЗУ и установка параллельного порта), ввод данных в устройство ввода, их обработка, вывод данных и проверка готовности (ПЭВМ считал данные из порта вывода или нет).
В алгоритме используется операция деления, в которой делитель не должен быть равен нулю, из-за этого происходит пропуск этих данных и они снова вводятся. Поэтому быстродействие системы будет отличаться из-за входных значений. Также время ввод первых трех значений и значений принятых в середине работы будет отлично, так как используется в первом случае три операции вывода из порта (IN), а во втором - только одна.