Главная » Просмотр файлов » Проектирование устройств сопряжения

Проектирование устройств сопряжения (1083567), страница 17

Файл №1083567 Проектирование устройств сопряжения (Книга Разработка устройств сопряжения по микропроцессорной технике) 17 страницаПроектирование устройств сопряжения (1083567) страница 172018-01-12СтудИзба
Просмтор этого файла доступен только зарегистрированным пользователям. Но у нас супер быстрая регистрация: достаточно только электронной почты!

Текст из файла (страница 17)

// Глобальные переменные

unsigned BASE_ADDR; // Базовый адрес УКПО

unsigned CW_ADDR; // Адрес регистра

// управляющего слова

void main (void)

{

unsigned char data = 0; // Начальное состояние — 0

outportb (CW_ADDR, 1); // Установка конфигурации:

// порт 0 на вывод,

// остальные на ввод

while (! kbhit()) // Пока не нажата

//любая клавиша

{

outportb (BASE, data); // Запись данных

data ^= MASK_BIT; // Инверсия бита

delay (1); // Задержка на 1мс

}

} //*** Конец программы

В этой программе изменение состояния выхода УКПО производится инверсией бита с помощью операции "ИСКЛЮЧАЮЩЕЕ ИЛИ" с позиционной маской бита. Для выдержки временного интервала использована системная функция delay языка Си, в качестве аргумента принимающая время в миллисекундах. Очевидно, что максимальная частота такого тактового генератора как раз и равна 1 кГц, чего в большинстве случаев недостаточно. Кроме того, точность установки частоты снижается из-за суммирования задержек выполнения остальных команд цикла.

Для повышения частоты тактового генератора можно использовать другой способ формирования программной задержки — цикл с заранее определенным временем исполнения. Например, если известно, что операция

for (i=0;i<1;i++) // Пустой цикл, выполняемый

; // один раз

выполняется N микросекунд, то, устанавливая предел выполнения цикла, можно получить любую задержку в диапазоне от N до 65536-N с шагом N. Однако такой способ требует предварительного определения быстродействия компьютера, что обычно нелегко сделать с достаточной точностью.

Наконец, для выдержки временного интервала можно использовать системный таймер компьютера. При этом программные прерывания 08Н и 1СН позволяют устанавливать интервалы, не меньшие чем 55 мс (частота примерно 18.2 Гц). Для получения меньших временных интервалов необходимо самому запрограммировать таймер.

С помощью УКПО просто реализуется асинхронный протокол взаимодействия с "медленными" внешними устройствами. Основа такого протокола — цикл типа "команда—ожидание реакции—действие". В качестве примера рассмотрим сопряжение БИС АЦП 1113ПВ1 с компьютером с помощью УКПО. Условное обозначение БИС, ее подключение к портам УКПО и временные диаграммы работы показаны на рис. 2.58. Видно, что процедура чтения кода с АЦП реализуется последовательностью действий: запуск — ожидание готовности — чтение данных.

Рис. 2.58. Подключение БИС АЦП 1113ПВ1.

// *** Программа чтения данных из БИС АЦП 1113ПВ1 ***

#include <DOS.H>

#include <STDIO.H>

#define START 1 // Маска бита запуска

// (бит 0 порта 2)

#define READY 0x80 // Маска бита готовности

// (бит 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+2, START^1) // Запуск АЦП — запись 0

while ( ( (data_ADC = inportb (BASE+1)) & READY ) != 0 );

// Опрос готовности

data_ADC = (data_ADC & DH)«8 + inportb (BASE);

// Чтение младшего байта данных

printf ("\nПрочитан код — %u", data_ADC);

}

//*** Конец программы

В следующем примере рассмотрим реализацию протоколов обмена с "быстрым" устройством — модулем ОЗУ емкостью 16 КБайт с байтовой организацией. Подключим модуль ОЗУ к портам УКПО следующим образом:

Р0.0 ... Р0.7 — младший байт шины адреса: А0 ... А7, Р1.0 ... Р1.5 — старшие линии шины адреса: А8...А13, Р1.6— сигнал разрешения записи -WE, PI.7— сигнал разрешения выхода -ОЕ, Р2.0 ... Р2.7— шина данных: D0 ... D7.

Ниже приведены драйверы модуля ОЗУ, реализующие процедуры записи и чтения байта данных по произвольному адресу. Перед вызовом драйверов должно быть предварительно установлено управляющее слово УКПО — ОЗН (порты 0 и 1 — на вывод, порт 2 — на ввод).

// *** Драйверы модуля ОЗУ ***

#define WE 0x40 // Маска бита WE (бит 6 порта 1)

#define ОЕ 0x80 // Маска бита ОЕ (бит 7 порта 1)

#define АН 0х3F // Маска линий А8...А13 шины адреса

// (биты 0...5 порта 1)

// Глобальные переменные

unsigned BASE_ADDR; // Базовый адрес УКПО

unsigned CW_ADDR; // Адрес регистра

// управляющего слова

// Прототипы функций

void Write_RAM (unsigned addr, unsigned char data);

unsigned char Read_RAM (unsigned addr);

// функция записи байта данных

void Write_RAM (unsigned addr, unsigned char data)

{

outportb (CW_ADDR, 7); // Порты 0...2 — на вывод

outportb (BASE_ADDR, addr); // Младший байт адреса

outportb (BASE_ADDR+1, (addr>>8) & AH | OE & (~WE));

// Старшие линии адреса,

//OE=1, WE=0

outportb (BASE_ADDR+2, data);

// Установка данных

outportb (BASE_ADDR+1, (addr>>8) & AH | OE | WE));

// WE=1

outportb (CW_ADDR, 3); // Порты 0,1 — на вывод,

// порт 2 — на ввод

}

// Функция чтения байта данных

unsigned char Read_RAM (unsigned addr)

{

unsigned char data;

outportb (BASE_ADDR, addr); // Младший байт адреса

outportb (BASE_ADDR+1, (addr>>8) & AH & (~OE) | WE);

// Старшие линии

// адреса,

// OE=0, WE=1

data = inportb (BASE_ADDR+2); // Чтение данных

outportb (BASE_ADDR+1, (addr>>8) & AH | OE | WE));

// OE=1

return (data);

}

//*** Конец драйверов

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

Другой задачей, где в процессе работы требуется изменение направления передачи порта, является использование части его линий для ввода, а другой части — для вывода информации (как уже неоднократно говорилось, направление передачи информации можно установить только для всего порта целиком, а не для отдельных его битов). Рассмотрим сопряжение с компьютером простейшего устройства, состоящего из четырех ключей и четырех лампочек и предположим, что ввиду большой загруженности УКПО другими задачами для подключения нашего устройства выделен только один порт 5 (рис. 2.59). Драйверы, приведенные ниже, реализуют две функции — чтение состояния ключей и "поджигание" лампочек.

Рис. 2.59. Подключение простейшего устройства из ключей и лампочек.

// *** Драйверы устройства "Набор лампочек и кнопочек" ***

#define LAMP 0x0F // Маска битов светодиодов

// (биты 0...3 порта 5)

#define P5 0x20 // Маска бита порта 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 | P5); // Порт 5 — на вывод

return (data);

}

// Функция "поджигания" лампочек

void Set_Lamp (unsigned char data)

// Четыре младших бита из data соответствуют четырем

// лампочкам (1 — горит, 0 — погашен).

{

outportb (BASE_ADDR+5, (data & LAMP) | Get_Switch());

}

//*** Конец драйверов

Понятно, что если для "поджигания" лампочек просто вывести соответствующую тетраду в порт 5, это может привести к конфликту на четырех старших линиях между выводимой информацией и состоянием ключей. Поэтому в старшую тетраду надо записывать те данные, которые установлены ключами. Для этого приходится считывать их состояние при каждой записи в порт 5. Для считывания состояния ключей необходимо переводить порт 5 на ввод, а затем после чтения — опять на вывод. Такое кратковременное отключение порта от лампочек (время зависит от быстродействия компьютера, но во всяком случае не превосходит нескольких десятков микросекунд) не будет заметно.

2.2.3. Программирование логического анализатора

При написании драйверов логического анализатора (см. п.2.1.10) необходимо реализовать три основные процедуры:

- установка параметров и запуск регистрации;

- проверка окончания регистрации;

- чтение массива данных.

// *** Драйверы логического анализатора ***

#define READY 0x01 // Маска бита готовности (бит 0)

#define FREQ 0x07 // Маска битов кода частоты

// регистрации (биты 0...2)

#define SYNC 0x38 // Маска битов кода синхролинии

// (биты 3...5)

#define POLAR 0x40 // Маска бита полярности

// синхроперехода (бит 6)

#define LENGTH 4096 // Глубина регистрации —

// 4096 кадров

// Глобальные переменные

unsigned CW_ADDR; //Адрес регистра

// управляющего слова

unsigned PRE_REG_ADDR; // Адрес регистра глубины

// предпусковой регистрации

unsigned R0,R1,R2,R3; // Адреса чтения байтов 0...3 данных

unsigned READY_ADDR; // Адрес флага готовности

// Структура параметров регистрации

typedef struct LA_Param

{

unsigned char freq; // Код частоты (0...7)

unsigned char sync; // Номер синхролинии (0...7)

unsigned char polar; // Код полярности синхроперехода

//0 — положительный,

// 1 — отрицательный.

unsigned pre_reg; // Глубина предпусковой

// регистрации

//(0 — (LENGTH-1))

};

// Прототипы функций

int lnit_LA (LA_PARAM *la);

unsigned Check_Ready (void);

void Read_Data (unsigned long *data);

// Функция установки параметров и запуска регистрации

int lnit_LA (LA_PARAM *la)

// Возвращает: 0 — запуск произведен,

// -1 — ошибка параметров регистрации

{

unsigned char cw, pr;

// Проверка правильности входных параметров

if (la->freq > 7 11 la->sync > 7 || la->polar > 1 ||

la->pre_reg >= LENGTH)

return (-1); // Выход по ошибке

// Формирование управляющего слова

// и кода предпусковой регистрации

cw = (la->freq & FREQ) + ((la->sync << 3) & SYNC)

+ ((la->polar << 6) & POLAR);

pw = la->pre_reg >> 4; // Точность — 16 кадров

outportb (CW_ADDR, cw); // Запись управляющего слова

outportb (PRE_REG_ADDR, pr); // Запись кода предпусковой

// регистрации и запуск анализатора

return (0); // Выход по нормальному запуску

}

// Функция проверки окончания регистрации

unsigned Check_Ready (void)

// Опрашивает флаг готовности и возвращает:

//0 — готов, иначе — не готов

{

return (inportb (READY ADDR) & READY);

}

// Функция чтения данных из буферного ОЗУ логического

// анализатора в память компьютера

void Read_Data (unsigned long *data)

// data — указатель на массив, в который

// будут переписаны

// данные из буферного ОЗУ.

{

unsigned i;

for (i=0;i<LENGTH;i++) // Повторяем чтение 4096 раз

data[i] = (unsigned long) inportb (R0) +

(unsigned long) inportb (R1) << 8 +

(unsigned long) inportb (R2) << 16 +

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

Тип файла
Документ
Размер
1,13 Mb
Тип материала
Высшее учебное заведение

Список файлов книги

Книга Разработка устройств сопряжения по микропроцессорной технике
Свежие статьи
Популярно сейчас
Почему делать на заказ в разы дороже, чем купить готовую учебную работу на СтудИзбе? Наши учебные работы продаются каждый год, тогда как большинство заказов выполняются с нуля. Найдите подходящий учебный материал на СтудИзбе!
Ответы на популярные вопросы
Да! Наши авторы собирают и выкладывают те работы, которые сдаются в Вашем учебном заведении ежегодно и уже проверены преподавателями.
Да! У нас любой человек может выложить любую учебную работу и зарабатывать на её продажах! Но каждый учебный материал публикуется только после тщательной проверки администрацией.
Вернём деньги! А если быть более точными, то автору даётся немного времени на исправление, а если не исправит или выйдет время, то вернём деньги в полном объёме!
Да! На равне с готовыми студенческими работами у нас продаются услуги. Цены на услуги видны сразу, то есть Вам нужно только указать параметры и сразу можно оплачивать.
Отзывы студентов
Ставлю 10/10
Все нравится, очень удобный сайт, помогает в учебе. Кроме этого, можно заработать самому, выставляя готовые учебные материалы на продажу здесь. Рейтинги и отзывы на преподавателей очень помогают сориентироваться в начале нового семестра. Спасибо за такую функцию. Ставлю максимальную оценку.
Лучшая платформа для успешной сдачи сессии
Познакомился со СтудИзбой благодаря своему другу, очень нравится интерфейс, количество доступных файлов, цена, в общем, все прекрасно. Даже сам продаю какие-то свои работы.
Студизба ван лав ❤
Очень офигенный сайт для студентов. Много полезных учебных материалов. Пользуюсь студизбой с октября 2021 года. Серьёзных нареканий нет. Хотелось бы, что бы ввели подписочную модель и сделали материалы дешевле 300 рублей в рамках подписки бесплатными.
Отличный сайт
Лично меня всё устраивает - и покупка, и продажа; и цены, и возможность предпросмотра куска файла, и обилие бесплатных файлов (в подборках по авторам, читай, ВУЗам и факультетам). Есть определённые баги, но всё решаемо, да и администраторы реагируют в течение суток.
Маленький отзыв о большом помощнике!
Студизба спасает в те моменты, когда сроки горят, а работ накопилось достаточно. Довольно удобный сайт с простой навигацией и огромным количеством материалов.
Студ. Изба как крупнейший сборник работ для студентов
Тут дофига бывает всего полезного. Печально, что бывают предметы по которым даже одного бесплатного решения нет, но это скорее вопрос к студентам. В остальном всё здорово.
Спасательный островок
Если уже не успеваешь разобраться или застрял на каком-то задание поможет тебе быстро и недорого решить твою проблему.
Всё и так отлично
Всё очень удобно. Особенно круто, что есть система бонусов и можно выводить остатки денег. Очень много качественных бесплатных файлов.
Отзыв о системе "Студизба"
Отличная платформа для распространения работ, востребованных студентами. Хорошо налаженная и качественная работа сайта, огромная база заданий и аудитория.
Отличный помощник
Отличный сайт с кучей полезных файлов, позволяющий найти много методичек / учебников / отзывов о вузах и преподователях.
Отлично помогает студентам в любой момент для решения трудных и незамедлительных задач
Хотелось бы больше конкретной информации о преподавателях. А так в принципе хороший сайт, всегда им пользуюсь и ни разу не было желания прекратить. Хороший сайт для помощи студентам, удобный и приятный интерфейс. Из недостатков можно выделить только отсутствия небольшого количества файлов.
Спасибо за шикарный сайт
Великолепный сайт на котором студент за не большие деньги может найти помощь с дз, проектами курсовыми, лабораторными, а также узнать отзывы на преподавателей и бесплатно скачать пособия.
Популярные преподаватели
Добавляйте материалы
и зарабатывайте!
Продажи идут автоматически
6451
Авторов
на СтудИзбе
305
Средний доход
с одного платного файла
Обучение Подробнее