Uart схема подключения. USART и UART: в чем различие

12.06.2019

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 . Незаконное копирование, цитирование, воспроизведение преследуется по закону!

В этом уроке я расскажу про 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 , RS-232 , COM и т.п. В данном посте я хочу немного прояснить ясность.



UART описывает логику работу , здесь логическая 1-а подразумевается как высокий уровень сигнала , а логический 0-ль, как низкий уровень сигнала . Физически…, что такое низкий и высокий уровень сигнала зависит от технологии на которой построена микросхема TTL , CMOS и т.д.

Т.к. большинство микросхем являются TTL , то, под логической единицей и нулем в UART понимается и +5В , как было сказано ранее. Но для передачи данных на расстояние , т.е. вне платы, использовать такие уровни уже нельзя, из-за плохой помехозащищенности . Поэтому, были разработаны следующие физические уровни UART:

  • RS-232 (он же COM порт);
  • RS-422
  • RS-423 (используется для автоматизации в промышленности);
  • RS-485 (используется для автоматизации в промышленности);
  • IrDA (UART с использованием инфракрасного диапазона световых волн, по другому ИК порт)

RS-232 ранее применялся в домашних компьютерах под именем COM порт и служил для подключения мышек, модемов, принтеров . Можно сказать — это самый распространенный из физических уровней UART . Название строится из словосочетания «Recommended Standard 232 «, стандарт был разработан «Ассоциацией электронной промышленности (EIA) » в далеком 1962 году.

Стандарт со временем развивался:

  • RS-232C (1968 г.);
  • EIA-232D (1987 г.) — с 1986 года EIA вместо RS стала использовать аббревиатуру EIA;
  • TIA/EIA 232-E (1991);
  • ANSI/TIA/EIA-232-F (1997 г.).

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

RS-232 был настолько успешен , что на его основе были созданы идентичные как отечественные так и зарубежные стандарты:

  • (2000 г.);
  • (1993 г.);
  • ГОСТ 18145-81
  • ГОСТ Р 50668-94

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

(если вам все-таки понадобятся оригинальные стандарты, купить их можно можно на сайте TIA (ассоциация телекоммуникационной промышленности США))

В качестве разъема для RS-232 используется 25-и пиновые и 9-и пиновые разъёмы типа D-sub , которые имеют сокращенную запись DB25 и DB9 (иногда называемая CANNON 25 и CANNON 9 ).

Больше прижились разъемы DB9 .

Зачем столько контактов, если для последовательного универсального порта (UART) достаточно два провода данных TX и RX и провод GND?

Дело в том, что, в стандарте RS-232 помимо вышеуказанных применяются еще и сервисные сигналы, наподобие «готовность терминала «, «запрос на отправку «, «готовность приема » и т.п. Сейчас сервисные сигналы далеко не всегда применяются в оборудование, не исключено что они ограничиваются только TX , RX и GND как в «чистом» UART .

Важно заметить что в RS-232 в качестве уровня логической единицы используется диапазон от -3В до -12В , а логический ноль от +3В до +12 .

(изображение заимствованно из «Гук М. Аппаратные интерфейсы ПК»)

От-3В до +3В , считается зоной неопределенности .

Стандарт RS-232 манипулирует двумя типами оборудования

  • DTE — «оборудования ввода данных», это как привило компьютер
  • DCE — «оконечное оборудование линии связи», это как правило модем/мышь/принтер и т.п.

Для DTE используются разъема типа «папа «, для «DCE » разъемы типа «мама «. Если у вас на компьютере есть COM порт, посмотрите… вы увидите разъем с штырями , т.е. «папа».

Зачем я об этом? Дело в том, что для для соединения устройств с COM портом есть прямой и обратный кабель . Что-бы соединить DTE и DCE (например компьютер и модем) необходимо напрямую соединить все ножки и разъемы, это означает что, ножка отвечающая за передачу данных (RxD ) входит в одноименный разъем (RxD ). Такой соединение называют прямое , а кабель прямой или «модемный «.

Бывают случае когда надо соединить два DTE (например два компьютера), тогда используют обратное соединение , называемое «нуль-модемный » кабель. В этом случае с RxD 1-ого компьютера соединяется с TxD 2-ого и TxD 1-ого с RxD 2-ого .

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

Вам будет интересно:

Universal Asynchronous Receiver-Transmitter, UART — узел вычислительных устройств, предназначенный для организации связи с другими цифровыми устройствами. Преобразует передаваемые данные в последовательный вид так, чтобы было возможно передать их по цифровой линии другому аналогичному устройству. Метод преобразования хорошо стандартизован и широко применялся в компьютерной технике.

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

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

Последовательный порт

serial port , COM-порт , communications port ) — сленговое название интерфейса стандарта RS-232 , которым массово оснащались персональные компьютеры . Порт называется «последовательным», так как информация через него передаётся по одному биту , последовательно бит за битом (в отличие от параллельного порта). Несмотря на то, что некоторые интерфейсы компьютера (например, Ethernet , FireWire и USB) тоже используют последовательный способ обмена информацией, название «последовательный порт» закрепилось за портом стандарта RS-232 .

В настоящее время в IBM PC-совместимых компьютерах практически вытеснен интерфейсом USB .

Существуют стандарты на эмуляцию последовательного порта над USB и над Bluetooth (эта технология в значительной степени и проектировалась как «беспроводной последовательный порт»).

Метод передачи и приёма

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

Существует общепринятый ряд стандартных скоростей: 300; 600; 1200; 2400; 4800; 9600; 19200; 38400; 57600; 115200; 230400; 460800; 921600 бод.

Скорость (, бод) и длительность бита (, секунд) связаны соотношением

Скорость в бодах иногда называют сленговым словом битрейт .

Помимо собственно информационного потока, UART автоматически вставляет в поток синхронизирующие метки, так называемые стартовый и стоповый биты . При приёме эти лишние биты удаляются из потока. Обычно стартовый и стоповый биты обрамляют один байт информации (8 бит), однако встречаются реализации UART, которые позволяют передавать по 5, 6, 7, 8 или 9 бит.

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

Принято соглашение, что пассивным (в отсутствие потока данных) состоянием входа и выхода UART является логическая 1.

Стартовый бит всегда логический 0, поэтому приёмник UART ждёт перепада из 1 в 0 и отсчитывает от него временной промежуток в половину длительности бита (середина передачи стартового бита). Если в этот момент на входе всё ещё 0, то запускается процесс приёма минимальной посылки. Для этого приёмник отсчитывает 9 битовых длительностей подряд (для 8-битных данных) и в каждый момент фиксирует состояние входа. Первые 8 значений являются принятыми данными, последнее значение проверочное (стоп-бит).

Значение стоп-бита всегда 1 , если реально принятое значение иное, UART фиксирует ошибку.

Для формирования временных интервалов передающий и приёмный UART имеют источник точного времени (тактирования). Точность этого источника должна быть такой, чтобы сумма погрешностей (приёмника и передатчика) установки временного интервала от начала стартового импульса до середины стопового импульса не превышала половины (а лучше хотя бы четверти) битового интервала. Для 8-битной посылки 0,5/9,5 = 5 % (в реальности не более 3 %). Поскольку эта сумма ошибок приёмника и передатчика плюс возможные искажения сигнала в линии, то рекомендуемый допуск на точность тактирования UART — не более 1,5 %.

Поскольку синхронизирующие биты занимают часть битового потока, то результирующая пропускная способность UART не равна скорости соединения. Например, для 8-битных посылок формата 8-N-1 синхронизирующие биты занимают 20 % потока, что для физической скорости 115 200 бод даёт битовую скорость данных 92 160 бит/с или 11 520 байт/с.

Контроль чётности

Основная статья: Бит чётности

Многие реализации UART имеют возможность автоматически контролировать целостность данных методом контроля битовой чётности. Когда эта функция включена, последний бит данных в минимальной посылке («бит чётности») контролируется логикой UART и содержит информацию о чётности количества единичных бит в этой минимальной посылке. Различают контроль на четность (англ. Even parity ), когда сумма количества единичных бит в посылке является четным числом , и контроль на нечетность (англ. Odd parity ), когда эта сумма нечетна. При приеме такой посылки UART может автоматически контролировать бит четности и выставлять соответствующие признаки правильного или ошибочного приема.

Короткая запись параметров

Был выработан и прижился короткий способ записи параметров UART, таких, как

количество бит данных - наличие и тип бита четности - количество стоп-бит .

Выглядит как запись вида цифра-буква-цифра , где:

  • Первая цифра обозначает количество бит данных, например, 8.
  • Буква обозначает наличие и тип бита четности.

N (No parity) — без бита четности;

E (Even parity) — с битом проверки на четность,

O (Odd parity) — с битом проверки на нечетность;

  • Последняя цифра обозначает длительность стоп-бита.

Встречаются значения 1, 1.5 и 2 для длительности стоп-бита в 1, 1.5 и 2 битовых интервала соответственно.

Например, запись 8-N-1 обозначает, что UART настроен на 8 бит данных без бита четности и один стоповый бит. Для полноты параметров эту запись снабжают указанием.

Break

Специальная посылка - состоит из

непрерывного нулевого состояния линии длительностью заведомо больше минимальной посылки, обычно 1,5 минимальных посылки (для 8N1 это 15 битовых интервалов). Некоторые коммуникационные протоколы используют это свойство, например, протокол LIN использует Break для обозначения нового кадра.

Управление потоком

Ранние устройства с UART могли быть настолько медлительными, что не успевали обрабатывать поток принимаемых данных.

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

Позже управление потоком возложили на коммуникационные протоколы (например, методом XOn/XOff), и надобность в отдельных линиях управления потоком постепенно исчезла.

Физический уровень

Логическая схема UART имеет входы-выходы с логическими уровнями, соответствующими полупроводниковой технологии схемы: КМОП , ТТЛ и т. д. Такой физический уровень может быть использован в пределах одного устройства, однако непригоден для коммутируемых длинных соединений по причине низкой защищённости от электрического разрушения и помехоустойчивости.

Есть одна замечательная микросхемка — FT2232D. Это конвертер USB-UARTx2. Удобно когда надо получить два UART хвоста из одного USB провода. Но это семечки по сравнению с тем, что в эту микруху FTDI внедрили мощную аппаратную поддержку MPSSE (Multi-Protocol Synchronous Serial Engine), что позволяет на одной только этой микрухе реализовать кучу разных интерфейсов вроде SPI или JTAG.
Что дает просто широчайший простор под построение разнокалиберных программаторов под все что угодно. На данный момент я видел схемы для прошивки AVR, ARM, Altera и бог еще весть чего.

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

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

Готовую программу надо каким-либо образом запихать в контроллер. Для этого существует множество способов.

JTAG/SWD адаптер
Так как часто для отладки под ARM используется JTAG, то этот метод получается наверное самым популярным. Для этой цели используется какой-либо адаптер. Например я использую так что показывать буду на его примере. Там все просто — подключаешь адаптер к контроллеру стандартным SWD или JTAG шлейфом. Через линии NRST/TDI/TDO/TCK/TMS для JTAG или через SWO/SWOCLK/SWDIO/NRST для SWD режима. На адаптере моей верси CoLinkEX оба эти разьема выведены на одну колодку, так что получается как бы сразу и JTAG и SWD соединение. А там какое надо такое и выбираешь. Особой разницы в отладке/прошивке между ними нет.

Либо используя утилитку CoFlash oт CooCox.com

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

Идеально для передачи данных и обработки длительных процессов.

Для примера покажу буфферизированный вывод данных по USART на прерываниях.

В прошлых примерах был такой код:

// Отправка строки void SendStr(char *string) { while (*string!="\0") { SendByte(*string); string++; } } // Отправка одного символа void SendByte(char byte) { while(!(UCSRA & (1<

Данный метод, очевидно, совершенно неэффективен. Дело в том, что у нас тут есть тупейшее ожидание события — поднятие флага готовности USART. А это зависит, в первую очередь, от скорости передачи данных. Например, на скорости 600 бод передача каких то 600 знаков будет длиться 9 секунд, блокируя работу всей программы, что ни в какие ворота не лезет.

Как то раз мне потребовалось устройство способное соединяться с удаленным сервером и пересылать байты. Конечно, для этих целей можно использовать компьютер, но это громоздко и неудобно, да и надежность такой системы оставляет желать лучшего — слишком сложное устройство. Другое дело микроконтроллер, например Microchip PIC, MSC-51 или Atmel AVR — простой, надежный, потребляет минимум энергии и способен надежно выполнить узкий круг поставленных задач. Например, мониторинг сигнализации через Internet или Ethernet сеть. Всё бы хорошо, но тут появляется очередная проблема — протокол TCP/IP. Реализовать на AVR или PIC стек протоколов TCP/IP задача выполнимая, но требует времени, а время, как известно, деньги. Надо было срочно и с минимальным геморроем. И вот тут мне на помощь пришел интерфейсный модуль Ethernet — RS232. Задача стандартная, поэтому предложений на рынке готовых модулей предостаточно, однако не стоит торопиться. Тут есть ряд тонкостей, связанных с особенностями работы данных устройств. Например, подавляющее большинство модулей может работать исключительно в роли сервера, которому требуется выделенный IP адрес. Устройство-клиент работает только с специализированным софтом, как правило под Windows, и открывает виртуальный COM порт который соединяется с удаленной системой (UART — Ethernet модуль) и обеспечивает обмен данными. Не самый удобный вариант. Для моей задачи данная конструкция была совершенно непригодна. Поэтому я начал искать дальше, вскоре был обнаружен замечательный модуль EG-SR-7100 , а потом и его более новая модификация WIZ100SR . Почитал характеристики — оно! Все для решения моей задачи!

Прикупил я себе парочку модулей HM-TR433 . Так, помучить. Стоит такая радость на данный момент порядка 800рублей. Это трансивер, то есть он может как принимать, так и передавать. Мало того, тут стоит управляющий контроллер, который сам кодирует информацию, загоняет ее в радио канал и декодирует пойманное. То есть, по сути, мы получаем удлинитель UART и всякие проблемы вроде шума после пропадания несущей, какие были в связке HM-T433/HM-R433 нас уже не волнуют. Один минус — канал полудуплексный, то есть синхронный прием и передача невозможны, только по очереди. Но это не велика проблема — зачастую полудуплекса хватает за глаза.


Существует две модификации этого модуля. Одна имеет окончание TTL другая RS232. Разница лишь в уровнях и в том, что в первую китайцы забыли впаять MAX232 и обвязку из конденсаторов, зато поставили перемычки. Так что имея прямые руки и нужный инструмент можно из TTL сделать RS232 и наоборот. Впрочем, по цене они копейка в копейку идут.

Такс, в порядке работы над коммерческим проектом (и не спрашивайте о каком — не скажу), который сожрал все мое свободное время огромной зазубренной ложкой, раскурил до самого пепла радиомодули HopeRF HM-R433/HM-T433 . Сегодня собрал полудуплексную схему на четырех модулях и провел сеанс дальнобойной приемо-передачи.

Итак, что из себя представляла установка:

Блок А:

  • Передатчик: HM-T433
  • Приемник: HM-R433
  • Расположение блока: 5 этаж, на столе. У северной стены.
  • Питание: 5 вольт.
  • Скорость передачи: 4800 бод.
  • Длина пакета данных: 10 байт.

Блок Б:

  • Передатчик: HM-T433
  • Приемник: HM-R433
  • Антенна передатчика: Кусок провода МГТФ длинной 17см (1/4 от длины волны 433Мгц сигнала) загнутый абы как.
  • Антенна приемника: та же херня.
  • Расположение модулей: параллельно друг другу, на расстоянии 2см, усики антенн разбросаны в разные стороны, на манер тараканьих.
  • Расположение блока: У меня в руках, на земле. С южной стороны дома (смотри схему)
  • Питание: 5 вольт.
  • Скорость передачи: 4800 бод.
  • Длина пакета данных: 10 байт.

Условие передачи:
Блок Б дает десятибайтный пакет блоку А, тот, убедившись, что пакет принят без искажений, шлет подтверждение обратно на блок Б, те же десять байт. Блок Б, получив подтверждение зажигает зеленый диод. Передача идет с обрывом несущей. Т.е. после отправки пакета передатчик вырубается полностью.


При первоначальных испытаниях сея железка показала себя с лучшей стороны, но вот на практике вылезли не просто баги, а прям гигантские тараканы убийцы. Казалось бы, чему там работать не так? А, как оказалось, есть чему. Точнее это не баги, а особенности, о которых производитель самым подлым образом умолчал в даташитах. Знай я о них я бы еще подумал стоит ли их покупать. Итак:

Несущая
Приемник ловит изменение несущей, которую генерирует передатчик. А если не будет передатчика, что будет ловить приемник? По идее не должен ловить ничего, а что на практике? А на практике дикий срач!!! Натурально белый шум по всему диапазону от 0 до 255. Фигасе бага, да? Но ладно, хрен с этим белым шумом, его, в конце концов, можно фильтровать, отслеживать в нем наличие чего либо разумного и лишь после начинать прием.

Ждущий режим
У передатчика, к моему, а также ряда внимательных читателей, удивлению нет входа Enable. У приемника то есть. Редкостный бред, особенно ввиду того, что спустя 70mS простоя на линии DATA передатчик впадает в спячку и… правильно, отрубает несущую — на выходе приемника начинается в этот момент жуткий срач. Так что либо шли данные непрерывным потоком, либо перед каждой посылкой шли идентификационный пакет. А еще не забыв предупредить приемник о том, что передача закончена и дальше ловить нечего.

Совместная работа
Тут все просто, два передатчика одновременно работать не могут. От слова совсем. Либо по отдельности, либо никак. Это было ожидаемо и это надо учитывать.

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

В числе прочих ништячков, помимо ультразвукового дальномера мне в посылке из Терры пришли еще и радиомодули. Hope HM-T433 и Hope HM-R433 На передачу и на прием, соответственно. Сам модуль представляет из себя крошечную платку 15х25 мм с торчащим из нее разъемом. У передатчика разъем трехконтактный — GND, DATA и Vcc у приемника есть еще вход ENABLE при подаче на который высокого уровня разрешается прием.

Возникла у меня необходимость забабахать себе девайсину, чтобы можно было с его помощью раздавать байты по i 2 c и UART , а также принимать байты по этим же протоколам и выдавать на экранчик. Как по одному, так и пачками. Этакий дебаггер.

Ну а чо, сказано сделано. Воткнул ATMega8535 — первая которая под руку подвернулась из многоногих. Вывел все что только можно наружу, присобачил небольшую клавиатурную матрицу 4х4 и LCD экранчик . Экранчик мелкий WH0802A 8х2 символа, но уж какой был. Других у нас в продаже не встречал, а под заказ везти лень. Да и, думаю, там и не надо больше.

А раз уж пошла такая пьянка, то до кучи вывел наружу пару каналов ШИМ , да пару входов АЦП . Ну и SPI заодно — гулять так гулять. Там же можно и Dallas 1-wire проткол организовать, приделать частотомер, индикатор сигнала, вольтмер и вообще можно много чего наворотить, было бы желание. Опять же, линий на вход/выход получается дофига, так что из нее можно сделать головной блок умного дома или контроллер чего нибудь.

Корпус взял халявный, PAC-TEC ‘овский который намутил года два назад. Вот и пригодится коробочка:) Надо сказать, PAC-TEC делает просто изумительные коробки. Не чета тому говну, что продается в наших радиомагазинах. Не скрипят, не люфтят, крепко сбиты, ладно скроены и выглядят круто. Где бы их еще продавали у нас.

Пока только плату развел, еще некоторых деталей не хватает. На днях вытравлю плату, соберу и буду программировать. Вот тогда будет вам и примеры живого кода и подробное описание SPI , i2c, UART, клавиатура и LCD . Кстати, обратите внимание как легко матрицировать обычные тактовые кнопки. А все благодаря тому, что у них четыре попарно соединенных вывода.

Пока же, раз все еще в виде чертежа, набрасывайте в комменты свои идеи по поводу фич будущего девайса.

Пока писал статью про UART пришла в голову одна извращенная идея — на базе UART же можно организовать самый натуральный низкодискретный ШИМ!

Достаточно только сделать где-нибудь в памяти переменную, куда мы будем совать число с заданной скважностью нулей и единиц, а по прерыванию опустошения буфера это число снова пихать в регистр UDRE. Таким образом, генерация ШИМ будет самопроизвольной, без лишних телодвижений. Правда можно получить всего 10 разных значений ШИМ, но зато нахаляву!!!

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

00000000 — 1/10
00000001 — 2/10
00000011 — 3/10
00000111 — 4/10
00001111 — 5/10
00011111 — 6/10
00111111 — 7/10
01111111 — 8/10
11111111 — 9/10

Да и частоты там можно получить нефиговые!
Красота!=)))))

Почти каждый микроконтроллер имеет на борту универсальный последовательный интерфейс — UART . AVR тут не исключение и поддерживает этот протокол в полном обьеме полностью аппаратно. По структуре это обычный асинхронный последовательный протокол, то есть передающая сторона по очереди выдает в линию 0 и 1, а принимающая отслеживает их и запоминает. Синхронизация идет по времени — приемник и передатчик заранее договариваются о том на какой частоте будет идти обмен. Это очень важный момент! Если скорость передатчика и приемника не будут совпадать, то передачи может не быть вообще, либо будут считаны не те данные.

Протокол
Вначале передатчик бросает линию в низкий уровень — это старт бит . Почуяв что линия просела, приемник выжидает интервал Т1 и считывает первый бит, потом через интервалы Т2 выковыриваются остальные биты. Последний бит это стоп бит . Говорящий о том, что передача этого байта завершена. Это в самом простом случае.

В конце байта, перед стоп битом, может быть и бит четности. Который получается если поксорить между собой все биты, для контроля качества передачи. Также может быть два стопа, опять же для надежности. Битов может быть не 8, а 9. О всех этих параметрах договариваются на берегу, до начала передачи. Самым же популярным является 8 бит, один старт один стоп, без четности.

Причем с самим протоколом можно не заморачиваться — все реализовано аппаратно. Разве что захочется завести второй UART, тогда придется делать его программно.

По такому же протоколу работает COM порт компьютера, разница лишь в разнице напряжений, поэтому именно этот протокол я буду использовать для связи микроконтроллера с компом. Для преобразования напряжений можно использовать RS232-TTL конвертер. COM порт. Но есть тут одна проблема — дело в том, что комповый RS232 он за логические уровни принимает +/- 12 вольт, а UART работает на пятивольтовых уровнях. Как их совместить? Для этого существует несоколько вариантов схем преобразователей уровня, но самая популярная это все же на специальном преобразователе RS232-TTL . Это микросхема MAX232 и ее аналоги.
Практически каждая фирма делает свой преобразователь, так что тут сгодится и ST232 , и ADM232 , и HIN232 . Схемка простая как три копейки — вход, выход, питание и обвязка из пяти конденсаторов. Конденсаторы обычно ставятся 1uF электролиты, но в некоторых модификациях ставится 0.1uF керамика. Я везде впаивал 0.1uF керамику и обычно этого хватало. :) Работает как часы. Если же на высоких скоростях будет глючить, то надо будет повышать емкость.


Кстати, существует еще и MAX3232 это то же самое, но на выходе у него не 5вольт TTL, а 3.3 вольта TTL. Её используют для низковольтных контроллеров.

Я себе сделал один такой универсальный шнурочек, чтобы к контроллерам цепляться было удобно по UART . Для общей компактности всю схему запихал прям в разъем, благо у меня были ST232 в soic корпусе. Получилась платка не больше рублевой монеты. Так как под рукой не было мелких SMD конденсаторов, то пришлось напаять кондеры сверху, кто во что горазд. Главное работает, хоть и не очень красиво вышло.


Если сомневаешься, что у тебя получится столь мелкий монтаж, то я тебе развел плату на стандартный PDIP корпус. Размером она будет со спичечный коробок, зато мельчить не надо.


После сборки проверяется просто:
Втыкается в разъем COM порта. Подается 5 вольт питания на схему, а затем замыкаешь Rx на Tx (у меня это зеленый и желтый провода).

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

Если работает, то дальше все просто. Тот провод который идет от ножки 9 микросхемы MAX232 это передающий вывод , его заводи на ногу RxD контроллера. А тот который с ножки 10 — принимающий , его смело сажай на вывод TxD контроллера.


Плата сделана была методом ЛУТ , в одном месте по моему недосмотру толщина просвета оказалась 0.05мм, протравилась, но со спайками, пришлось процарапывать. А в целом с первого раза ать и никаких проблем. Аж сразу захотелось сделать что нибудь маленькое маленькое, нафаршированное нафаршированное:)

Похожие статьи