Параллельного обмена.
Используя описанные выше функции программирования КПО, можно реализовать самые разные режимы его работы и алгоритмы взаимодействия с внешними устройствами.
1. Программа реализации асинхронного протокола взаимодействия с "медленными" внешними устройствами. Основа такого протокола — цикл типа "команда—ожидание реакции—действие".
В качестве примера рассмотрим сопряжение БИС АЦП 1113ПВ1 с компьютером с помощью КПО. Условное обозначение БИС, ее подключение к портам УКПО и временные диаграммы работы показаны на рис. 5.1. Видно, что процедура чтения кода с АЦП реализуется последовательностью действий: запуск — ожидание готовности — чтение данных.
Рис. 4.1. Подключение БИС АЦП 1113ПВ1 локальной сети.
// *** Программа чтения данных из БИС АЦП 1113ПВ1 ***
#include <DOS.H>
#include <STDIO.H>
#define START 1 // Маска бита запуска (бит 0 порта 2)
#define READY 0х80 // Маска бита готовности (бит 7 порта 1)
#define DH 3 // Маска 8-го и 9-го битов данных АЦП
// (биты 0 и 1 порта 1)
// Глобальные переменные
unsigned BASE_ADDR; // Базовый адрес УКПО
unsigned CW_ADDR; // Адрес регистра управляющего слова
void main (void)
{
unsigned data_ADC = 0; // Данные с АЦП
outportb (CW_ADDR, 4); //Установка конфигурации: порт 2 на вывод,
// остальные на ввод
outportb (BASE_ADDR+2, START^1);
// Запуск АЦП — запись 0
while (((data_ADC = inportb (BASE_ADDR+1)) & READY ) !=0);
// Опрос готовности
data_ADC = (data_ADC & DH) « 8 + inportb (BASE_ADDR);
// Чтение младшего байта данных
printf ("\nПрочитан код — %u", data_ADC);
}
//*** Конец программы
2. Программа сопряжение с компьютером простейшего устройства, состоящего из четырех ключей и четырех лампочек.
Предположим, что ввиду большой загруженности КПО другими задачами для подключения нашего устройства выделен только один порт 5 (рис. 5.2). Драйверы, приведенные ниже, реализуют две функции — чтение состояния ключей и "поджигание" лампочек.
Рис. 4.2. Подключение простейшего устройства из ключей и лампочек.
//*** Программа „Набор лампочек и кнопочек“ ***
#define LAMP 0x0F // Маска битов светодиодов (биты 0...3 порта 5)
#define P5 0х20 // Маска бита порта 5 в управляющем слове
// Глобальные переменные
unsigned BASE_ADDR; // Базовый адрес УКПО
unsigned CW_ADDR; // Адрес регистра управляющего слова
unsigned char CW; // Управляющее слово
// Прототипы функций
unsigned char Get_Switch (void):
void Set_Lamp (unsigned char data); // Функция чтения состояния ключей
unsigned char Get_Switch (void)
// В возвращаемом байте четыре старших бита
// (4 ... 7) соответствуют четырем ключам (0 — замкнут, 1 — разомкнут).
{
unsigned char data;
outportb (CW_ADDR, CW & (~P5)); // Порт 5 — на ввод
data = inportb (BASE_ADDR+5); // Чтение состояния ключей
outportb (CW_ADDR, CW | Р5); // Порт 5 — на вывод
return (data):
}
// Функция "поджигания" лампочек
void Set_Lamp (unsigned char data)
// Четыре младших бита из data соответствуют четырем
// лампочкам (1 — горит, 0 — погашен).
{
outportb (BASE_ADDR+5, (data & LAMP) | Get_Switch());
}
//*** Конец программы
Для "поджигания" лампочек необходимо вывести соответствующую тетраду в порт 5, но это может привести к конфликту на четырех старших линиях между выводимой информацией и состоянием ключей. Поэтому в старшую тетраду надо записывать данные, которые установлены ключами.
Для этого приходится считывать их состояние при каждой записи в порт 5.
Для считывания состояния ключей необходимо переводить порт 5 на ввод, а затем после чтения — опять на вывод.
Такое кратковременное отключение порта от лампочек (время зависит от быстродействия компьютера, но во всяком случае не превосходит нескольких десятков микросекунд) не будет заметно.
Дата добавления: 2015-10-13; просмотров: 1087;