Последовательный протокол uart. Изучение последовательного порта UART

Последовательный протокол uart. Изучение последовательного порта UART

14.06.2019

Истерии появилось множество вопросов, как подключить плату к компьютеру. И многие люди даже не понимают, что же такое UART. И я решил рассказать здесь какой это мощный инструмент.

Роутер превращается в компьютер, если к нему по UART подключить клавиатуру и дисплей

От телеграфа к COM-порту

Протокол UART (Universal asynchronous receiver/transmitter) или, по-русски, УАПП (универсальный асинхронный приемопередатчик) - старейший и самый распространенный на сегодняшний день физический протокол передачи данных. Наиболее известен из семейства UART протокол RS-232 (в народе – COM-порт, тот самый который стоит у тебя в компе). Это, наверное, самый древний компьютерный интерфейс. Он дожил до наших дней и не потерял своей актуальности.

Надо сказать, что изначально интерфейс УАПП появился в США как средство для передачи телеграфных сообщений, и рабочих бит там было пять (как в азбуке Морзе). Для передачи использовались механические устройства. Потом появились компьютеры, и коды ASCII, которые потребовали семь бит. В начале 60-х на смену пришла всем известная 8-битная таблица ASCII, и тогда формат передачи стал занимать полноценный байт, плюс управляющие три бита.

В 1971 году, когда уже начался бум микросхем, Гордон Белл для компьютеров PDP фирмы Western Digital сделал микросхему UART WD1402A. Примерно в начале 80-х фирмой National Semiconductor был создан чип 8520. В 90-е был придуман буфер к интерфейсу, что позволило передавать данные на более высоких скоростях. Этот интерфейс, не претерпев практически никаких изменений, дошел и до наших дней

Физика интерфейса

Чтобы понять, что роднит и отличает разные UART-интерфейсы, разберем принцип работы самого популярного и любимого нами протокола RS-232. Дотошно расписывать все тонкости его работы я не буду. Об этом написан ни один десяток мегабайт статей, и если ты умеешь пользоваться Гуглом, то без проблем найдешь всю необходимую информацию. Но основы я расскажу, благо с ними можно уже круто всем рулить, а всякие фишки используются очень редко.

Основные рабочие линии у нас – RXD и TXD, или просто RX и TX. Передающая линия – TXD (Transmitted Data), а порт RXD (Received Data) – принимающая.
Эти линии СОМ-порта задействованы при передаче без аппаратного управления потоком данных. При аппаратном потоке задействованы еще дополнительные интерфейсные линии (DTS, RTS и пр.). Выход передатчика TX соединен с входом приемника RX и наоборот. Электрический принцип работы RS-232 отличается от стандартной 5-вольтовой TTL логики. В этом протоколе логический нуль лежит от +3 до +12 вольт, а единица от -3 до -12, соответственно. Промежуток от -3 до +3 вольт считается зоной неопределенности. Учти, что все напряжения указаны относительно корпуса компьютера, или земли. Теперь, я думаю, ты понимаешь, зачем в компьютерном блоке питания существует сразу два напряжения: -12 и +12 вольт. Они были введены специально для работы СОМ-порта.


Приём сигнала по RS-232 (взято из книги М.Гук «Аппаратные интерфейсы ПК»)

Такая большая амплитуда рабочих напряжений, целых 24 вольта, нужна в первую очередь для помехоустойчивости линий связи. По стандарту, длина кабеля, по которому у нас бегают данные, может быть 15 м. Хотя на практике люди умудрялись заставлять его работать даже на 25 м. Электрические параметры RS-232 – это главная характеристика, которая отличает его от других протоколов семейства UART.

Следующие характеристики – формат посылки и скорость передачи данных – полностью применимы ко всем видам UART и обеспечивают их совместимость через несложные схемы сопряжения.

Стандартная посылка занимает 10 бит. Но правило это распространяется только на стандартные настройки СОМ-порта. В принципе, его можно перенастроить так, чтобы он даже интерфейс One-Wire понимал. В режиме простоя, когда по линии ничего не передается, она находится в состоянии логической единицы, или -12 вольт. Начало передачи обозначают передачей стартового бита, который всегда равен нулю. Затем идет передача восьми бит данных. Завершает посылку бит четности и стоповый бит. Бит четности осуществляет проверку переданных данных. Стартовый бит говорит нам, что пересылка данных завершена. Надо отметить, что STOP-бит может занимать 1, 1.5, и 2 бита. Не стоит думать, что это дробные биты, это число говорит только о его длительности. Стоповый бит, как и стартовый, равен нулю.


Сигнал UART на экране осциллографа. Виден старт бит, данные и стоповый бит. Спасибо за картинку

Скорость работы

Даже если тебе раньше никогда не приходилось работать с СОМ-портом, по крайней мере, в модеме ты должен знать номинальные скорости работы: 9600, 28800, 33600, 56000 и т.п. Сколько бит в секунду убегает из нашего порта? Вот смотри, допустим, скорость у нас 9600 бит в секунду. Это означает, что передача одного бита будет занимать 1/9600 секунды, а пересылка байта – 11/9600. И такая скорость для байта верна только в случае, если стоп-бит будет занимать один бит. В случае, если он занимает два стоп-бита, то передача будет 12/9600. Это связано с тем, что вместе с битами данных передаются еще специальные биты: старт, стоп и бит четности. Линейка скоростей СОМ-порта стандартизирована. Как правило, все устройства работают на трех стандартных скоростях: 9600, 19200, 115200. Но возможны другие варианты, даже использование нестандартных скоростей или скорости, меняющейся во времени, – с этим я сталкивался при разборе полетов очередного устройства.

Такой разный протокол

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

Второй по распространению интерфейс после RS-232 – это RS-485. Он является промышленным стандартом, и передача в нем осуществляется по витой паре, что дает ему неплохую помехоустойчивость и повышенную скорость передачи до 4 мегабит в секунду. Длина провода тут может достигать 1 км. Как правило, он используется на заводах для управления разными станками.

Надо сказать, что IRDA, или инфракрасная связь, которая встроена в большинство телефонов и КПК, тоже по сути является UARTом. Только данные передаются не по проводам, а с помощью инфракрасного излучения.

В SMART-картах (SIM, спутниковое телевиденье, банковские карты) – тех самых устройствах, которые мечтает похачить каждый уважающий себя фрикер – тоже используется наш любимый UART. Правда, там полудуплексная передача данных, и логика работы может быть 1,8/3,3 и 5 вольт. Выглядит так, будто RX запаян с TX на одном конце и на другом – в результате, один передает, другой в этот момент слушает, и наоборот. Это регламентировано стандартом смарт-карт. Так мы точно знаем, сколько байт пошлем, и сколько нам ответит карточка. Тема достойна отдельной статьи. В общем, запомни, что UART есть практически везде.


Устройства, которые имеют на своём борту UART, по часовой стрелке: мышка, ридер-эмулятор SMART-карт, КПК Palm m105, отладочная плата для микроконтроллера ATtiny2313 (или AT89C2051), модем.

Сопряжение интерфейсов

Я уже глаза намозолил разными интерфейсами, но как с ними работать-то? Ну, с обычным RS-232 понятно, а, допустим, с 5-вольтовым юартом как быть? Все просто: существуют различные готовые микросхемы-преобразователи. Как правило, в маркировке они содержат цифры «232». Увидел в схеме микруху с этими цифирями – будь уверен: скорее всего, это преобразователь. Через такие микросхемы с небольшим обвязом и сопрягаются все интерфейсы UART. Я не буду рассказывать о промышленных интерфейсах, а скажу о тех преобразователях, которые интересуют нас в первую очередь.

Самый известный преобразователь интерфейса – это микросхема, разработанная фирмой MAXIM, которая и получила от нее часть своего названия (max232). Для ее работы требуется четыре конденсатора от 0,1 микрофарады до 4 микрофарад и питание 5 вольт. Удивительно, что эта микросхема из 5 вольт генерирует отрицательное напряжение, чтобы сопрягать 5-вольтовый UART с RS-232.

Существуют микросхемы сопряжения USB с UART, например, микросхема ft232rl. В Ubuntu для этой микросхемы уже встроены драйвера. Для Windows их придется качать с официального сайта. После установки драйверов в системе появится виртуальный СОМ-порт, и с ним уже можно рулить различными устройствами. Советую не принимать эти микросхемы, как единственно возможные. Найдется громадное количество более дешевых и интересных аналогов, посему наседай на Гугл и поймешь, что мир UARTа – это круто.

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

Что нам это дает?

Как ты понял, интерфейс UART присутствует во многих устройствах, в которых стоит какой-либо процессор или контроллер. Я даже больше скажу: если там стоит контроллер, то юарт есть стопудово (только он не всегда может использоваться). Как правило, по этому интерфейсу идет наладка и проверка работоспособности девайса. Зачастую производитель умалчивает о наличии этого интерфейса в изделии, но найти его несложно: достаточно скачать мануал на процессор и, где находится юарт, ты будешь знать. После того, как ты получишь физический доступ к железяке по нашему интерфейсу, можно его настроить на свое усмотрение или даже заставить работать, так как надо тебе, а не как задумал производитель. В общем, – выжать максимум возможностей из скромного девайса. Знание этого протокола дает также возможность подслушать, что же творится в линиях обмена между различными процессорами, так как часто производители организуют целые юарт-сети в своем устройстве. В общем, применений много, главное – интуитивно понимать, как это делать.

Апдейтим роутер

Намедни я намутил себе WiFi-роутер WL-520GU и, прочитав статью Step’a «Level-up для точки доступа» (][ #106), успешно установил туда Linux. Но у меня возникли проблемы с монтированием swap-раздела жесткого диска. Так появилась необходимость посмотреть лог загрузки точки доступа – подмонтировался раздел или нет – причем, как говорится, на лету, чтобы сразу вносить необходимые изменения. Шестым чувством я подозревал, что в моем роутере просто обязан быть UART. Я взял в руки крестовую отвертку и начал его разбирать. Дело тривиальное, но с заковыркой – потайные винтики находятся под резиновыми ножками (если решишь повторить, помни, что при разборе ты лишаешься гарантии). Моему взору предстала достаточно скучная плата, где все «chip-in-one»: один центральный процессор, в который включено все, внешняя оператива, флеша, преобразователь питания и рядок разъемов с кнопками. Но на плате была не распаянная контактная площадка, точнее сказать, отверстия под иголки. Их было четыре штуки. Вот он UART, это очевидно! По плате даже без мультиметра видно, что крайние иголки – это +3,3 вольта и второй – земля. Средние контакты, соответственно, RX и TX. Какой из них что, легко устанавливается методом научного тыка (спалить интерфейс очень проблематично).
Сразу хочу отметить, что интерфейс UART в каждом роутере выглядит по-разному. В большинстве случаев, это не распаянные отверстия на плате. Правда, в одном роутере от ASUS я даже встретил полностью подписанный разъем.

Собираем преобразователь

Чтобы подключить роутер к компу, необходимо сопрячь интерфейсы RS-232 с UARTом роутера. В принципе, можно подключить к USB, используя указанную выше микросхему FT232RL, – что я и сделал при первой проверке роутера. Но эта микросхема – в достаточно сложном для пайки корпусе, посему мы поговорим о более простых решениях. А именно – микросхеме MAX232. Если ты собираешься питаться от роутера, то там, скорее всего, будет 3,3 вольта, поэтому лучше использовать MAX3232, которая обычно стоит в КПК (схему распайки нетрудно найти в инете). Но в моем роутере присутствовало питание +5 вольт на входе, а указанных микросхем у меня великое множество, и я не стал заморачиваться. Для сборки нам потребуются конденсаторы 0,1 мкФ (4 штуки) и сама микросхема. Запаиваем все по традиционной схеме, и начинаем эксперименты.


Исходники для сборки

На выход я сразу повесил 9-пиновый разъем типа «папа», чтобы можно было легко подключить нуль-модемный кабель. Если ты помнишь, во времена DOSа такими кабелями делали сетку из двух компов и резались в «Дюкнюкем». Провод для наших целей собрать несложно. Правда, получится не полный нуль-модем и через него особо не поиграешь, но рулить точкой доступа будет самое то! Тебе понадобятся два 9-пиновых разъема типа «мама», корпуса к ним и провод, например, от старой мышки или клавы (главное, чтобы в нем было три провода). Сначала соединяем земли ¬- это пятый контакт разъемов; просто берем любой провод и с обоих сторон припаиваем к 5-му контакту. А вот с RX и TX надо поступить хитрее. С одного конца провода запаиваем на 3-й контакт, а с другого – на 2-й. Аналогично с третьим проводом, только с одного конца запаиваем на 2-й контакт, с другого – на 3-й. Суть в том, что TX должен передавать в RX. Прячем запаянные разъемы в корпус - и готов нуль-модемный кабель!


Распаянные иголки на плате роутера.

Для удобства монтажа в материнку роутера я впаял штырьковый разъем, а в монтажку с MAX232 – обратный разъем и вставил платку, как в слот. RX и TX роутера подбираются экспериментально.


Собраная плата

Теперь надо запитать микросхему преобразователя. Общий провод у нас присутствует уже прямо в разъеме на мамке роутера. А вот + 5 вольт находится прямо у входа питания роутера, в месте, где подключается адаптер. Точку нахождения 5 вольт определяем вольтметром, измеряя разные узлы относительно земли роутера.
Подключаем питание. Включаем и начинаем наши злостные эксперименты.


Прожигаем отверстие для вывода проводов


Распаянный СОМ-порт


Всё в сборе. Обратите внимание, что красный провод питания идёт к разъёму адаптера роутера. Узелок внутри сделан, для того чтобы рывком на оторвать припаянные провода.

Настройка терминала

Нам нужно настроить терминальную программу. В Винде все достаточно просто: запускаем Hyper Terminal, отключаем программную и аппаратную проверку данных, выставляем скорость 115200 и один стоповый бит. А вот в Линухе дело обстоит чуть хитрее. У меня Ubuntu, и рассказывать буду про нее. Для начала разберись, как в твоей сборке именуется СОМ-порт. В моем случае СОМ1 был ttyS0 (если использовать к примеру микросхему FT232, то он будет именоваться ttyUSB0). Для работы с ним я использовал софтинку minicom.

Запускай ее с параметрами: minicom -l -8 -c on -s. Далее выбирай «Настройки последовательного порта»:
Последовательный порт /dev/ttyS0

* Скорость/четность/биты 115200 8N1
* Аппаратное управление потоком - нет
* Программное управление потоком - нет

Сохраняем настройки. Софтина попробует проинициализировать модем - не обращай внимания. Чтобы вызвать меню, нажми . Там можно менять настройки, например: включить/выключить эхо - Е.
Настройка

Я не рекомендую подключать микросхему преобразователя к роутеру, дабы проверить ее функционал. Допускается только брать с него питание. Проверка проходит очень просто - необходимо перемкнуть RX с TX. Сначала перемыкаешь в СОМ-порте 2-й и 3-й контакт - проверяешь настройки терминалки. Пишешь что-то на клаве: если символы возвращаются, значит, все ОК. Также проверяешь кабель, те же контакты. Потом подключаешь микросхему, и уже у нее на выходе ставишь перемычку. Я заостряю на этом внимание, потому что, например, у меня возникли проблемы, и ничего не работало, пока я все не проверил и не нашел ошибку.

После всех настроек можешь смело цеплять к роутеру и искать RX-TX на роутере, периодически выдергивая из него питание. Если все сделано правильно, то при подаче питания ты увидишь лог загрузки роутера. Принимай поздравления, теперь у тебя полный аппаратный рут, так, будто ты сидишь за монитором с клавой роутера.


Лог загрузки роутера в программе minicom

Автономное плаванье

Согласись, делать через терминальную программу то же самое, что удобнее сделать через SSH – не айс. Мне хотелось превратить роутер в автономный Linux-компьютер, со своей хитрой архитектурой. Для этого нужно, чтобы данные с клавиатуры передавались по UART, и по нему же выводились на монитор. Паять и разрабатывать устройство было лениво. Тогда-то и пришла идея заюзать для этих целей пылящийся без дела КПК. По сути, наладонник будет исполнять роль контроллера клавиатуры и дисплея, ну и служить сопряжением интерфейсов.

Сначала я попробовал древнейший Palm m100. Но, видимо, у него очень маленькая буферная память, и от количества данных, которые идут с роутера, ему становилось плохо. Я взял другой - промышленный КПК, с нормальным СОМ-портом и терминалкой. Подключил, вставил в док и, в результате, получил небольшой линукс-компьютер. В принципе, вместо дорогущего промышленного КПК подойдет большинство наладонников, работающих под операционкой WinCE, главное – найти подходящий терминальный софт.


Линукс компьютер:)

Итоги

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

Этот пост является отредактированной для хабра версией моей статьи в Хакере № 05/09 «Главный инструмент фрикера».

Литература:
1. Михаил Гук «Аппаратные интерфейсы ПК» - просто студенческая библия по персоналке.

Интерфейс RS-232 (стандарт EIA) был создан для сопряжения персонального компьютера (PC) и аппаратуры передачи данных (модема) с использованием синхронно-асинхронного режима передачи на расстояние до нескольких метров . Стандарт предусматривает два типа разъемов DB25 и DB9 с 8 сигналами. Данные передаются по 2 независимым цепям RxD, TxD приемопередатчиков интерфейса (UART1, UART2 на рис. 1.14) и позволяют использовать дуплексный режим обмена, остальные 6 сигналов предназначены для управления обменом данных. В современных реализациях интерфейса эти сигналы не используются, предполагается постоянная готовность приемопередатчиков к обмену данными (интерфейс UART). Применяемые алгоритмы управления вместо формирования управляющих сигналов производят передачу управляющих сообщений вместе с основными данными через сигнальные цепи RxD, TxD.

Рис. 1.14. Интерфейс RS232

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

В настоящее время интерфейс применяется как средство физического уровня в интерфейсах "точка-точка" с невысокой скоростью передачи данных 2,4 – 115,2 кбит/с. Наиболее часто используется асинхронный режим с форматом отдельного сообщения: стартовый бит – 5-8 бит данных – стопо- вый бит (UART-кадр). Стартовый и стоповый биты отмечают начало и конец сообщения и позволяют обеспечить синхронизацию приемопередатчиков и контроль длины сообщения; стартовый бит – сигнал логического нуля в течение 1 такта, а стоповый бит – сигнал логической единицы.

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

Из-за несложных алгоритмов управления, универсальности и возможности дуплексного обмена данными интерфейс UART широко применяется как стандартный последовательный интерфейс связи между различными техническими средствами автоматизации. Например, микроконтроллеры семейств AVR, PIC и многие другие содержат встроенные средства аппаратной реализации интерфейса UART, через которые могут быть подключены внешние устройств, обеспечивающие поддержку других современных интерфейсов LVDS, 1-W, IrDA, RS-485, CAN и т.п.

Некоторые характеристики и особенности микросхем UART этой фирмы приведены на рис. 1.16.

Если применяемые технические средства не содержат встроенного интерфейса UART, можно использовать специальные микросхемы UART. Эти микросхемы (рис. 1.15) преобразуют параллельный формат данных в последовательный, обеспечивают хранение данных в буферных запоминающих устройствах, формируют необходимые сигналы управления интерфейса, запросы прерываний для обработки данных передаваемых интерфейсом и т.п. Компания EXAR является признанным лидером в области

производства микросхем UART.

Рис. 1.15. Передача данных с помощью микросхем UART

Рис. 1.16. Классификация микросхем UART фирмы EXAR

Самым простым среди 8-разрядных UART является микросхема ST16C450 (рис. 1.17).

Рис. 1.17. Структурная схема ST16C450

Это устройство полностью совместимо с промышленным стандартом 16450 и обладает следующими свойствами:

Раздельное управление приемом и передачей;

Программно управляемая скорость передачи (от 50 бит/с до 1.5 Мбит/с);

Сигналы управления модемом (CTS, RTS, DSR, DTR, RI и CD);

Программируемая длина передаваемых символов (5, 6, 7 и 8 бит);

Генерация и обнаружение битов четности;

Низкий потребляемый ток – 1.2 мА.

Кроме традиционных UART с 8-разрядной параллельной шиной, фирма EXAR производит 32-разрядные UART для работы с шиной PCA. Внутренние буферы FIFO предназначены для разгрузки процессорного ядра и позволяют уменьшить число прерываний для обслуживания UART. Например, микросхема UART типа XR16C85x с объемом FIFO 128 байт может накапливать в буфере целую страницу данных, увеличивая длительность передачи без прерываний CPU.

Ранее было отмечено, что интерфейс RS-232 предусматривает применение двух типов разъемов: DB9 и DB25. Назначение контактов разъемов приведено в табл. 1.2.

Таблица 1.2

№ контакта

№ контакта

Назначение

Детектор сигнала с линии (несущей)

Прием данных

Передача данных

Готовность терминала

Сигнальное заземление

Готовность данных

Запрос передачи

Готовность к передаче

Индикатор вызова

Достаточно часто сигналы интерфейса формируются со стандартными логическими уровнями (0-5 В), а по протоколу RS-232 уровни напряжений составляют ±12 В. Приемопередатчики для преобразования физических уровней сигналов интерфейса UART, называемые драйверами COM-порта, выпускаются многими производителями интегральных микросхем. Отличаются микросхемы числом приемников и передатчиков, питающими напряжениями, потребляемой мощностью, максимальной скоростью передачи, а также наличием встроенных конденсаторов и некоторыми другими параметрами.

Лидерами по производству микросхем в этой области являются фирмы Maxim и Analog Devices. Перечень микросхем RS-232 Line Driver/Receivers, выпускаемых фирмой Maxim, состоит из 150 наименований, фрагмент перечня приведен в табл. 1.3. Аналогичный перечень для Analog Devices приведен в табл. 1.4.

В стандартных применениях интерфейс RS-232 используется для соединения двух устройств. Одно из этих устройств является передатчиком, а другое – приемником. В этой связи сигналы линии связи RS-232 приемником и передатчиком формируются и обрабатываются по-разному.

Скорость (кбит/с)

Режим энерго- сбереже-ния

Состояние RxD

Конденсаторы

Напряжение питания (В)

Ток потребления (мА)

Скорость (кбит/с)

Режим энерго- сбереже-ния

Состояние RxD

Конденсаторы

Напряжение питания (В)

Ток потребления (мА)

Устройство-передатчик (например, компьютер) в системе передачи данных принято называть оконечным оборудованием данных или DTE (Data Terminal Equipment), а приемник (например, модем) – устройством аппаратуры передачи данных или DCE (Data Communication Equipment). Направление передачи сигналов между DTE и DCE показано в табл. 1.5.

Как видно из табл. 1.5, каждый сигнал выходной для одного устройства и входной – для другого. Например, для DTE-устройства сигнал передаваемых данных TD является выходным, а для DCE-устройства сигнал TD является входным. DCE-устройство формирует сигнал DCD (если это модем, то он определяет наличие несущего сигнала в телефонной линии), а DTE-устройство принимает этот сигнал и т.п.

Устройство DTE

Направление передачи

Устройство DCE

- * ¦¦

В некоторых случаях возникает задача обеспечить работу интерфейса RS- 232 между двумя однотипными устройствами, например, необходимо обеспечить соединение DTE-DTE (компьютер-компьютер). Соединения между разъемами в этом случае определяются коммуникационными программами, используемыми компьютерами. В минимальной конфигурации кабель, соединяющий два устройства, должен содержать три провода: один – для объединения сигнальной земли SG, второй и третий – для передачи сигналов TD и RD (рис. 1.18), причем необходимо выполнить перекрестное соединение сигналов. Такой кабель, например, может обеспечить соединение двух компьютеров с помощью встроенной в Windows программы Hyper Terminal.

Если компьютер "предполагает", что он работает с модемом, то, в этом случае, можно применить нуль-модемный кабель (рис. 1.19). На этом рисунке цифрами обозначены контакты разъема DB25M, а штриховой линией – провод "защитной земли"- GND.

Рис. 1.18. Трехпроводный вариант RS-232

Рис. 1.19. Нуль-модемные соединения кабелей RS-232

Выбор варианта соединения определяется условиями формирования управляющих и проверочных сигналов устройств DTE. Следует отметить, что вариант кабеля "a" наиболее популярен, и его следует использовать в тех случаях, когда нет достаточной информации об особенностях реализации интерфейсов соединяемых устройств. Вариант кабеля "г" позволяет "убедить" компьютер в постоянной готовности внешнего устройства DTE к приему и передаче сигналов.

Рис. 1.23. Схема питания устройства ввода-вывода от COM-порта

В этом уроке я расскажу про UART интерфейс в микроконтроллерах AVR и про работу с ним в . UART это универсальный асинхронный приёмопередатчик. Сам интерфейс достаточно распространён и имеется практически во всех AVR микроконтроллерах, исключения лишь составляет микроконтроллер Attiny13 и еще некоторые. Передача данных осуществляется по биту в равные промежутки времени, этот промежуток времени задаётся скоростью в бодах, вот например стандартные скорости: 4800 бод, 9600 бод, 19200 бод, 38400 бод и т.д. Следует также учесть, что скорость должна быть одинаковой с обеих сторон подключения. Кстати приёмник и передатчик работают независимо. Подключение UART осуществляется по трём линиям: RXD – приём, TXD – передача и GND – общий (минус). Подключать UART надо, так сказать "наоборот" RXD к TXD, а TXD к RXD как на картинке ниже:

С помощью UART также можно можно связать микроконтроллер и компьютер, но есть одна проблема: у UART интерфейса логические уровни 0 и +5 вольт, а в компьютере логические уровни в интерфейсе RS-232 могут быть от -25 до -3 вольт и от +3 до +25 вольт. Решить эту проблему нам поможет конвертер уровней, его можно собрать на транзисторах, а лучше использовать специальную микросхему MAX232. Вот самая распространенная схема подключения MAX232:

Работа с UART в BASCOM-AVR

Прежде всего, перед началом работы с UART нужно указать скорость в бодах, делается это командой: $baud = (скорость). Например: $baud = 9600 .Также не забываем указывать реальную частоту тактового генератора командой $crystal = (скорость Hz), в ином случае скорость работы программы будет не совпадать со скоростью работы микроконтроллера и в итоге приём или передача данных будет неверная. Пример написания команды $crystal на частоту 8МГц: $crystal = 8000000 . Кстати, имеет смысл открыть окно настроек в BASCOM-AVR (Options>Compiler>Communications):

В этом окне настроек вы можете указать скорость работы UART, тактовую частоту тактового генератора и посмотреть процент ошибок при выбранной тактовой частоте. Но лучше указывать скорость и тактовую частоту непосредственно в самой программе. Кстати процент ошибок при тактовой частоте в 4МГц очень мал (0.16%), но все, же есть. Если вы хотите чтобы процент ошибок был нулевой надо подобрать такую тактовую частоту, которая будет кратна скорости работы UART. Например, при тактовой частоте 3.6864 МГц и скорости работы UART в 115 200 бод процент ошибок будет нулевым.

И так, после указания тактовой частоты и скорости работы UART можно приступить к работе с самим интерфейсом. Чтобы послать, что-либо в UART есть команда Print (переменная или текст в кавычках), вот пример её использования: Print "Hello, world!" . Кроме текста в кавычках можно выводить и переменные, причём сразу несколько разделяя точкой с запитой, например: Print "Weight:" ; a ; "kg" или так Print "Hello," ; "world!" . Также с UART можно и принять, делается это командой Input (текст или переменная в кавычках для посылки), (переменная, куда записывать полученные данные). Как видим всё очень просто: сначала пишем в кавычках текст, который передастся в UART, а потом указываем переменную, в которую запишутся данные полученные данные из UART. Вот пример: Input "Weight:", a

Работа с UART на практике

Ну а теперь попробуем "порулить" UART на практике, сначала соберём простую схему:

Потом наберём простую программку, (используя полученные знания) и откомпилируем её. Вот и она:

$crystal = 8000000 $baud = 9600 Dim A As Byte Print "Hello, world!" Print "Hello http://сайт" Input "Size:" , A Print "Size=" ; A ; "bytes" End

А работать эта программка будет так: сначала будет посылать в UART текст, а потом будет ждать приёма данных (в данном случае числа) которые запишутся в переменную a и позже пошлёт текст вместе с переменой. Для тех, кому лень компилировать, в файлах к уроку есть готовая прошивка. Прошиваем микроконтроллер, подключаем выводы микроконтроллера RXD, TXD (подключаем, как я писал выше) и GND к COM порту компьютера (через конвертер уровней) или к USB (USB – UART переходник), открываем на компьютере программу для работы с COM портами, например: Terminal by Bray, Hyper Terminal или Terminal emulator в BASCOM-AVR, указываем COM порт к которому подключились, указываем скорость в бодах, смотрим в окно программы, подаём питание на микроконтроллер и радуемся. Необходимо также учесть, что после прошивки микроконтроллера необходимо установить фьюз биты на нужную нам тактовую частоту генератора в данном случае (для программки выше) на 8МГц. На 8МГц можно использовать внутренний тактовый генератор микроконтроллера и установить фьюз биты вот так (для ).

UART микроконтроллеров AVR.

Одним из самых распространенных протоколов взаимодействия микроконтроллера с внешними устройствами является UART (Universal Asynchronous Receiver-Transmitter ) - Универсальный асинхронный приёмопередатчик . Данный протокол аппаратно реализован в большинстве микроконтроллеров AVR , что позволяет разработчику не вдаваться в особенности реализации данного интерфейса. Для его использования достаточно настроить всего несколько регистров!

Рассмотрим кратко принцип работы UART .

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

При передаче байта передатчик изначально выставляет логический 0 на выводе TX (Transmitter ). Это так называемый старт-бит, означающий начало передачи. После этого передатчик выставляет биты передаваемого байта через определенные промежутки времени, заданные частотой. Далее может быть передан бит четности, который служит для проверки качества передачи. Когда переданы все биты, выставляется стоп-бит, то есть логическая 1 на линии передачи. Число стоп-битов может быть различным:1 ; 1 , 5 ; 2.

Огромным плюсом данного интерфейса является возможность его использования для настройки связи с ПК. Для этого необходимо изготовить UART —RS 232 или UART —USB переходники, основанные на микросхемах MAX 232 и FT 232RL соответственно.

Подробнее о переходниках здесь.

За работу с UART (на самом деле USART , о днако, для нас это сейчас не важно) отвечают следующие регистры:

UDR - Регистр данных UART . При передаче в него записываются данные, которые необходимо отправить, а при чтении — принятые данные. Всё просто.

UCSRA - Регистр контроля и статуса UART . Рассмотрим биты данного регистра подробнее:

  • RXC (Receive Complete ) - флаг окончания приема данных. Устанавливается в 1 при наличии несчитанных данных и сбрасывается в 0 по окончании приема данных.
  • TXC (Transmit Complete ) - флаг окончания передачи данных. Сбрасывается в 0 по окончании передачи данных и устанавливается в 1 при наличии непереданных данных.
  • UDRE (Data Register Empty ) - флаг, означающий готовность регистра UDR получать новые данные. Когда UDRE равен 1, регистр UDR пуст и готов к приему новых данных.
  • FE (Frame Error) - флаг ошибки фрейма.
  • DOR (Data OverRun ) - флаг переполнения регистра данных.
  • PE (Parity Error) - флаг ошибки четности
  • U 2 X - бит, позволяющий увеличить скорость передачи вдвое. При записи 1 в данный бит предделитель тактовой частоты модуля UART уменьшается вдвое, что позволяет вдвое увеличить скорость передачи данных.
  • MPCM - мультипроцессорный режим коммуникации.

UCSRB - Регистр контроля и статуса UART .

  • RXCIE (RX Complete Interrupt Enable ) - Бит, разрешающий или запрещающий генерацию прерывания по окончании приема. При записи 1 в данный бит прерывание по окончании приема разрешено, при записи 0 — запрещено.
  • TXCIE (TX Complete Interrupt Enable ) - При записи 1 в данный бит прерывание по окончании передачи данных разрешено, при записи 0 — запрещено.
  • UDRIE (Data register empty Interrupt Enable ) - Бит, разрешающий или запрещающий возникновение прерывания по флагу UDRE .
  • RXEN (Reciever Enable ) - Запись 1 в данный бит включает приемник UART модуля, запись 0 — выключает.
  • TXEN (Transmitter Enable ) - Запись 1 в данный бит включает передатчик UART модуля, запись 0 — выключает.
  • UCSZ 2 (Character Size ) - В паре с битами UCSZ 1 и UCSZ 0 задает число передаваемых бит.То есть мы можем передавать не только побайтно, но и по 5,6,7,8,9 бит.
  • RXB 8 (Receive Data Bit 8) - 9 бит принимаемых данных при передаче по 9 бит. Должен быть считан перед операциями с регистром UDR .
  • TXB 8 (Transmit Data Bit 8) - 9 бит отсылаемых данных при передаче по 9 бит. Должен быть записан перед записью других бит в UDR .

UCSR С - Регистр контроля и статуса UART .


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

Регистры UBRRL и UBRRH отвечают за настройку скорости работы приемопередатчика. Следует помнить, что при работе с регистром UBRRH бит URSEL должен быть равен 0.

Для получения необходимой скорости работы UART значение UBRR (Пары регистров UBRRH и UBRRL ) рассчитывается по следующей формуле:

UBRR = (F osc /(B*16))-1

Где,

F osc - частота работы микроконтроллера (Гц).

B - необходимая скорость работы UART (Бит/сек).

Например, необходимо настроить скорость передачи 9600 бит/ сек при работе микроконтроллера на частоте 8 МГЦ(8000000 Гц).

UBRR = (8000000/(9600*16))-1 = 51.083333

Округляем до целого числа, то есть до 51.И уже данное число записываем в регистры UBRRL:UBRRH.

Урок получился достаточно объемным, поэтому практическую реализацию протокола UART на микроконтроллерах AVR рассмотрим в следующем уроке.

Любое копирование, воспроизведение, цитирование материала, или его частей разрешено только с письменного согласия администрации MKPROG .RU . Незаконное копирование, цитирование, воспроизведение преследуется по закону!

3.1 Последовательный асинхронный интерфейс UART

Последовательный интерфейс использует одну сигнальную линию для передачи данных, по которой биты информации передаются друг за другом последовательно. При последовательной передаче сокращается количество сигнальных линий, что упрощает разводку проводников на печатной плате, уменьшает габариты устройства и позволяет делать более помехозащищенные интерфейсы. При последовательной передаче каждый информационный бит должен сопровождаться импульсом синхронизации - стробом. Если импульсы синхронизации передаются от одного устройства к другому по выделенной линии, то такой интерфейс называют синхронным, в этом случае генератор синхронизации располагается на стороне устройства инициирующего передачу. Если же приемник и передатчик содержат каждый свой генератор синхроимпульсов, работающий на одной частоте, то такой интерфейс называется асинхронным. Получается, что приемник информации сам вырабатывает синхроимпульсы.

Типичный представитель асинхронного последовательного интерфейса - UART (Universal Asynchronous Receiver-Transmitter - универсальный асинхронный приёмопередатчик).

При передаче по интерфейсу UART каждому байту данных предшествует СТАРТ-бит , сигнализирующий приемнику о начале посылки, за СТАРТ-битом следуют биты данных. Завершает посылку СТОП-бит , гарантирующий паузу между посылками. СТАРТ-бит следующего байта посылается в любой момент после СТОП-бита, то есть между передачами возможны паузы произвольной длительности. СТАРТ-бит, обеспечивает простой механизм синхронизации приемника по сигналу от передатчика. Внутренний генератор синхроимпульсов приемника использует счетчик-делитель опорной частоты, обнуляемый в момент приема начала СТАРТ-бита. Этот счетчик генерирует внутренние стробы, по которым приемник фиксирует последующие принимаемые биты.

3.2 Особенности работы UART микроконтроллера ADuC842

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

Принимаются и передаются данные по разным линиям, передача происходит через вывод TxD микроконтроллера (Transmitter Data - передатчик данных), прием - через RxD (Receiver Data - приемник данных). Физически выводы RxD и TxD совмещены с выводами третьего параллельного порта P3.0 и P3.1 соответственно.

Программное взаимодействие с последовательным портом UART осуществляется через регистры специальных функций (SFR) SBUF и SCON . Через SBUF (Serial buffer - последовательный буфер) осуществляется доступ к регистрам приемника и передатчика последовательного порта. Когда программно производится запись в SBUF , то данные загружаются в регистр передатчика, когда же программой происходит чтение SBUF , то осуществляется доступ к регистру приемника. Физически регистры приемника и передатчика разделены. SFR адрес - 0х99.

SCON - регистр конфигурации и управления последовательным портом микроконтроллера.
SFR адрес - 0x98 .
0x00 .
Регистр имеет побитовую адресацию.

Таблица 1 – Назначение бит регистра SCON

номер мнемоника описание
7 SM0 SM1 , SM0 биты определяют режим работы последовательного порта.
SM0 SM1 Выбранный режим
0 0 режим 0: синхронный режим с фиксированной скоростью f core/2 .
0 1 режим 1: 8-битный асинхронный режим с настраиваемой скоростью передачи данных.
1 0 режим 2: 9-битный асинхронный режим с фиксированной скоростью f core /32 или f core /16.
1 1 режим 3: 9-битный асинхронный режим с настраиваемой скоростью передачи данных.
6 SM1
5 SM2 Бит управления режимом приемопередатчика. Устанавливается программно для запрета приема сообщения, в котором девятый бит имеет значение “0”. Такой режим используется при реализации сетевого протокола в многопроцессорной системе.
4 REN Бит разрешения приема данных через последовательный порт. Устанавливается программно, для разрешения приема.
3 TB8 9-ый бит передатчика последовательного порта. Данные загруженные в TB8 передаются девятым битом. Это актуально для режима работы UART 2 и 3.
2 RB8 9-ый бит приемника последовательного порта. В режиме работы 2 и 3 в этот бит загружается принятый девятый бит данных. В режиме 1 в этом бите хранится СТОП-бит.
1 TI Флаг прерывания передатчика последовательного порта. Устанавливается аппаратно при окончании передачи байта. Флаг должен сбрасываться (запись “0”) программно.
0 RI Флаг прерывания приемника последовательного порта. Устанавливается аппаратно при окончании приема байта. Флаг должен сбрасываться (запись “0”) программно.

Режим работы 0: режим 8-битного сдвигового регистра. Для выбора этого режима работы следует в биты SM0 и SM1 записать логические нули (SM1 = 1 и SM0 = 0 ). В этом режиме данные последовательно передаются и принимаются через вывод RxD . Вывод TxD используется для подачи тактовых импульсов. Передача инициируется любой инструкцией, записывающей данные в регистр SBUF . Передача байта данных начинается с младшего значащего бита. Прием начинается, когда бит разрешения приема установлен в единицу (REN = 1 ), а флаг прерывания приемника сброшен в ноль (RI = 0 ). Таким образом, в данном случае последовательный порт работает в синхронном режиме, поэтому у некоторых семейств микроконтроллеров такой последовательный порт называется не UART, а USART (Universal Synchronous-Asynchronous Receiver-Transmitter - универсальный синхронный - асинхронный приемопередатчик).

Режим работы 1: асинхронный 8-битный режим с настраиваемой скоростью. Для выбора первого режима следует в бит SM0 записать единицу, а в бит SM1 - ноль (SM1 = 0 и SM0 = 1 ). Вывод микросхемы TxD используется для передачи информации, вывод RxD - для приема.

Передача байта информации начинается с посылки СТАРТ-бита, за ним идут восемь информационных бит, заканчивается передача СТОП-битом. Таким образом, для передачи каждого байта информации используется 10 бит. Формирование СТАРТ-бита и СТОП-бита происходит автоматически.

Скорость передачи может устанавливаться Таймером 1 или Таймером 2 , или комбинацией их обоих: один - для передачи, другой - для приема. Использование таймеров 1 и 2 характерно для всего семейства MCS-51/52, правда Таймер 2 есть только в старших моделях, но в микроконтроллере ADuC842 возможна синхронизация приемопередатчика UART от специального Таймера 3, что позволяет освободить таймеры общего назначения для выполнения других функций.

Передача данных начинается, когда в регистр SBUF программно записывается передаваемое число. Данные передаются до тех пор, пока на TxD не поступит СТОП-бит, после чего флаг прерывания передатчика (TI ) установится в единицу, как это показано на рисунке ниже:

Рисунок 1 – Диаграмма передачи байта

Для разрешения приема данных через последовательный порт в бит REN следует записать логическую единицу. Прием байта данных начинается с приходом на линию RxD СТАРТ-бита: перехода линии из высокого логического уровня в низкий. По окончанию приема всего байта флаг прерывания приемника RI устанавливается в единицу, и принятый байт может быть программно считан из буферного регистра SBUF .

Режим работы 2: асинхронный 9-битный режим с фиксированной скоростью. Скорость передачи данных по умолчанию f core /32, но если записать в бит SMOD регистра PCON логическую единицу, то скорость передачи будет удвоена: f core /16. Для выбора второго режима следует в бит SM0 записать логический ноль, а в бит SM1 - единицу (SM1 = 1 и SM0 = 0 ).

В этом режиме каждая передаваемая или принимаемая посылка состоит из одиннадцати бит: СТАРТ-бит, восемь информационных бит, девятый программируемый бит и СТОП-бит. Девятый бит часто используют в качестве бита паритета при контроле четности, хотя он может быть использован для любых других целей.

Прием и передача во втором режиме осуществляется аналогично первому режиму. Девятый бит при передаче программно записывается в бит TB8 регистра SCON , при приеме девятый бит находится в RB8 регистра SCON .

Режим работы 3: асинхронный 9-битный режим с настраиваемой скоростью. Для выбора третьего режима следует в биты SM0 и SM1 записать логические единицы (SM1 = 1 и SM0 = 1 ). В этом режиме последовательный порт UART работает также как в режиме 2, только скорость задается таймерами 1, 2 или 3, так же, как и в режиме 1.

Во всех четырех режимах передача данных начинается любой инструкцией, записывающей в регистр SBUF число. В режиме 0 прием начинается при условии RI = 0 и REN = 1 . Во всех остальных режимах прием начинается с приходом СТАРТ-бита при условии, что в бит REN записана логическая единица (REN = 1 ).

3.3 Расчет параметров синхронизации UART

По умолчанию последовательный порт микроконтроллера ADuC842 настроен на синхронизацию от Таймера 1. Скорость передачи UART определяется временем переполнения таймера:

где T T – время срабатывания таймера.

Таймер должен быть сконфигурирован для работы в режиме с автоперезагрузкой (режим 2). Для установки такого режима в старшие 4 бита регистра TMOD следует записать бинарную комбинацию 0010b. В этом случае скорость передачи данных будет определяться по формуле:

где: f core – частота ядра микропроцессора, TH1 – содержимое регистра данных TH1 .

Из формулы 2 легко найти значение регистра TH1 , обеспечивающего требуемую скорость:

Результат вычисления должен быть округлен до ближайшего целого.

Используя Таймер 1 для синхронизации UART не всегда возможно получить требуемую частоту с достаточной точностью. Например, пусть при тактовой частоте ядра микропроцессора 2097кГц (значение для ADuC842 по умолчанию), требуется получить скорость передачи 19.2 кбит/с. По формуле 3 найдем значение TH1:

Используя полученное значение TH1, рассчитаем реальную скорость передачи UART:

Реальная скорость на 14% меньше требуемой, а это значит, что передача данных невозможна. Проблема была решена добавлением специального таймера 3, специализированного для высокоточной синхронизации UART в широком диапазоне частот. Кроме того, использование специализированного таймера высвобождает таймеры общего назначения для решения других различных задач.

Таймер 3, по сути, представляет собой набор настраиваемых делителей тактовой частоты ядра, структурная схема таймера изображена на рисунке ниже:


Рисунок 2 – Структурная схема Таймера 3

Для управления Таймером 3 предназначены два регистра специальных функций - T3CON и T3FD . Регистр T3CON содержит бит T3EN , при записи в него логической единицы синхронизация UART будет происходить от Таймера 3, в противном случае - от Таймера 1. Младшие три бита регистра T3CON определяют двоичный делитель DIV . Дробный коэффициент деления настраивается регистром T3FD .

T3CON – регистр конфигурации Таймером 3.
SFR адрес - 0x9E .
Значение после подачи питания 0x00 .

Таблица 2 – Назначение битов регистра T3CON

номер мнемоника описание
7 T3EN Разрешение Таймера 3.
Когда бит установлен (T3EN = 1 ) синхронизация приемника и передатчика последовательного порта происходит от Таймера 3.
Когда бит сброшен (T3EN = 0 ) - синхронизация от Таймера 1.
6 Не используются
5
4
3
2 DIV2 Биты целочисленного делителя DIV .
DIV2 DIV1 DIV0 DIV
0 0 0 0
0 0 1 1
0 1 0 2
0 1 1 3
1 0 0 4
1 0 1 5
1 1 0 6
1 1 1 7
1 DIV1
0 DIV0

T3FD – регистр Таймера 3.
SFR адрес - 0x9D .
Значение после подачи питания 0x00 .
Регистр не имеет побитовой адресации.

Используя структурную схему Таймера 3 легко записать аналитическое выражение для расчета результирующей скорости последовательного порта:

где f core - частота ядра микроконтроллера.

Значение делителя DIV можно определить по формуле 5, полученное значение следует округлить до целого вниз.

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

Рассчитаем параметры конфигурации Таймера 3, для предыдущего примера: при тактовой частоте ядра микропроцессора 2097кГц, требуется получить скорость передачи 19.2 кбит/с.

Таким образом, ошибка установления скорости составляет всего 0.2%.

3.4 Особенности представления текстовой информации

В различных операционных системах для представления текстовой информации используют специальные наборы символов. Как правило, такой набор представляют в виде таблице, где каждому символу соответствует бинарная последовательность длиною в один или несколько байт. В литературе подобную таблицу символов часто называют «кодировкой». На сегодняшний день наиболее распространенным является код ASCII (American Standard Code for Information Interchange - американский стандартный код для обмена информацией), который используется для внутреннего представления символьной информации в операционной системе MS DOS, в Блокноте операционной системы Windows, а также для кодирования текстовых файлов в Интернет.

Поскольку первоначально ASCII предназначался для обмена информации, в нём, кроме информационных символов, используются символы-команды для управления связью. В приведенной таблице такие символы показаны многоточием.

Таблица 3 – Таблица ASCII

.0 .1 .2 .3 .4 .5 .6 .7 .8 .9 .A .B .C .D .E .F
0. ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ...
1. ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ...
2. ! " # $ % & " ( ) * + , - . /
3. 0 1 2 3 4 5 6 7 8 9 : ; < = > ?
4. @ A B C D E F G H I J K L M N O
5. P Q R S T U V W X Y Z [ \ ] ^ _
6. ` a b c d e f g h i j k l m n o
7. p q r s t u v w x y z { | } ~ ...

Таблица кодов содержит 8 столбцов и 16 строк, каждая строка и столбец пронумерованы в шестнадцатеричной системе счисления. Шестнадцатеричное представление ASCII-кода складывается из номера столбца и номера строки, в которых располагается символ, при этом номер строки образуют первую цифру (старшие четыре бита), а номер столбца вторую цифру (младшие 4 бита). Так, например, ASCII-код символа “E” есть число 0x45, а символа “\“ - 0x5C.

Легко заметить, что в приведенной таблице представлено 128 символов, притом, что один символ кодируется байтом - восьмью битами. Дело в том, что верхние значения (128-255) могут занимать различные дополнительные символы, например, набор русского алфавита, это зависит от конкретного типа кодировки.

3.5 Способы программной реализации работы UART

Перед первым обращением к приемо-передатчику UART последовательный порт должен быть настроен: определен режим работы, выбран и настроен источник синхронизации. Режим работы UART устанавливается битами SM0 и SM1 регистра SCON . Так как регистр имеет как байтовую, так и битовую адресацию, выполнить настройку можно разными способами: записать в регистр SCON требуемое число или установить каждый бит отдельно. Источник синхронизации определяется битом T3EN регистра T3CON : если в этот бит записать логическую единицу, то синхронизация будет происходить от Таймера 3, если ничего не записывать (по умолчанию T3EN = 0 ), то синхронизация от Таймера 1.

При использовании Таймера 1 необходимо сконфигурировать его для работы в режиме 2 (свободнобегущий таймер с автоперезагрузкой), для этого в старшие четыре бита регистра SMOD следует записать двоичную комбинацию 0010b. Регистр счетчика TH1 определяет скорость передачи информации по UART, его значение следует рассчитать по формуле 3. После записи TH1 таймер нужно запустить, делается это записью в бит TR1 регистра TMOD логической единицы.

При синхронизации от Таймера 3, по формулам 5 и 6 рассчитываются делители DIV и T3FD . Если запись делителя T3FD делается непосредственно в регистр T3FD , то делитель DIV определяется младшими тремя битами регистра T3CON , при этом в старший бит этого регистра (T3EN ) должна быть записана логическая единица. Запуск таймера происходит автоматически.

Отправление данных по UART начинается любой командой, результат выполнения которой записывается в регистр SBUF :

SBUF =0x45; // отправить символ “E”

Можно каждый раз не пользоваться таблицей ASCII для определения кода символа, в языке «Си» для этого есть удобный инструмент: достаточно взять требуемый символ в апострофы, компилятором это будет интерпретировано как код символа.

SBUF ="E"; // отправить символ “E”

Если же требуется отправить не один символ, то прежде чем следующий код будет записан в SBUF , следует подождать, пока предыдущий символ будет отправлен. О конце передачи сигнализирует флаг TI регистра TCON , когда передача завершена, в бит TI аппаратно записывается логическая единица. Можно программно организовать в цикле проверку TI на равенство нулю, а следующий байт отправлять только тогда, когда TI окажется равен единице:

SBUF = 0x45 ; // отправить символ “E” while (! TI) ; // пока TI равен нулю, выполнять пустой цикл TI = 0 ; // сбросить флаг для следующей передачи

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

while (! RI) ; // ждем завершение приема байта cmd = SBUF; // считываем принятый байт в переменную cmd RI = 0 ; // сброс флага приема

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

while (! TI) ; // подождать, пока буфер передачи не освободится (если занят) SBUF = 0x45 ; // заполнить буфер и начать передачу TI = 0 ; // сбросить флаг передачи в нуль

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

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


Рисунок 3 – Адреса регистров специальных функций

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

3.6 Взаимодействие микроконтроллера с персональным компьютером

Учебный лабораторный стенд LESO1 подключается к персональному компьютеру через микросхему преобразователя интерфейсов USB-UART. Для связи с микроконтроллером в программе загрузчика nwFlash реализован терминал. Терминал позволяет посылать через последовательный порт в микроконтроллер информацию, принимать и отображать принятую из микроконтроллера информацию. Настройка терминала осуществляется в пункте главного меню «Опции терминала». Опции терминала позволяют:

  1. выбрать режим отображения данных: текстовый или шестнадцатеричный, при этом изменяется также тип посылаемых данных;
  2. выбрать кодировку ANSI (Windows-1251) или ASCII (DOS-866);
  3. включать и выключать режим автоматической прокрутки текста;
  4. очистить окно терминала;
  5. сохранять принятую от микроконтроллера информацию в файл:
    • в том виде, как она пришла - пункт меню «Сохранить»;
    • в том виде, как она отображается в терминале - пункт меню «Сохранить как текст».

На рисунке 4 показана вкладка главного меню «Опции терминала».


Рисунок 4 – Настройка опций терминала Рисунок 5 – Настройка скорости UART

При обмене данными с учебным стендом необходимо установить требуемую скорость подключения. Сделать это можно в меню «подключение», как это показано на рисунке 5.

4 Задание к работе в лаборатории

4.1 Вывод информации через последовательный порт

  1. Разработайте алгоритм программы, передающей через последовательный порт UART данные в персональный компьютер - фамилию студента. Скорость передачи данных должна соответствовать варианту (таблица 5). Источник синхронизации UART (Таймер 1 или Таймер 3) согласовывается с преподавателем. Взаимодействие микроконтроллера с компьютером осуществляется через терминал программы загрузчика - nwFlash.
  2. По таблице регистров специальных функций (SFR) определите адреса регистров управления и настройки последовательного порта.
  3. Определите значение регистров настройки последовательного порта и таймера, используемого для синхронизации.
  4. Рассчитайте значения регистров таймера, используемого для синхронизации.
  5. Войдите в интегрированную среду программирования Keil-C. Создайте и настройте должным образом проект.
  6. Разработайте и введите текст программы в соответствии с созданным алгоритмом.
  7. Оттранслируйте программу, и исправьте синтаксические ошибки.
  8. Настройте скорость UART терминала программы nwFlash соответственно заданию.
  9. Загрузите полученный *.hex файл в лабораторный стенд LESO1 .
  10. Убедитесь, что в окне терминала вывелась фамилия студента.

4.2 Управление микроконтроллером через последовательный порт (дополнительно)

  1. Измените программу таким образом, чтобы данные из микроконтроллера отсылались только по команде, переданной с компьютера. Передача команды осуществляется через терминал nwFlash.
  2. Загрузите полученный *.hex файл в лабораторный стенд LESO1 .
  3. Убедитесь, что программа работает должным образом.

Таблица 5 – Варианты заданий

номер вариант скорость UART
1 300 бит/с
2 600 бит/с
3 1200 бит/с
4 1800 бит/с
5 2400 бит/с
6 4800 бит/с
7 7200 бит/с
8 9600 бит/с
9 600 бит/с
10 1200 бит/с
11 1800 бит/с
12 2400 бит/с
13 4800 бит/с
14 7200 бит/с
15 9600 бит/с

5 Указания к составлению отчета

Отчет должен содержать:

  1. Цель работы.
  2. Диаграмму передачи данных по последовательному порту.
  3. Расчет параметров синхронизации (настройки таймеров).
  4. Графическую схему алгоритма работы программы.
  5. Исходный текст программы.
  6. Содержимое файла листинга программного проекта.
  7. Выводы по выполненной лабораторной работе.

Схемы, а также отчет в целом, выполняются согласно нормам ЕСКД.



© 2024 beasthackerz.ru - Браузеры. Аудио. Жесткий диск. Программы. Локальная сеть. Windows