Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Методичка пргр МП.docx
Скачиваний:
11
Добавлен:
01.07.2025
Размер:
16 Мб
Скачать
☆

Б.3 Лабораторная работа № 3 «Последовательный интерфейс rs-232. Uart»

Б.3.1 Задание

Разработать и написать драйверы последовательного канала для учебнолабораторного стенда SDK-1.1 с использованием и без использования прерываний. Написать тестовую программу для разработанных драйверов, которая выполняет определенную вариантом задачу.

Б.3.2 Особенности последовательного интерфейса в микроконтроллере с ядром MCS-51

Последовательный порт в микроконтроллерах MCS-51 позволяет осуществлять последовательный дуплексный ввод-вывод в синхронном и асинхронном режимах с разными скоростями обмена. Помимо обычного вводавывода, в нем предусмотрена аппаратная поддержка взаимодействия нескольких микроконтроллеров.

Схематически контроллер последовательного порта представлен на рис. 130. Как видно из рисунка, регистр SBUF, доступный пользователю для чтения и записи, есть на самом деле два регистра, в один из которых можно только записывать, а из другого – читать. Контроллер позволяет дуплексный обмен данными, т.е. одновременно может передавать и принимать информацию по линиям TxD (P3.1) и RxD (P3.0) соответственно.

Передача инициируется записью в SBUF байта данных. Этот байт переписывается в сдвиговый регистр, из которого пересылается бит за битом. Как только байт будет переслан целиком, устанавливается флаг TI, сигнализирующий о том, что контроллер готов к передаче очередного байта.

Прием осуществляется в обратном порядке: после начала процесса приема принятые биты данных последовательно сдвигаются в сдвиговом регистре, пока не будет принято их установленное количество, затем содержимое сдвигового регистра переписывается в SBUF и устанавливается флаг RI. После этого возможен прием следующей последовательности бит. Необходимо отметить, что запись принятого байта из сдвигового регистра в SBUF происходит только при условии, что RI=0, поэтому при заборе пользовательской программой очередного байта из SBUF ей необходимо сбрасывать этот флаг, иначе принятый в сдвиговый регистр, но не записанный в SBUF, следующий байт будет безвозвратно утерян.

Контроллер последовательного порта может работать в одном из четырех режимов (один синхронный и три асинхронных), различающихся скоростями обмена (бод) и количеством передаваемых/принимаемых бит:

Режим 0 (синхронный): данные передаются и принимаются через RxD, TxD является синхронизирующим (выдает импульсы сдвига). Скорость в этом режиме фиксирована (1/12 частоты тактового генератора).

Режим 1 (8 бит данных, асинхронный, переменная скорость). Передаются 10 бит: старт-бит, 8 бит данных (SBUF) и стоп-бит.

Режим 2 (9 бит данных, асинхронный, фиксированная скорость). Передаются 11 бит: старт-бит, 8 бит (SBUF), бит TB8/RB8 (посылка/прием соответственно) и 1 стоп-бит. Биты TB8 и RB8 содержатся в регистре SCON (биты 3 и 2 соответственно), первый устанавливается программно, а второй содержит 9-й бит принятой комбинации. С помощью них можно организовать, например, контроль четности или обмен с двумя стоп-битами.

Режим 3 (9 бит данных, асинхронный, переменная скорость). То же, что и режим 2, только скорость обмена переменная.

В режиме 1 и 3 используются Таймер 0 и/или Таймер 1 для настройки скорости обмена.

Б.3.3 Организация буферизированного последовательного ввода-вывода в стенде SDK-1.1

В микроконтроллере ADuC812 прерывание от последовательного канала имеет номер 4, адрес-вектор 0x23 и генерируется контроллером последовательного порта во время установки флага TI или RI. Чтобы разрешить это прерывание, нужно установить биты ES и EA регистра IEN0.

Управление обработчику прерывания передается тогда, когда UART либо готов к передаче очередного байта (TI=1), либо принял байт из канала (RI=1). При использовании этой схемы появляется проблема посылки первого байта.

Пусть прикладная программа желает послать байт, когда очередь WFIFO пуста и в порт данные не записывались длительное время (TI=0). Так как обработчик прерываний, обслуживающий очередь, вызывается только при установленных флагах RI или TI, прикладной программе придется либо самой записать первый байт в SBUF (начав тем самым процесс передачи), либо, записав байты для передачи в очередь WFIFO, искусственно установить флаг TI (вызвав тем самым обработчик, который обслужит очередь). Проблема разрешима, однако при ее решении необходимо учитывать, что TI также сброшен, когда контроллер занят посылкой байта, даже если очередь (WFIFO) пуста (посылка последнего байта в очереди).

Б.3.4 Организация программы

На рис. 132 изображены основные компоненты программы, которая должна быть результатом выполнения задания: драйвер последовательного канала; разборщик/преобразователь данных, переданных (принятых) по UART; пользовательский процесс, в котором выполняется прикладная задача.

Рис. 132. Основные составляющие программы

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

Драйвер последовательного канала по прерыванию состоит из функции инициализации UART, обработчика прерывания от UART, циклических буферов чтения и записи, API-функций: чтения байта из последовательного канала и записи байта в последовательный канал. Взаимодействие обработчика и APIфункций осуществляется только через буфер. Обработчик взаимодействует с последовательным каналом напрямую. Если прерывание вызвано приходом байта по последовательному каналу, то обработчик записывает байт в буфер чтения RFIFO. Если прерывание вызвано окончанием передачи, то обработчик проверяет состояние буфера записи WFIFO, и, если он не пуст, считывает и пересылает следующий байт.

Рис. 133. Компоненты драйвера последовательного канала, организующего обмен данными по прерыванию

Функция чтения байта ReadUART() проверяет состояние буфера RFIFO, и если он не пуст, считывает из него байт. Функция WriteUART() записывает байт в буфер записи последовательного канала WFIFO. Если до записи буфер был пуст, необходимо аппаратно вызвать обработчик прерывания, чтобы инициировать передачу данных. В случае, когда к моменту записи в буфере уже находятся какие-либо данные, обработчик вызывать не надо, так как запись была инициирована раньше и в данный момент последовательный канал занят передачей данных, записанных в буфер ранее.

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

Кроме того, для выполнения задания требуется использовать драйвер DIPпереключателей и светодиодных индикаторов.

Б.3.5 Организация обработчика прерывания UART

Окончание передачи байта и окончание приема байта по последовательному каналу вызывают одно и тоже прерывание и в обработчике два этих прерывания различаются программно. Обработчик логически разделен на две части: одна работает при установленном флаге RI (окончание приема), а другая при установленном флаге TI (окончание передачи). Ниже приведен шаблон обработчика прерывания последовательного канала:

//////////////////////// SIO_ISR //////////////////////////////

// Обработчик прерывания UART.

// Вход: нет.

// Выход: нет.

// Результат: нет.

////////////////////////////////////////////////////////////// void SIO_ISR( void ) __interrupt ( 4 )

{ if(TI)

{

// Передача байта

// Читаем WFIFO (буфер передачи) и записываем его в SBUF

} if(RI)

{

// Прием байта

// Читаем SBUF и записываем его в RFIFO (буфер приема)

}

}

Кроме того, функция SetVector должна быть такой (см. лабораторную работу № 2):

//////////////////////// SetVector ////////////////////////// // Функция, устанавливающая вектор прерывания в

// пользовательской таблице прерываний.

// Вход:

// Vector – адрес обработчика прерывания,

// Address – вектор пользовательской таблицы прерываний.

// Выход: нет.

// Результат: нет.

////////////////////////////////////////////////////////////// void SetVector(unsigned char xdata * Address, void * Vector)

{

unsigned char xdata * TmpVector;

*Address = 0x02;

TmpVector = (unsigned char xdata *) (Address + 1);

*TmpVector = (unsigned char) ((unsigned short)Vector >> 8);

++TmpVector;

*TmpVector = (unsigned char) Vector; }

Б.3.6 Описание работы

Данная лабораторная работа посвящена изучению организации и принципов работы контроллера последовательного канала UART микроконтроллера ADuC812 стенда SDK-1.1.

В рамках лабораторной работы необходимо разработать программу для контроллера SDK-1.1 (ведомый), который обменивается данными с персональным компьютером (ведущий). В качестве канала связи используется последовательный канал RS-232. На стороне персонального компьютера имеется инструментальное средство для обеспечения взаимодействия с SDK-1.1 – это терминальная программа M3P. С описанием инструментальной системы (G)M3P можно ознакомиться в соответствующем руководстве пользователя.

Программа должна выполнять две задачи в соответствии с вариантом задания. Первая задача выполняется при помощи драйвера последовательного канала, работающего по опросу, – это реализация так называемого ―эха‖: со стороны персонального компьютера передаются символы контроллеру SDK-1.1, на которые контроллер отвечает определенным образом (см. вариант задания). Вторая задача выполняется при помощи драйвера последовательного канала, реализованного в режиме прерываний с буферизацией байтов в буфере FIFO (см. [51], IOS2003_lab4.pdf). Такой задачей является реализация устройства, которое выполняет одну арифметическую операцию над десятичными числами, или конвертора из одной системы счисления в другую. Переключение между двумя задачами в программе должно быть выполнено с использованием DIPпереключателей (лабораторная работа № 1).

Рекомендации к выполнению работы:

  1. Написать драйвер последовательного канала по опросу и простую тестовую программу для него.

  2. Написать драйвер последовательного канала, осуществляющий асинхронный обмен данными по прерыванию, и отладить при помощи уже написанной тестовой программы (см. п. 1).

  3. Написать тестовую программу для разработанных драйверов, которая выполняет две задачи в соответствии с вариантом задания.

Б.3.7 Требования к выполнению работы

  1. В тестовой программе должна быть продемонстрирована работа с последовательным интерфейсом и по опросу, и асинхронно по прерыванию, т.е. должны быть реализованы и использованы драйверы UART двух видов для решения двух разных задач, указанных в варианте задания.

  2. Разрабатываемые драйверы устройств должны быть выполнены в виде отдельных программных модулей (файлов), содержащих функции по работе с заданным одним устройством.

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

  4. В программе должны быть использованы механизмы взаимного исключения (см. [51], IOS2003_lab4.pdf).

  5. Текст программы должен соответствовать правилам оформления программ на языке Си, приведенным в приложении (Приложение Г. Требования к оформлению программ на языке Си, [95]).

Б.3.8 Содержание отчета

  1. Титульный лист.

  2. Номер варианта, задание.

  3. Иллюстрация организации и функционирования разработанного программного обеспечения (драйверы, тестовая программа) в виде блок-схемы, диаграммы процессов, потоков данных, диаграммы состояний автоматов и других способов структурного и поведенческого описания программы (по выбору студента).

  4. Исходный текст программы с комментариями.

  5. Основные результаты.

Б.3.9 Литература

Литература к лабораторной работе: [37], [38], [50], [51], [54], [75], [88], [3].

Б.3.10 Варианты заданий

Каждый вариант состоит из двух частей: первая выполняется с использованием драйвера последовательного канала по опросу, вторая – по прерыванию. Переключение между двумя частями в тестовой программе должно быть выполнено с использованием DIP-переключателей (лабораторная работа № 1).

  1. Скорость последовательного канала – 9600 бит/с.

Каждый принятый по последовательному каналу символ (от персонального компьютера к SDK-1.1) передается в утроенном виде в обратную сторону (от SDK-1.1 к персональному компьютеру) и отображается в терминальной программе. Причем все символы русского алфавита отображаются в нижнем регистре, все символы английского алфавита – в верхнем регистре. Например, на символ ‗л‘ (‗Л‘) ответом является ‗ллл‘, ‗1‘ – ‗111‘, ‗i‘ (‗I‘) – ‗III‘ и т.д.

Конвертор из десятичной в двоичную систему счисления. Диапазон преобразуемых значений – от 010 до 25510 включительно. 8-разрядная сетка для отображения двоичных чисел. Контроллеру SDK-1.1 по последовательному каналу со стороны персонального компьютера с использованием терминальной программы передается десятичное число для конвертирования, причем число это отображается в терминале, а концом ввода является перевод на следующую строку (<CR><LF>). После чего контроллер возвращает результат преобразования числа в двоичную систему счисления, который отображается в терминале персонального компьютера и на светодиодных индикаторах стенда SDK-1.1 (лабораторная работа № 1). Каждое новое преобразование начинается с новой строки. Сигнализация в случае ввода некорректных значений – сообщение об ошибке в последовательный канал.

  1. Скорость последовательного канала – 9600 бит/с. Со стороны персонального компьютера с использованием терминальной программы контроллеру SDK-1.1 по последовательному каналу передается любой символ русского алфавита в любом регистре (‗а‘, ‗Б‘, ‗в‘,…, ‗Я‘). В ответ контроллер SDK-1.1 передает принятый символ в верхнем регистре и 5 символов русского алфавита, следующих за введенным, в нижнем регистре. Все остальные вводимые символы игнорируются контроллером SDK-1.1. Например, на символ ‗к‘ (или ‗К‘) ответом является ‗Клмноп‘, ‗у‘ (‗У‘) – ‗Уфхцчш‘, ‗э‘ (‗Э‘) – ‗Эюя‘ и т.д. Каждому обмену данными между персональным компьютером и стендом SDK-1.1 назначается отдельная строка.

Сумматор десятичных чисел. Диапазон значений слагаемых – от 010 до 9910 включительно. Контроллеру SDK-1.1 по последовательному каналу со стороны персонального компьютера с использованием терминальной программы передаются два слагаемых (десятичные числа), причем разделителем слагаемых является символ сложения (‗+‘), концом ввода является символ равенства (‗=‗), получившееся выражение отображается в терминале персонального компьютера. После чего контроллер возвращает результат сложения, который отображается в терминале. Каждое новое выражение начинается с новой строки. Сигнализация в случае ввода некорректных значений – сообщение об ошибке в последовательный канал.

  1. Скорость последовательного канала – 4800 бит/с.

Со стороны персонального компьютера с использованием терминальной программы контроллеру SDK-1.1 по последовательному каналу передается любой символ английского алфавита в нижнем регистре (‗a‘, ‗b‘, ‗c‘,…, ‗z‘). В ответ контроллер SDK-1.1 передает принятый символ в нижнем регистре и 5 символов английского алфавита, следующих за введенным, в верхнем регистре. Все остальные вводимые символы игнорируются контроллером SDK-1.1. Например, на символ ‗u‘ ответом является ‗uVWXYZ‘, ‗m‘ – ‗mNOPQRS‘, ‗w‘ – ‗wXYZ‘ и т.д. Каждому обмену данными между персональным компьютером и стендом SDK-1.1 назначается отдельная строка.

Конвертор из шестнадцатеричной в двоичную систему счисления. Диапазон преобразуемых значений – от 016 до FF16 включительно. 8-разрядная сетка для отображения двоичных чисел. Контроллеру SDK-1.1 по последовательному каналу со стороны персонального компьютера с использованием терминальной программы передается шестнадцатеричное число для конвертирования, причем число это отображается в терминале, а концом ввода является перевод на следующую строку (<CR><LF>). После чего контроллер возвращает результат преобразования числа в двоичную систему счисления, который отображается в терминале персонального компьютера и на светодиодных индикаторах стенда SDK-1.1 (лабораторная работа № 1). Каждое новое преобразование начинается с новой строки. Сигнализация в случае ввода некорректных значений – сообщение об ошибке в последовательный канал.

  1. Скорость последовательного канала – 4800 бит/с.

На каждый принятый по последовательному каналу символ (от персонального компьютера к SDK-1.1) в ответ передается этот же символ и 2 следующих за ним символа согласно таблице ASCII (от SDK-1.1 к персональному компьютеру) и отображается в терминальной программе. Причем все символы русского алфавита отображаются в верхнем регистре, все символы английского алфавита – в нижнем регистре. Например, на символ ‗л‘ (‗Л‘) ответом является ‗ЛМН‘, ‗1‘ – ‗123‘, ‗i‘ (‗I‘) – ‗ijk‘ и т.д.

Вычитатель десятичных чисел. Диапазон значений уменьшаемого и вычитаемого – от 010 до 9910 включительно. Разность может быть как положительной, так и отрицательной. Контроллеру SDK-1.1 по последовательному каналу со стороны персонального компьютера с использованием терминальной программы передаются уменьшаемое и вычитаемое (десятичные числа), причем разделителем введенных значений является символ вычитания (‗-‘), концом ввода является символ равенства (‗=‗), получившееся выражение отображается в терминале персонального компьютера. После чего контроллер возвращает результат операции, который отображается в терминале. Каждое новое выражение начинается с новой строки. Сигнализация в случае ввода некорректных значений – сообщение об ошибке в последовательный канал.

  1. Скорость последовательного канала – 1200 бит/с. Со стороны персонального компьютера с использованием терминальной программы контроллеру SDK-1.1 по последовательному каналу передается любой числовой символ (‗0‘, ‗1‘, ‗2‘,…, ‗9‘). В ответ контроллер SDK-1.1 передает принятый символ и все остальные числовые символы, следующие за введенным. Все остальные вводимые символы игнорируются контроллером SDK-1.1. Например, на символ ‗4‘ ответом является ‗456789‘, ‗8‘ – ‗89‘, ‗1‘ – ‗123456789‘ и т.д. Каждому обмену данными между персональным компьютером и стендом SDK-1.1 назначается отдельная строка.

Конвертор из десятичной в шестнадцатеричную систему счисления. Диапазон преобразуемых значений – от 010 до 25510 включительно. Контроллеру SDK-1.1 по последовательному каналу со стороны персонального компьютера с использованием терминальной программы передается десятичное число для конвертирования, причем число это отображается в терминале, а концом ввода является перевод на следующую строку (<CR><LF>). После чего контроллер возвращает результат преобразования числа в шестнадцатеричную систему счисления, который отображается в терминале персонального компьютера. Каждое новое преобразование начинается с новой строки. Сигнализация в случае ввода некорректных значений – сообщение об ошибке в последовательный канал и зажигание светодиодов (лабораторная работа № 1).

  1. Скорость последовательного канала – 1200 бит/с. На каждый принятый по последовательному каналу символ (от персонального компьютера к SDK-1.1) в ответ передается этот же символ и 2 предшествующих ему символа согласно таблице ASCII (от SDK-1.1 к персональному компьютеру) и отображается в терминальной программе. Причем все символы русского алфавита отображаются в верхнем регистре, все символы английского алфавита – в нижнем регистре. Например, на символ ‗л‘ (‗Л‘) ответом является ‗ЛКЙ‘, ‗5‘ – ‗543‘, ‗i‘ (‗I‘) – ‗ihg‘ и т.д.

Умножитель десятичных чисел. Диапазон значений множителей – от 010 до 9910 включительно. Контроллеру SDK-1.1 по последовательному каналу со стороны персонального компьютера с использованием терминальной программы передаются множители (десятичные числа), причем разделителем введенных значений является символ умножения (‗*‘), концом ввода является символ равенства (‗=‗), получившееся выражение отображается в терминале персонального компьютера. После чего контроллер возвращает результат операции, который отображается в терминале. Каждое новое выражение начинается с новой строки. Сигнализация в случае ввода некорректных значений – сообщение об ошибке в последовательный канал и зажигание светодиодов (лабораторная работа № 1).

  1. Скорость последовательного канала – 2400 бит/с.

Со стороны персонального компьютера с использованием терминальной программы контроллеру SDK-1.1 по последовательному каналу передается любой символ английского алфавита в нижнем регистре (‗a‘, ‗b‘, ‗c‘,…, ‗z‘). В ответ контроллер SDK-1.1 передает принятый символ в нижнем регистре и все символы английского алфавита, предшествующие введенному, в верхнем регистре. Все остальные вводимые символы игнорируются контроллером SDK-1.1. Например, на символ ‗f‘ ответом является ‗fEDCBA‘, ‗j‘ – ‗jIHGFEDCBA‘, ‗p‘ – ‗pONMLKJIHGFEDCBA‘ и т.д. Каждому обмену данными между персональным компьютером и стендом SDK-1.1 назначается отдельная строка.

Конвертор из шестнадцатеричной в десятичную систему счисления. Диапазон преобразуемых значений – от 016 до FF16 включительно. Контроллеру SDK-1.1 по последовательному каналу со стороны персонального компьютера с использованием терминальной программы передается шестнадцатеричное число для конвертирования, причем число это отображается в терминале, а концом ввода является перевод на следующую строку (<CR><LF>). После чего контроллер возвращает результат преобразования числа в десятичную систему счисления, который отображается в терминале персонального компьютера. Каждое новое преобразование начинается с новой строки. Сигнализация в случае ввода некорректных значений – сообщение об ошибке в последовательный канал и зажигание светодиодов (лабораторная работа № 1).

  1. Скорость последовательного канала – 2400 бит/с. Со стороны персонального компьютера с использованием терминальной программы контроллеру SDK-1.1 по последовательному каналу передается любой числовой символ (‗0‘, ‗1‘, ‗2‘,…, ‗9‘). В ответ контроллер SDK-1.1 передает принятый символ и все остальные числовые символы, предшествующие введенному. Все остальные вводимые символы игнорируются контроллером SDK-1.1. Например, на символ ‗4‘ ответом является ‗43210‘, ‗8‘ – ‗876543210‘, ‗1‘ – ‗10‘ и т.д. Каждому обмену данными между персональным компьютером и стендом SDK-1.1 назначается отдельная строка.

Целочисленный делитель десятичных чисел. Диапазон значений делимого и делителя – от 010 до 9910 включительно. Контроллеру SDK-1.1 по последовательному каналу со стороны персонального компьютера с использованием терминальной программы передаются делимое и делитель (десятичные числа), причем разделителем введенных значений является символ деления (‗/‘), концом ввода является символ равенства (‗=‗), получившееся выражение отображается в терминале персонального компьютера. После чего контроллер возвращает частное, которое отображается в терминале. Каждое новое выражение начинается с новой строки. Сигнализация в случае ввода некорректных значений – сообщение об ошибке в последовательный канал и зажигание светодиодов (лабораторная работа №

1).