- •Оглавление
- •Организация системы ввода-вывода вычислительной системы ...... 10
- •Способы обмена информацией между устройствами
- •Аппаратные интерфейсы вычислительных систем ..................................... 68
- •Интерфейс rs-485 ........................................................................................... 175
- •Введение
- •Организация системы ввода-вывода вычислительной системы
- •Основы архитектурной организации вычислительной системы
- •1.1.2 Достоинства и недостатки Принстонской архитектуры
- •1.1.1 Принципы Фон-Неймановской архитектуры
- •1.1.3 Достоинства и недостатки Гарвардской архитектуры
- •Организация вычислительной системы. Элементы вычислительного ядра и системы ввода-вывода
- •1.2.1 Процессор и память
- •1.2.2 Контроллер ввода-вывода
- •1.2.3 Процессор ввода-вывода
- •1.2.4 Интерфейс и протокол
- •1.2.5 Порт ввода-вывода
- •1.2.5.1 Адресное пространство портов ввода-вывода: единое с оперативной памятью и раздельное
- •1.2.5.2 Организация конфигурируемых параллельных портов вводавывода
- •Принципы организации систем ввода-вывода
- •1.3.1 Организация свв универсальных эвм
- •1.3.2.1 Порты ввода-вывода
- •1.3.2.2 Дискретные порты ввода-вывода
- •1.3.2.3 Однонаправленные порты
- •1.3.2.4 Двунаправленные порты и порты с альтернативной функцией
- •1.3.2.7 Устройства сопряжения с объектом (усо) управляющих эвм
- •Способы обмена информацией между устройствами вычислительной системы
- •Программно управляемые:
- •В режиме прямого доступа (без участия центральных процессоров).
- •Синхронный обмен данными
- •Асинхронный обмен данными с программной проверкой готовности
- •Асинхронный обмен данными с аппаратной проверкой готовности
- •2.3.1 Система прерываний
- •2.3.4 Аппаратный полинг
- •2.3.5 Характеристики систем прерываний
- •2.3.6 Контроллер прерываний 8259a
- •Организация обмена в режиме прямого доступа
- •2.4.1 Общие принципы организации пдп
- •Аппаратные интерфейсы вычислительных систем
- •Характеристики аппаратных интерфейсов
- •Функции аппаратных интерфейсов
- •Классификация аппаратных интерфейсов
- •Системные интерфейсы.
- •Стандартные периферийные интерфейсы.
- •Малые периферийные интерфейсы.
- •Понятие интерфейсных систем
- •Реализация аппаратных интерфейсов: проблемы и технические решения
- •3.5.1 Электромагнитные помехи
- •3.5.2 Характеристики линии связи
- •3.5.3.1 Коаксиальный кабель
- •3.5.3.2 Витая пара
- •3.5.3.3 Плоский кабель
- •3.5.3.4 Полосковые линии связи
- •3.5.5 Симметричная и несимметричная схема передачи сигналов
- •3.5.5.1 Дифференциальный сигнал
- •3.5.5.3 Симметричная передача сигнала
- •3.5.6.1 Потенциальный код без возвращения к нулю
- •3.5.6.2 Метод биполярного кодирования с альтернативной инверсией
- •3.5.6.3 Потенциальный код с инверсией при единице
- •3.5.6.4 Биполярный импульсный код
- •3.5.6.5 Манчестерский код
- •3.5.6.6 Потенциальный код 2b1q
- •3.5.7 Приемопередатчик последовательного интерфейса
- •3.5.8 Особенности параллельных интерфейсов
- •3.5.9 Мультиплексирование, конвейеризация, блочная передача
- •3.5.10.2 Реализация гальванической изоляции дискретного выхода модуля ввода-вывода sdx-09
- •3.5.10.3 Реализация гальванической изоляции дискретного входа модуля ввода-вывода sdx-09
- •3.5.10.4 Реализация гальванической изоляции rs-232 в контроллере sdk-1.1
- •3.5.10.5 Технология iCoupler фирмы Analog Devices
- •3.5.11 Горячее подключение и автоконфигурирование
- •3.5.11.1 Горячее подключение
- •3.6 Внутрисистемный интерфейс amba
- •3.6.3 Периферийный интерфейс amba apb
- •Idle – устройство не готово, шина находится в исходном состоянии.
- •3.7 Системные интерфейсы
- •3.7.1 Интерфейс pci
- •3.7.2 Интерфейс pci Express
- •3.8 Стандартные периферийные интерфейсы
- •3.8.1 Интерфейс scsi
- •3.8.1.8 Команды scsi
- •3.8.3 Сравнение sas и параллельного scsi
- •3.8.4 Сравнение sas и sata
- •3.9 Малые периферийные интерфейсы
- •3.9.1 Интерфейс rs-232
- •3.9.1.1 Сигнальные линии последовательного интерфейса
- •3.9.1.2 Управление потоком
- •3.9.1.3 Разъемы и кабели
- •3.9.1.4 Формат последовательной передачи данных
- •3.9.1.5 Работа с последовательным каналом
- •3.9.2.1 Типы подключения к шине spi
- •3.9.2.2 Режимы работы шины spi
- •3.9.2.3 Достоинства шины spi
- •3.9.2.4 Недостатки шины spi 1. Больше линий, чем в i2c.
- •3.9.3 Интерфейс Centronics
- •3.9.4.1 Физический интерфейс Serial ata
- •3.10 Контроллерные сети
- •3.10.1 Интерфейс rs-485
- •3.10.1.1 Согласование и конфигурация линии связи
- •3.10.1.2 Защитное смещение
- •(Верхняя диаграмма), передача данных (средняя диаграмма), приѐм данных от устройства (нижняя диаграмма).
- •3.10.3 Интерфейс i2c
- •3.10.3.1 Концепция шины i2c
- •3.10.3.2 Реализация монтажного и и монтажного или
- •3.10.3.3 Принцип работы шины i2c
- •3.10.3.5 Подтверждение
- •3.10.3.6 Синхронизация
- •3.10.3.7 Форматы обмена данными по шине i2c (7-битный адрес)
- •3.10.3.8 Арбитраж
- •3.10.3.9 Достоинства шины i2c
- •3.10.4.1 Модель передачи данных
- •3.10.4.2 Протокол
- •3.11 Сети передачи данных систем обработки данных. Беспроводные сенсорные сети
- •3.11.1 Сети передачи данных
- •3.11.2 Беспроводные сенсорные сети
- •Приложение а. Система ввода-вывода учебного лабораторного стенда sdk-1.1
- •А.2 Состав стенда
- •А.3 Вычислительное ядро и система ввода-вывода
- •А.3.5.1 Матричная клавиатура
- •А.3.5.2 Жидкокристаллический индикатор
- •А .3.5.3 Светодиодные индикаторы
- •А.3.5.4 Звукоизлучатель
- •А.3.5.5 Дискретные входы-выходы
- •Приложение б. Комплекс лабораторных работ для учебного лабораторного стенда sdk-1.1 б.1 Лабораторная работа № 1 «Дискретные порты ввода-вывода»
- •Б.2 Лабораторная работа № 2 «Таймеры. Система прерываний»
- •Б.2.3.2 Пояснения для вариантов заданий с использованием звукового излучателя
- •(Слева) на принципиальной электрической схеме контроллера sdk-1.1
- •Б.3 Лабораторная работа № 3 «Последовательный интерфейс rs-232. Uart»
- •Б.4 Лабораторная работа № 4 «Клавиатура»
- •Б.5 Лабораторная работа № 5 «Жидкокристаллический индикатор»
- •Б.6 Лабораторная работа № 6 «Последовательный интерфейс i2c»
- •Приложение в. Проектирование и разработка программы
- •Приложение г. Требования к оформлению программ на языке Си г.1 Соглашения по идентификаторам
- •Г.2 Соглашения по самодокументируемости программ
- •Г.3 Соглашения по читаемости программ
- •Литература
Б.5 Лабораторная работа № 5 «Жидкокристаллический индикатор»
Б.5.1 Задание
Разработать и написать драйвер жидкокристаллического индикатора (ЖКИ) для учебно-лабораторного стенда SDK-1.1. Написать программу для разработанного драйвера, которая выполняет определенную вариантом прикладную задачу.
Б.5.2 Описание работы ЖКИ в контроллере SDK-1.1 подключен не напрямую к микроконтроллеру ADuC812, а через расширитель портов ввода-вывода, выполненный на базе ПЛИС. В ЖКИ есть специальный контроллер, формирующий необходимые напряжения на входах матрицы и осуществляющий динамическую индикацию. Для работы с этим контроллером реализован простейший интерфейс, описанный ниже (рис. 141, табл. 18). Матрица имеет 80 входов по горизонтали и 16 входов по вертикали3.
Рис. 141. Схема подключения контроллера ЖКИ к МК ADuC812
Матрица ЖКИ состоит из 32 знакомест (2 строки по 16 символов) размером 5 точек по горизонтали и 8 точек по вертикали. Для отображения различных символов внутри контроллера ЖКИ есть знакогенератор4.
Таблица 18. Интерфейс ЖКИ
Обозначение |
Описание |
RS |
Переключение между регистрами команд и данных: 1 – данные, 0 – команды |
R/W |
1– чтение (из контроллера ЖКИ), 0 – запись (в контроллер ЖКИ) |
E |
Разрешающий сигнал (1 – активный уровень). Если сигнал E = 0, то контроллер ЖКИ игнорирует все остальные сигналы |
DB0 |
Бит данных 0 |
DB1 |
Бит данных 1 |
DB2 |
Бит данных 2 |
DB3 |
Бит данных 3 |
DB4 |
Бит данных 4 |
DB5 |
Бит данных 5 |
DB6 |
Бит данных 6 |
DB7 |
Бит данных 7 |
Основными компонентами контроллера ЖКИ являются память DDRAM
(Data Display RAM), память CGRAM (Character Generator RAM), память
CGROM (Character Generator ROM), счетчик адреса, регистр команд IR (Instruction Register), регистр данных DR (Data Register). Регистр команд предназначен для записи в него таких операций, как очистка дисплея, перемещение курсора, включение/выключение дисплея, а также установка адреса памяти DDRAM и CGRAM для последующего их выполнения. Регистр данных временно хранит данные, предназначенные для записи или чтения из DDRAM или CGRAM (символы). Эти два регистра можно выбрать с помощью регистрового переключателя RS (Register Select).
Работать с ЖКИ достаточно просто. За связь с ЖКИ в расширителе портов ввода-вывода отвечают два регистра:
DATA_IND (адрес 0x080001) отвечает за выдачу информации на шину данных (через этот регистр можно передавать команды контроллеру и данные).
C_IND (адрес 0x080006) отвечает за формирование сигналов E, R/W и RS, позволяющих регулировать обмен на шине между расширителем портов и контроллером ЖКИ.
Рис. 142. Регистры, необходимые для работы с ЖКИ
На рис. 142 регистры расширителя портов изображены слева, регистры контроллера ЖКИ справа. Для доступа к регистрам контроллера ЖКИ вы должны сформировать на шине сигналы с помощью регистров расширителя портов.
Вся работа с индикатором сводится к нескольким простым вещам:
Первым шагом вы записываете команду или данные (коды выводимых символов) в регистр DATA_IND расширителя портов. После этого, содержимое этого регистра появляется на шине данных контроллера ЖКИ (DB0-DB7). Контроллер на эти данные, естественно, не реагирует, так как сигнал E (Еnable) нами еще не выставлен в активный уровень (логическая «1»).
Вторым шагом вы должны разрешить работу с шиной с помощью сигнала E (логическая «1»), выставить сигнал записи (логический «0» на линии W) и указать тип регистра, с которым вы будете работать в контроллере ЖКИ на линии RS. Если вы передаѐте данные, то на сигнал RS нужно подать «1», если команду, то «0».
Необходимо помнить, что в учебном стенде SDK-1.1 начальная инициализация контроллера ЖКИ уже выполнена в загрузчике. В реальной системе вам придется программировать ее самостоятельно.
Время выполнения команд контроллером ЖКИ не равно нулю, и это нужно учитывать в своем драйвере: опрашивать флаг готовности ЖКИ (BF). Таким образом, функции работы с ЖКИ НЕ нужно вызывать в обработчиках прерывания других периферийных устройств (например, таймера).
Данная лабораторная работа посвящена изучению жидкокристаллического индикатора (ЖКИ) стенда SDK-1.1.
В рамках лабораторной работы необходимо разработать программу для контроллера SDK-1.1, которая выполняет конкретную прикладную задачу (см. варианты задания). Реализация задачи требует знания материалов предыдущих лабораторных работ: таймеры микроконтроллера ADuC812, последовательный канал, светодиодные индикаторы, клавиатура и др.
Драйвер ЖКИ должен включать следующие функции:
Функция |
Описание |
void InitLCD(void) |
Инициализация ЖКИ. |
void WriteControlLCD( unsigned char ch) |
Запись значения в регистр управления ЖКИ С_IND (ПЛИС): ch – значение, записываемое в C_IND. |
bit ReadBFLCD(void) |
Чтение флага BF (флаг занятости контроллера ЖКИ) . |
unsigned char ClearLCD(void) |
Очистка дисплея с возвратом результата выполнения операции . |
unsigned char GotoXYLCD (unsigned char x, bit y) |
Переход в заданную позицию дисплея с возвратом результата выполнения операции: x, y – координаты позиции. |
unsigned char PrintCharLCD |
Вывод символа на дисплей с возвратом |
(unsigned char symbol) |
результата выполнения операции: symbol – выводимый символ. |
Кроме того, может быть реализована функция вывода строки на ЖКИ, функция дополнительной настройки ЖКИ (отображение, мерцание курсора).
Драйвер клавиатуры использует прерывание таймера, в котором производится опрос состояния кнопок (сканирование клавиатуры). В данном случае можно применить автоматное программирование. В драйвер клавиатуры рекомендуется включить функцию чтения нажатых кнопок из буфера, связывающего ее с обработчиком прерывания таймера. Реакции на нажатия кнопок клавиатуры должны формироваться в главной программе. Вся обработка нажатий кнопок не должна быть локализована в обработчике прерываний таймера.
Драйвер таймера должен включать следующие функции (помимо обработчика прерывания):
Функция |
Описание |
void InitTimer(void) |
Инициализация таймера. |
unsigned long GetMsCounter(void) |
Получение текущей метки времени в миллисекундах. |
unsigned long DTimeMs(unsigned long t0) |
Измерение количества миллисекунд, прошедших с временной метки t0 и до текущего времени. |
void DelayMs(unsigned long t) |
Задержка на t миллисекунд. |
Кроме того, могут быть реализованы функции работы с таймером в режиме «счетчик» (например, чтение счетчика).
Работа с последовательным каналом (приемопередатчиком UART) должна быть организована асинхронно по прерыванию. Драйвер последовательного канала включает следующие функции (помимо обработчика прерывания):
Функция |
Описание |
void InitSerial(void) |
Инициализация последовательного канала. |
unsigned char WriteSerial(unsigned char data_buf) |
Передача байта данных data_buf с возвратом результата выполнения операции . |
unsigned char ReadSerial(unsigned char* data_buf) |
Прием байта данных *data_buf с возвратом результата выполнения операции. |
unsigned char StatusSerial(void) |
Чтение признака наличия байта в буфере приема. |
Кроме того, может быть реализована функция вывода строки в последовательный канал.
Б.5.3 Требования к выполнению работы 1. Разрабатываемые драйверы устройств должны быть выполнены в виде отдельных программных модулей (файлов), содержащих функции по работе с заданным одним устройством.
На уровне драйверов (особенно обработчиков прерываний) НЕ рекомендуется смешивать работу с несколькими периферийными устройствами (например, в обработчике прерывания таймера выводить строку на ЖКИ, опрашивать DIP-переключатели и т.д.). Взаимодействие устройств ввода-вывода следует организовать на прикладном уровне с использованием API-функций их драйверов.
Должен быть предусмотрен контроль ввода корректных значений в рамках выполнения прикладной задачи.
В программе должны быть использованы механизмы взаимного исключения (см. [51], IOS2003_lab4.pdf).
Текст программы должен соответствовать правилам оформления программ на языке Си, приведенным в приложении (Приложение Г. Требования к оформлению программ на языке Си, [95]).
Б.5.4 Содержание отчета
Титульный лист.
Номер варианта, задание.
Модель написанной программы (см. Приложение В. Проектирование и разработка программы).
Разработанные протоколы, форматы данных и др.
Исходный текст программы с комментариями (можно не весь, но обязательно главная программа и полностью драйвер периферийного устройства, изучению которого была посвящена лабораторная работа).
Основные результаты.
Б.5.5 Литература
Литература к лабораторной работе: [50], [51], [57], [75], [80], [82], [88], [9], [21], [25].
Б.5.6 Варианты заданий
1. Секундомер.
Написать программу, реализующую функции электронного секундомера. Точность измерения времени – сотые доли секунды. В качестве устройства, измеряющего время, следует использовать один из внутренних таймеров микроконтроллера ADuC812. Управление секундомером должно осуществляться с клавиатуры стенда SDK-1.1:
кнопка «*» («старт/пауза») – запускает процесс измерения времени либо приостанавливает его, не сбрасывая;
кнопка «#» («сброс») – сбрасывает замеряемое время в ноль.
На ЖКИ должна отображаться четко следующая информация: замеряемое время (слева в верхней строке); минимальное из всех замеренных времен (слева в нижней строке); максимальное из всех замеренных времен (справа в нижней строке). Формат отображения времени: «SS:CC», где SS – секунды, CC – сотые доли секунды. После переполнения секундомер начинает отсчет с нуля, т.е. 99,99с 0с. Замеренный интервал времени по нажатию кнопки «пауза» должен выводиться в последовательный канал в формате, описанном ранее. Каждый интервал с новой строки. Сообщения о сбросе и переполнении секундомера тоже должны выводиться в последовательный канал (формат этих сообщений определяется студентом).
В рамках задания необходимо реализовать: драйвер таймера; драйвер последовательного канала; драйвер клавиатуры; драйвер ЖКИ.
2. Калькулятор.
Написать программу, реализующую функции простого калькулятора. Управление калькулятором должно осуществляться с клавиатуры стенда SDK-1.1:
кнопки «0 – 9» – ввод операндов; кнопка «A» – операция сложения; кнопка «B» – операция вычитания; кнопка «C» – операция умножения; кнопка «D» – операция деления; кнопка «*» – начало процесса вычисления; кнопка «#» – сброс. На ЖКИ должна выводиться следующая информация: вычисляемое выражение (например, «25+75», затем, после нажатия кнопки «*» – «25+75=100»).
Разрядная сетка операндов и результатов определяется студентом, однако должна содержать не меньше 2 десятичных разрядов и обладать возможностью легкого увеличения/уменьшения. После нажатия кнопки сброса, а также в начале работы калькулятора на индикаторе должен отображаться ноль. Каждое вычисленное выражение (по нажатию кнопки «*») должно выводиться в последовательный канал в формате, описанном ранее, и начинаться с новой строки.
В рамках задания необходимо реализовать:
драйвер последовательного канала; драйвер клавиатуры; драйвер ЖКИ.
Текстовый редактор.
Написать программу, реализующую функции простого текстового редактора. Ввод текста должен осуществляться с клавиатуры стенда SDK-1.1 кнопками «0 – 9». Таким образом, текст может состоять только из цифровых символов. Объем вводимого текста не должен превышать 8 строк по 16 символов, при этом ЖКИ отображает только две соседние строки. Номер текущей строки должен отображаться на светодиодном индикаторе (первая строка – первый светодиод, вторая строка – второй светодиод и т.д.). Перемещение по тексту осуществляется с помощью курсора, управляемого клавишами «A» (влево), «B» (вправо), «C» (вверх) и «D» (вниз). Ввод текста производится в позицию, указываемую курсором, при этом все символы находящиеся правее введенного символа сдвигаются, курсор перемещается (как в обычном текстовом редакторе). В качестве клавиши перевода строки выступает кнопка «*», удаление символов должно производиться кнопкой «#».
В рамках задания необходимо реализовать: драйвер светодиодных индикаторов; драйвер клавиатуры; драйвер ЖКИ.
Бегущая строка.
Написать программу, реализующую эффект «бегущей строки». Эффект заключается в постепенном смещении отображаемой на ЖКИ строки по кругу (вправо или влево). Управление «бегущей строкой» должно осуществляться с клавиатуры стенда SDK-1.1:
кнопка «A» – смена направления движения текста;
кнопка «B» – смена строки ЖКИ, по которой двигается («бежит») текст, причем смена должна производиться немедленно;
кнопки «C» и «D» – изменяют скорость движения текста (диапазон значений: 1 – 10 позиций в секунду).
Для формирования скорости движения строки обязательным является использование таймера микроконтроллера ADuC812. Движение текстовой строки реализуется таким образом, чтобы исчезающая из области видимости часть текста появлялась постепенно с противоположной стороны строки ЖКИ. Кроме того, отображение «бегущей строки» должно быть плавным, четким, без образованных движением текста «хвостов».
По нажатию кнопки «*» программа переходит в режим ввода новой текстовой строки. Ввод производится с помощью кнопок «0 – 9». Таким образом, вводимый текст может состоять только из цифровых символов. При вводе должна контролироваться длина текста (не менее 1 и не более 16 символов). Завершение ввода строки производится кнопкой «*». Отмена ввода – кнопка «#». Исполнение программы должно начинаться с прокручивания в верхней строке ЖКИ слева направо текста «SDK-1.1».
В рамках задания необходимо реализовать:
драйвер таймера; драйвер клавиатуры; драйвер ЖКИ.
5. Монитор состояний устройств.
Написать программу, реализующую монитор состояний устройств стенда SDK-1.1. Программа должна отражать состояние следующих трех устройств:
DIP-переключатели (линии 0-7 дискретного параллельного порта ПЛИС): отображается состояние DIP-переключателей в двоичной системе счисления;
таймер-счетчик: отображается количество перепадов на счетном входе T0 или T1, вызываемых замыканием соответствующих DIP-переключателей (см. рис. 129);
таймер: отображается системное время, прошедшее с момента старта программы в миллисекундах.
Программа должна работать в двух режимах: автоматическом и ручном. Смена режима работы должна производиться нажатием кнопки «*» на клавиатуре стенда SDK-1.1. В автоматическом режиме отображение состояний устройств производится циклически с интервалом 3 секунды по умолчанию. Данный интервал должен изменяться с помощью кнопок «C» и «D». На ЖКИ состояние каждого устройства должно выглядеть следующим образом: в верхней строке – название устройства, в нижней строке – текущее состояние устройства.
В ручном режиме смена отображения состояния устройств должна производиться нажатием кнопки «#».
Кроме того, каждые 2 секунды (может быть другой приемлемый интервал времени) в последовательный канал должно выводиться текущее состояние всех устройств в виде одной строки, формат строки – свободный.
В рамках задания необходимо реализовать: драйвер DIP-переключателей; драйвер таймера/счетчика; драйвер последовательного канала; драйвер клавиатуры (может быть реализован без переповторов, т.е. по принципу «кнопка нажата или нет»); драйвер ЖКИ.
