Как подключить uart к компьютеру
Универсальный асинхронный приёмопередатчик (Univsersal Asynchronos Reciever-Transmitter) - это физическое устройство приёма и передачи данных по двум проводам. Оно позволяет двум устройствам обмениваться данными на различных скоростях. В спецификацию UART не входят аналоговые уровни на которых ведётся общение между устройствами, UART это протокол передачи единиц и нулей, электрическую спецификацию на себя берут другие стандарты, такие как TTL (transistor-transistor logic — транзисторно-транзисторная логика), RS-232, RS-422, RS-485 и другие (RS [англ.recommended standard] — рекомендованный стандарт). На данный момент в микроконтроллерах используется в основном TTL (или точнее CMOS) UART для соединения не более двух устройств. В наших примерах мы часто называем его последовательным портом.
Подключение:
У каждого устройства, поддерживающего UART обычно обозначены два вывода: RX и TX. TX — означает transmit (передаю), RX — receive (принимаю). Отсюда становится понятно что RX одного устройства нужно подключать к TX другого. Если Вы подключите RX одного устройства к RX другого, то оба устройства будут слушать друг друга, вы соединили их входы. Если соединить TX и TX - это уже более опасно, это выходы низкого сопротивления устройств и если на одном будет логическая единица, а на втором ноль — по проводу пойдёт ток короткого замыкания (это зависит от конкретной программной или аппаратной реализации). Хотя в современных чипах от этого есть защита, на всякий случай, не стоит на неё ориентироваться. Так же необходимо объединить референсные уровни двух устройств (GND-GND), если не подразумевается гальваническая развязка.
Пример соединения двух UNO:
UART на Arduino:
На Arduino и Arduino-совместимых платах аппаратный UART обозначается символами RX и TX рядом с соответствующими выводами. На Arduino UNO/Piranha UNO это 0 и 1 цифровые выводы:
Arduino UNO/Piranha UNO
В скетче инициализируется функцией begin() в коде функции setup():
Пример:
Piranha ULTRA
На Piranha ULTRA присутствуют два аппаратных UART. Один на тех же выводах, что и UNO, второй на 8 (RX) и 9 (TX) выводах:
В Arduino IDE второй аппаратный UART называется Serial1 (Сериал один), и инициализируется так же как и первый:
Arduino MEGA
На заметку: На многих Arduino и Arduino-совместимых платах UART0 используется для загрузки скетчей, так что если Ваш скетч не загружается, проверьте эти выводы. Во время загрузки скетча к ним ничего не должно быть подключено.
Отладка проектов при помощи UART
Пример:
Программный UART на Arduino
Помимо аппаратного UART в Arduino можно использовать программный. Программный порт хорошо подходит для простых проектов, не критичных к времени работы кода или для отладки проектов, позволяя не отключать модули использующие UART во время загрузки сетчей. При его использовании нужно лишь помнить что никакой другой код не может выполняться пока программа занимается считыванием данных из него и передача может осуществляться только в полудуплексном или симплексном режимах. Так же на программный RX можно назначать только те выводы, которые поддерживают прерывание по смене уровней. На UNO, например, это все цифровые выводы, кроме 13-го. Прежде чем собирать свой проект, проконсультируйтесь с инструкцией к конкретной плате.
Пример использования программного порта:
Далее к программному порту нужно обращаться через объект mySerial . Например: mySerial.write(data); .
UART на Raspberry Pi:
На Raspberry Pi UART находится на выводах колодки 8 - TX (GPIO14) и 10 - RX (GPIO15)
Перед работой с последовательным портом необходимо его включить. Сделать это можно из эмулятора терминала командой sudo raspi-config -> Interfacing options -> Serial -> No -> Yes -> OK -> Finish или из графической среды в главном меню -> Параметры -> Raspberry Pi Configuration -> Interfaces -> Serial Port
Пример работы с последовательным портом на Python:
Данный пример выводит строку "iArduino.ru" в последовательный порт Raspberry и ждёт данных из последовательного порта.
Подробнее о UART:
Параметры
При обозначении параметров UART принято использовать короткую запись ЦИФРА-БУКВА-ЦИФРА
- ЦИФРА — количество бит в кадре
- от 5 до 9 бит. Обычно 8.
- N - None (Отсутствует) без бита чётности
- E - Even (Чётный). Проверка данных на чётность. Перед стоп-битом в кадр добавляется бит: 0 если в кадре было нечётное количество единиц, 1 — если чётное.
- O - Odd (Нечётный). Проверка данных на нечётность. Перед стоп-битом в кадр добавляется бит: 1 если в кадре было нечётное количество единиц, 0 — если чётное.
- 1, 1.5, 2. Продолжительность стоп-бита (1, 1.5 или 2 битовых интервала)
Кадрирование данных
При приёме-передаче данных каждое устройство ориентируется на своё внутреннее тактирование. Обычно это тактирование от 8 до 16 раз быстрее скорости передачи данных и обычно отсчитывается от стартового бита. Именно поэтому необходимо чтобы оба устройства были настроены на одну и ту же скорость передачи.
Так же при передаче данных присутствуют синхронизирующие биты, именуемые старт-бит и стоп-бит. Старт-бит сигнализирует о начале передачи данных и стоп-бит, соответственно об окончании.
Рассмотрим кадр данных:
При разговорах о серийный протоколах принято использовать такие слова как кадр и пакет. Кадр - интервал от старт-бита до стоп-бита. Пакет - количество кадров полезных данных. При этом не стоит путать кадр и байт: байт - это только сами данные, не включающие в себя синхронизирующие и проверочные биты.
Старт-бит:
При отсутствии передачи линия удерживается в состоянии логической единицы (в случае TTL Arduino это 5 вольт или Vcc). Как только передающее устройство притягивает линию к 0 (GND или 0 вольт в случае Arduino), это сигнализирует принимающему устройству о том что сейчас будет передача данных.
Данные:
При появлении старт-бита на линии принимающее устройство начинает отсчитывать время в соответствии с установленной скоростью и считывать состояния линии через определённые промежутки времени в соответствии с установленным количеством бит данных, после этого.
Стоп-бит:
По завершении передачи данных принимающее устройство ожидает стоп-бит, который должен быть на уровне логической единицы. Если по завершении кадра удерживается логический ноль, значит данные неверны. Если логический ноль удерживается время, превышающее длину кадра в 1,5 раза, такое состояние именуется break (разрыв линии, исторически пошло от устройств, использующих токовую петлю для передачи данных). Некоторые передатчики вызывают это состояния специально перед посылкой пакета данных. Некоторые приёмники считают такое состояние за неправильно выставленную скорость и сбрасывают свои настройки на установки "по умолчанию".
Скорость передачи данных
Скорость изменения логических уровней (импульсов) на линии принято измерять в бодах. Единица измерения названа так в честь французского изобретателя Жана Мориса Эмиля Бодо.
Скорость при использовании UART может быть любой, единственное требование — скорости передающего и принимающего должны быть одинаковы. Стандартная скорость UART принята за 9600 бод. Arduino без проблем и лишних настроек может принимать и передавать данные на скоростях до 115200 бод.
Методы связи
UART позволяет одновременно передавать и принимать данные, однако не всегда это возможно или нужно. Например, если Вам нужно только получать не критические данные (которые можно проверить следующим пакетом, например расстояние, посылаемое лидаром каждые несколько сотен миллисекунд) от цифрового датчика или любого другого устройства и не нужно ничего передавать, такой метод называется симплексным. Всего различают три метода связи:
В этом уроке я расскажу про UART интерфейс в микроконтроллерах AVR и про работу с ним в BASCOM-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 на практике, сначала соберём простую схему:
Потом наберём простую программку, (используя полученные знания) и откомпилируем её. Вот и она:
А работать эта программка будет так: сначала будет посылать в UART текст, а потом будет ждать приёма данных (в данном случае числа) которые запишутся в переменную a и позже пошлёт текст вместе с переменой. Для тех, кому лень компилировать, в файлах к уроку есть готовая прошивка. Прошиваем микроконтроллер, подключаем выводы микроконтроллера RXD, TXD (подключаем, как я писал выше) и GND к COM порту компьютера (через конвертер уровней) или к USB (USB – UART переходник), открываем на компьютере программу для работы с COM портами, например: Terminal by Bray, Hyper Terminal или Terminal emulator в BASCOM-AVR, указываем COM порт к которому подключились, указываем скорость в бодах, смотрим в окно программы, подаём питание на микроконтроллер и радуемся. Необходимо также учесть, что после прошивки микроконтроллера необходимо установить фьюз биты на нужную нам тактовую частоту генератора в данном случае (для программки выше) на 8МГц. На 8МГц можно использовать внутренний тактовый генератор микроконтроллера и установить фьюз биты вот так (для PonyProg2000):
На фотографии у меня плата для программирования Attiny2313, USB-UART переходник и программатор USBtiny. Ниже вы можете посмотреть видео, как это работает
UART (Universal Asynchronous Transmitter Receiver) это наиболее распространенный протокол, используемый для полнодуплексной последовательной связи. Устройство отправляет и получает данные из одной системы в другую. В этом мануале мы подробно изучим основы связи и работу протокола UART, подробное описание интерфейса и распиновку разъёмов..
Что такое UART
UART означает универсальный асинхронный приемник-передатчик. Это периферийное оборудование, которое находится внутри микроконтроллера. Функция UART заключается в преобразовании входящих и исходящих данных в последовательный двоичный поток. Восьмибитные последовательные данные, полученные от периферийного устройства, преобразуются в параллельную форму с использованием последовательного преобразования в параллельное, а параллельные данные, полученные от ЦП, преобразуются с помощью преобразования из последовательного в параллельный. Эти данные представлены в модулирующей форме и передаются с определенной скоростью передачи.
Почему используют UART
Для быстрой связи используются такие протоколы, как SPI (последовательный периферийный интерфейс) и USB (универсальная последовательная шина). Но когда высокоскоростная передача данных не требуется, применяют протокол UART. Это дешевое устройство связи с одним передатчиком и приемником. Тут требуется лишь один провод для передачи данных и один для приема. О конвертере USB-ART прочитайте по ссылке.
Его можно подключить к персональному компьютеру с помощью преобразователя RS232-TTL или USB-TTL. Сходство между RS232 и UART заключается в том, что им обоим не нужен таймер для передачи и приема данных. Кадр UART состоит из 1 стартового бита, 1 или 2 стоповых битов и бита четности для последовательной передачи данных.
Блок-схема UART
UART состоит из следующих основных компонентов: передатчик и приемник. Передатчик состоит из регистра удержания передачи, регистра сдвига передачи и логики управления. Точно так же приемник состоит из регистра удержания приема, регистра сдвига приемника и логики управления. Обычно и передатчик, и приемник снабжены генератором скорости передачи данных.
Генератор скорости передачи данных формирует скорость, с которой передатчик и приемник должны отправлять и получать данные. Регистр удержания передачи содержит передаваемый байт данных. Регистр сдвига передачи и регистр сдвига приемника сдвигают биты влево или вправо, пока байт данных не будет отправлен или получен.
В дополнение к этому, предусмотрена логика управления чтением или записью, указывающая когда читать и записывать. Генератор скорости передачи данных формирует скорости в диапазоне от 110 бит / с до 230400. В большинстве случаев микроконтроллеры предлагают более высокие скорости передачи, такие как 115200 и 57600 бит / с, но такие устройства как GPS и GSM, используют более низкую скорость в 4800 и 9600 бод.
Как работает UART
Передатчик и приемник используют стартовый бит, стоповый бит и параметры синхронизации для взаимодействия друг с другом. Исходные данные находятся в параллельной форме. Например есть 4-х битные данные, и чтобы преобразовать их в последовательную форму нужен преобразователь из параллельного в последовательный. Обычно для проектирования преобразователей используются D-триггеры.
D-триггер, также известный как триггер данных, сдвигает один бит со стороны входа на сторону выхода только тогда, когда таймер изменяет переход из высокого состояния в низкое или из низкого состояния в высокое. Точно так же, если надо передать 4 бита данных, понадобится 4 триггера.
Теперь спроектируем преобразователь из параллельного в последовательный и из последовательного в параллельный.
Параллельное преобразование в последовательное
Шаг 1: Возьмем 4 триггера. Количество триггеров эквивалентно количеству передаваемых битов. Точно так же поставим мультиплексоры перед каждым триггером, но исключая первый. Установлен мультиплексор для объединения данных и преобразования их в последовательные биты. Он имеет два входа: один параллельный бит данных, а другой - от предыдущего триггера.
Шаг 2: Теперь загружаем данные за раз в D-триггеры. Он будет извлекать параллельные данные и перемещать последний бит последнего триггера - четвёртый, затем третий бит, второй и, наконец, первый бит. Теперь для преобразования параллельных данных в последовательную форму используется другой преобразователь.
Последовательное преобразование в параллельное
Шаг 1: Возьмем 4 триггера. Количество триггеров совпадает с количеством передаваемых битов.
Шаг 2: Сначала отключим параллельную шину. Не включаем пока не будут загружены все биты. Сохраним данные на входе первого триггера. Теперь установим высокий уровень тактовой частоты, это сдвинет младший бит на вход второго триггера и выход первого. Точно так же сдвинем все биты один за другим, сделав тактовый импульс высоким. Преобразователь находится в состоянии удержания до тех пор, пока все биты не будут переданы на выход.
Шаг 3: Теперь каждый триггер содержит один бит последовательных данных. Пока все биты передаются на выход триггера, активируем шину. Это заставит конвертер отправлять все биты за раз.
Формат протокола UART
Начинается связь со стартовым битом «0». Стартовый бит инициирует передачу последовательных данных, а стоповый бит завершает транзакцию данных.
Он также имеет бит четности (четный или нечетный). Бит четности представлен как «0» (четное количество единиц), а бит нечетной четности представлен как «1» (нечетное количество).
Передача данных
Передача данных осуществляется по одной линии передачи (TxD). Здесь «0» рассматривается как пробел, а «1» - как состояние отметки.
При передаче всегда сначала передается LSB (Least Significant Bit - младший значащий бит).
Прием данных
Для приема данных используется приёмная линия RxD.
Пример интерфейса UART
Этот пример демонстрирует взаимодействие ESP8266 UART с MAX232. Микросхема MAX232 питается от источника 5 В, и включает в себя генератор емкостного напряжения для управления напряжением 232 уровня. Она поставляется с двумя передатчиками, также называемыми драйвером (Tin, Tout) и приемниками (Rin и Rout).
Здесь использовался ESP8266 (32-битный микроконтроллер) со встроенным UART. Связь может осуществляться с ESP8266 с использованием AT-команд через преобразователь уровня RS232 в TTL (MAX232). На схеме показано подключение ESP8266 к компьютеру.
Запрашивая действительные AT-команды через ПК, микросхема Wi-Fi ответит подтверждением. Вот шаги для реализации последовательной связи с ПК.
- Подключить передатчик (TX) ESP8266 к приемнику (RX) преобразователя уровня RS232 в TTL (MAX232) и приемника ПК.
- Подключить приемник (RX) ESP8266 к TX ПК и RX преобразователя TTL.
Команды ESP8266
Далее показан ответ модуля ESP8266.
UART и USART
USART - это основная форма UART. Технически это не одно и то же, но определение для них одинаково. Это периферийные устройства микроконтроллера, которые преобразуют параллельные данные в последовательные биты и наоборот.
UART USART Тайминги генерируются внутри микроконтроллера. Отправляющее устройство сгенерирует тайминг. Скорость передачи данных низкая. Скорость передачи данных выше из-за внешних таймингов. Автономный протокол Поддерживает несколько протоколов, таких как LIN, RS-485, IrDA, смарт-карта и т. д. Перед передачей необходимо знать скорость передачи. Нет необходимости знать скорость передачи заранее. Подходит для низкоскоростной связи Подходит для высокоскоростной связи. Сниженный энергетический след. Обеспечивает последовательную связь при высоком энергопотреблении Основное различие между UART и USART заключается в том, что UART поддерживает только асинхронную связь, тогда как USART поддерживает как синхронную, так и асинхронную. Вот сравнение между USART и UART:
RS232 и UART
Логические уровни представляют собой уровни рабочего напряжения, которые устройство может выдержать для работы в безопасной зоне. Вот уровни напряжения для RS232 и TTL:
Логика TTL / CMOS
UART работает по TTL логике.
Первоначально последовательная линия находится в состоянии ожидания, обычно называемом статусом отметки (логическая 1). Теперь передача данных начинается со стартового бита (логический 0). Кроме того, по последовательной линии один за другим отправляются 8 бит данных, причем сначала младший бит LSB (Least significant bit - младший значащий бит). После завершения всей передачи идёт стоповый бит (логическая 1).
Преимущества и недостатки UART
- Преимущество UART в том, что протокол поддерживает полнодуплексную связь по двум проводам. Кроме того, для передачи данных не требуются внешний таймер. Он поддерживает проверку ошибок с помощью бита четности, а длину данных можно легко изменить.
- Основным недостатком является то, что он не поддерживает конфигурацию с несколькими ведомыми или несколькими ведущими устройствами. И размер пакета данных ограничен 9 битами. UART не подходит для сложной последовательной связи при высоком энергопотреблении.
Области применения протокола
Последовательный порт отладки использует драйвер UART для печати данных, поступающих извне. Можем использовать этот протокол для отправки и получения команд на встроенные устройства и от них. Также выполняется связь в GPS, модеме GSM / GPRS, чипах Wi-Fi и других модулях работающих с UART. Используется в доступе к мэйнфрейму для подключения разных компьютеров.
Форум по обсуждению материала UART ПРОТОКОЛ: ОПИСАНИЕ РАБОТЫ
Обсудим действующие стандарты радиосвязи, узнаем чем они отличаются, и когда использовать какие из них.
Описание нового Блютус протокола беспроводной связи - Bluetooth Mesh.
Связать микроконтроллер с компьютером. Микроконтроллер должен принимать по USART`у символ, отображать его на LCD и отвечать компьютеру “Ok”.
Микроконтроллер ATmega8535 имеет в своем составе модуль универсального синхронно/асинхронного приемопередатчика - USART. С его помощью между компьютером и микроконтроллером можно организовать обмен данными по последовательному каналу. Раньше в компьютерах для этих целей использовались COM порты, однако на современных машинах они уже большая редкость. Если на вашем компьютере все-таки есть такой порт, то для подключения микроконтроллера, понадобится преобразователь уровней ТТЛ – RS232. Его можно собрать на микросхеме MAX232AEPE.
Если COM порта нет, будем подключаться к USB. Для облегчения работы с этим интерфейсом и для поддержки старых устройств, использовавших RS232, производители микросхем выпускают специальные USB-UART преобразователи. Один из вариантов подобного преобразователя представлен на схеме ниже (микросхема FT232BM). При подключении его к компьютеру, система попросит драйвера. Их можно скачать на сайте производителя.
Для работы с USART`ом нам нам понадобятся 4 функции. Три пользовательские, которые мы сможем вызывать:
Функция инициализации
Функция отправки символа
Функция чтения приемного буфераИ одна для обработки прерывания USART`а:
Обработчик прерывания по завершению приема
Функция инициализации
Как и любой другой периферийный модуль, USART перед использованием нужно настроить. Для этого в микроконтроллере ATmega8535 есть 5 регистров – UBRRH, UBRRL, UCSRA, UCSRB, UCSRC.
//инициализация usart`a
void USART_Init( void )
UBRRH = 0;
UBRRL = 51; //скорость обмена 9600 бод
//разр. прерыв при приеме, разр приема, разр передачи.
UCSRB = (1<<RXCIE)|(1<<RXEN)|(1<<TXEN);
//обращаемся к регистру UCSRS, размер слова – 8 бит
UCSRC = (1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);
>UCSRB
Принятый символ USART модуль сохраняет в регистре данных UDR. Оттуда мы его потом переписываем в буфер. Выполняется это в прерывании, а для этого оно должно быть разрешено. Устанавливаем бит – RXCIE – разрешение прерывания по завершению приема в единицу.
Биты TXCIE и UDRIE – разрешают прерывания по завершению передачи и прерывания при очистке регистра данных соответственно. Эти прерывания мы сейчас использовать не будем.
Модуль USART состоит из трех основных частей – блока тактирования, блока передатчика и блока приемника. Для разрешения работы приемника и передатчика нужно установить в единицу биты RXEN и TXEN соответственно.
//разр. прерывания при приеме, разр. приема, разр. передачи
UCSRB = (1<<RXCIE)|(1<<RXEN)|(1<<TXEN);UCSRC
У микроконтроллера ATmega8535 регистр UCSRC размещен по тому же адресу что и регистр UBRRH (это тоже регистр модуля USART, вместе с регистром UBRRL он определяет скорость обмена), поэтому при обращении к ним нужно выполнять ряд дополнительных действий для выбора конкретного регистра. За это отвечает бит URSEL. Если он установлен в 1 обращение производится к UCSRC. Устанавливаем его.
UMSEL – определяет режим работы модуля USART – синхронный, асинхронный. У нас режим работы асинхронный, разряд должен быть сброшен.
UPM1, UPM0 – определяют режимы работы схем контроля и формирования четности. Используются для повышения надежности передачи данных. В нашем случае контроль четности выключен – биты должны быть сброшены.
USBS – количество стоп битов. Для нашего случай бит сброшен.
UCPOL – полярность тактового сигнала. Пропускаем мимо, потому что разряд используется только при работе в синхронном режиме.//обращаемся к регистру UCSRS, размер слова – 8 бит
UCSRC = (1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);UBRR – UBRRH:UBRRL
Скорость обмена данными определяется содержимым регистра UBRR. Это 12 разрядный регистр и он физически размещается в двух регистрах ввода/вывода - UBRRH:UBRRL. Скорость обмена выбирается из ряда стандартных значений, в нашем примере она равна 9600 бод. Значение UBRR для обычного асинхронного режима (есть еще асинхронный режим с удвоенной скоростью обмена) вычисляется по формуле: где Fck – тактовая частота микроконтроллера, BAUD скорость обмена в бодах Для нашего случая UBRR = 8000000/(16*9600) – 1 = 51. Это округленное значение, поэтому реальная скорость обмена будет отличаться от 9600. Рекомендуется использовать такие значение регистра UBRR, при которых получаемая скорость передачи отличается от требуемой на величину < 0.5%. Большая ошибка будет снижать помехозащищенность линии передачи.UBRRH = 0;
UBRRL = 51; //скорость обмена 9600 бодUCSRA
Этот регистр в основном содержит флаги устанавливаемые самим модулем USART. Единственный флаг который нам понадобится в программе – UDRE – флаг опустошения регистра данных. Он устанавливается в 1 при пустом буфере передатчика. Установленный флаг означает, что в регистр данных можно загружать новое значение.
Функция посылающая символ
//отправка символа по usart`у
Передача данных USART`ом инициируется записью данных в буферный регистр передатчика – регистр данных UDR. (Работа передатчика естественно должна быть разрешена). Но перед тем как записать данные, нужно убедиться что передатчик освободился и готов к получению нового слова данных. Для этого в цикле while мы проверяем бит UDRE регистра UCSRA.
void USART_SendChar( unsigned char sym)
while (!(UCSRA & (1<<UDRE)));
UDR = sym;
>
Обработчик прерывания по завершению приема
Когда модуль USART принял данные, вызывается соответствующее прерывание. В прерывании мы переписываем содержимое регистра UDR в буфер usartRxBuf. Старое значение буфера при этом затрется, но так как мы используем медленный посимвольный обмен, потерь данных не будет
Функция чтения приемного буфера
//чтение буфера
unsigned char USART_GetChar( void )
unsigned char tmp = usartRxBuf;
usartRxBuf = 0;
return tmp;
>Копируем значение буфера в локальную переменную, очищаем его. Локальную переменную возвращаем.
Необходимый минимум готов. Оформляем его в виде программного модуля.
Основная программа будет выглядеть так. Надеюсь дополнительных комментариев она не требует.
int main( void )
unsigned char sym;USART_Init();
LCD_Init();
__enable_interrupt ();
LCD_SendString("uart:");while (1) sym = USART_GetChar(); //читаем буфер
if (sym) < //если что-то приняли, то
LCD_Goto(6,0);
LCD_WriteData(sym); //отображаем на lcd принятый символ
USART_SendChar('O'); //отвечаем компу "Ok "
USART_SendChar('k');
USART_SendChar(' ');
>
>
return 0;
>Для проверки результатов работы микроконтроллера потребуется программа - терминал. Вы можете скачать ее в разделе полезный софт. Если лень собирать схему и возиться с реальным железом, можно проверить программу в Proteus`e.
Related items
Comments
Есть ли какие-либо определенные подходы
если поток данных между МК и ПК насыщен
( например идут данные разной структуры ,
при этом идет посылка определенных команд
) .
Или тут все зависит от мастерства программировани я .
На ПК я использую VB6 . Там почти все
делаю через обработчик событий CommEvent .
Может быть на ПК в этом случае есть более
фунциональный язык .
Со стороны МК использую CodeVision . Использовать приемный и передающие fifo буферы. А для "распознавания" принятых данных - state machine(автомат ) на таблицах или switch`е. Больше тут ничего не придумаешь. Доброго времени суток!alexander shahbazov можете объяснить(на форуме) по подробнее про использование обработчика событий CommEvent(компонент MSComm1). Я сам программирую в VB6, с недельку назад разобрался с USART-ом на Mege8535. Буду очень благодарен! :-)Dim chr As String
Собрал на mege48. При приеме символов не отображает практически ничего - черный квадратик. если отправлять с терминала строку с абзацем - показывает абзац.
При отправке на компе принимается группа из 6-7 символов. притом 5 из них одинаковые, а остальные какие-то кракозяблы. Ну никак это не похоже на ОК.
Вчем мой косяк? - Проект в статье написан для mega8535. Для другого микроконтроллер а его нужно перекомпилировать.
- Кракозябы часто возникают, когда скорость обмена мк и компа не совпадают. У меня в схеме тактовая частота мк - 8МГц, скорость обмена - 9600. Угу. Перекомпилирова л естественно под 48й кристалл. Фьюзы стоят на внутренний 8 мгц по-умолчанию. скорость 9600. а кракозяблы остались. Собрал на меге168 работает хорошо.
Только мах232 почемуто на 3,3В не работает.Знаю что 5В надо, но другом проекте другой мах232 работал отлично. Помогите настроить проект под Atmega8515? я новичек и что-то не разберусь IAR выдает
Error[Pe020]: identifier "UCSZ1" is undefined
Error[Pe020]: identifier "UCSZ0" is undefined
Error[Pe020]: identifier "UDRE" is undefined Помогите настроить проект под Atmega8515? я новичек и что-то не разберусь IAR выдает
Error[Pe020]: identifier "UCSZ1" is undefined
Error[Pe020]: identifier "UCSZ0" is undefined
Error[Pe020]: identifier "UDRE" is undefined
Разрешаем использование имен битов определенных в хидер файле
В General Options > System ставим галочку Enable bit definitions in I/O-Include files. интерестно, в нете в некоторых схемах одни соединяют ноги разьема rs232 некоторые нет, в чем разница и что лучше? Полная версия стандарта RS-232 включает 9 сигналов. В большинстве случаев пользуются сокращенным вариантом - 3 провода (RXD, TXD, GND). Просто так удобнее. Изучаю работу UART по Вашему примеру :) Но возникла проблема при приеме символов. На передачу все работает замечательно, а прием отсутствует :( В прерывание заходит "через раз" и регистр UDR имеет нулевое значение. Выставляется ошибка кадрирования. Все собрано "в железе" контроллер AtMega162 (программа естественно исправлены на него). Это вероятней всего аппаратная проблема? Может быть проблема в несогласованнос ти скоростей обмена данными терминала и мк. Ну то есть в терминале выставлена одна скорость, а микроконтроллер посылает/приним ает данные с другой. От чего тактируется мк и какая у него частота? Привет всем, не уверен, что правильно понял схему:
1. prog connector - это программатор?
2. txd и rxd - это uart/usart переходник?
Спасибо за ответы) Привіт!
Заюзав ваш приклад використання USART
та знайшов помилку. незнаю як в старих версіях WinAvr але в нових версіях оголошувати переривання потрібно
ISR(USART_TXC_v ect)а не ISR(USART_TX_vect)
ISR(USART_RXC_vect)а не ISR(USART_TX_ve ct). до цього в мене просто 'завісав' МК Atmega8. Может быть. Я пользуюсь WinAVR 20090313 и объявляю прерывания согласно avr-libc. Написал программу. МК(mega8) передает символы на ПК через usb-uart переходник(bm80 51) только если подключен программатор (avr910).Без него не пересылает. Кто-нибудь сталкивался с подобным? У тебя вывод Reset на микроконтроллер е случайно не болтается в воздухе? Подал на него "+5"- все равно, - без программатора, подключенного к ПК символы по Usart'у не передаются. Pashgan, понял я в чем дело. Чуть голову не сломал от раздумий :-) . UART я подключал как показано на схеме: RXD и TXD, без земли (она не указана).Подсое динил землю - все заработало :-) . А что означает если по USART всегда передается 00000000, и ничего не принимается не при каких условиях? так постоянно нули передавать ещё проще - грузи их по прерыванию UDR и всё
а на практике такая потребность часто возникает? перекомпилирова л под атмега8 , передаешь на комп символ"Q" приходит "T". подключил Вашу программу, символ отсылаю, в ответ приходит - это первое.
Второе, пишу if (sym == 'q')if (sym == 'w') Вообще не работает, тыкаю на любую кнопку загарается LED и не гаснет А FT232BM подключать напрямую к контроллеру или тоже через MAX232 ? А FT232BM подключать напрямую к контроллеру или тоже через MAX232 ? Подключать на прямую без МАХ232 но лучше FT232BM заменить на FT232RL. У RL обвязки никакой не надо там всего 2 конденсатора по питанию достаточно (а цена одинаковая).
К стати не соединяйте Экран USB разъемов с землей, FT232 к этому очень чувствительна и может начать сбоить(типа устройство не опознано) На ноутбуке этого не будет на на стационарном компе может получится.
Всем привет. Я еще пока очень зелен в МК. Как в AVR Studio 5 быть с этой программой? К примеру прерывание если правильно понимаю __enable_interr upt(); он не понимает. Читал на форумах что в разных компиляторах все команды на одном и том же языке вводятся по разному. Как узнать все эти разности? Может есть где описание типа к примеру для AVR Studio 5 эта команда так будет выглядеть, а для WINAVR вот так. Может кто встречал в интернете подобное. За ранее всем благодарен. Здравствуйте!
Я очень долго с этим мучился.
К стати спасибо за доходчивое объяснения)))
Пишу диплом, и практически сразу стллкнулся с проблемой. Пишу в iar а отлаживаю в протеусе и авр-студии. Необходимо отправлять 3-и 2-ух байтных числа, как только отправляю байт (например все единицы), приходят одни нули. При проверке в студии обнаружил, что когда помещаю число в UDR, на следующем цикле UDR обнуляется. Прочитал что на самом деле для передачи используется другой регистр, а UDR на подобии буфера. Тогда попробовал присваивать UDR одно число и в следующей строчке другое, но UDR всё равно обнуляется, а не ждёт пока регистр отправки отправит предыдущий.
Думаю вопрос глупый, и что я банально что-то упустил из виду=) ISR(USART_RXC_vect)
у меня так работает - avr-libc 1:1.7.1-2присоединяюсь к вопросу- как проверить полученный символ? вот так-
if (data=='A')
stat=1;
>
if (data=='B')
stat=0;
>
while (stat)Так же как и в примере
Code:
sym = USART_GetChar(); //читаем буфер
if (sym) < //если что-то приняли, то
LCD_Goto(6,0);
LCD_WriteData(sym); //отображаем на lcd принятый символ
USART_SendChar('O'); //отвечаем компу "Ok "
USART_SendChar('k');
USART_SendChar(' ');
>Если не получается, то может быть скорость неправильно настроена.
Code:
sym = USART_GetChar(); //читаем буфер
if (sym)< //если что-то приняли, тоЕсли не получается, то может быть скорость неправильно настроена.
в том то и дело, что мне надо проверить не факт приема чего-то, а на конкретный символ. Подскажите как настроить UART 8515-ый - UBRRH, UBRRL, UCSRA, UCSRB, UCSRC. Спасибо Code:
UCSRB = (1 << RXEN) | (1 << TXEN) | (1 << RXCIE);
UCSRC = (1 << URSEL) | (3 << UCSZ0);
возможно верно?Делаю вроде по аналогии, но без дисплея. На переходнике USB-UART светодиод моргает - символ отправлен. но Ок нет =( Земля и от LPT программатора и от переходника подключены, питание есть, но молчок
кристалл mega8515, скорость 9600, частота 8000000
Code:
UBRRH=0;
UBRRL=51; //скорость обмена 9600 бод
UCSRB=(1<<RXCIE)|(1<<RXEN)|(1<<TXEN); //разр. прерыв при приеме, разр приема, разр передачи.
UCSRC=(1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0); //размер слова 8 разрядов
>поменял на:
1843200 hz, 115200 бод, плучилось 0светодиоды на переходнике горят оба - символ отправлен и что-то принято, но в одном терминале (keterm) отобраюжаются буквы, в другом SimpleTerm - вопросы, в третьем Advanced Serial Port Monitor - те же буквы. В терминалах выбирал 115200 бод.
Code: UBRRH=0;
UBRRL=0; //скорость обмена 115200 бод
UCSRB=(1<<RXCIE)|(1<<RXEN)|(1<<TXEN); //разр. прерыв при приеме, разр приема, разр передачи.
UCSRC=(1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0); //размер слова 8 разрядов
Я взял проект, поменял тип микроконтроллер а на mega8515 и запустил компиляцию. В Протеусе полученная прошивка сразу же заработала (тактовая 8 МГц, скорость обмена 9600). В железе нет возможности проверить. Через что подать символ по UART в Протеусе? В протеусе добавил компонент com, подключил к 8515. и непонятные символы пошли в ответ Здравствуйте!По дскажите,пожалу йста как организовать мультипроцессор ный обмен между мастером и двумя слейвами.Принци п понимаю,смотрел пример из datasheet на mega8.В Proteus удалось добится только одноразового аппаратного сброса MPCM при прохождении "1" в 9-ом разряде.Дальше- затык.В железе не пробовал пока. Разобрался.В Proteus заработало.Проб лема была в ручной установк MPCM.Спасибо!
Просто всё - разрешаете прерывание по приёму байта, в прерывании пишите данные в кольцевой буфер, а в основной программе обрабатываете принятые данные. Гдето я наверно накосячил, так же и пытался сделать
если у кого есть такой кусочек кода для приема, буду благодарен) Гдето я наверно накосячил, так же и пытался сделать
если у кого есть такой кусочек кода для приема, буду благодарен)void UsartReceive()
Спасибо, буду ковырять косяк, вроде похоже делал, но принимает только первый байт, второй почему-то ноль
uint8_t rx_first=RxFirst, rx_next=RxNext;
while (rx_first!=rx_next) uint8_t new_byte=RxBuffer[rx_first];
// обработка данных
//
if (++rx_first>=RX_BUFFER_SIZE)
rx_first=0;
>
RxFirst=rx_first;
>
С примером проще разбираться)) здравствуйте, разглядывал много схем с уарт преобразователя ми, и что увидел, на некоторых есть резисторы на линиях rx и tx, на некоторых нету, а на некоторых есть резистор только на одной линии, так вот собственно нужны ли всё таки там резисторы? и зачем?
предпологаю для защиты, например по уарту "плюётся" еденичка, а на втором конце по случайности "мёртвая" земля и какая сторона в состоянии покоя подтягивает линию к 5-ти вольтам?
мне кажется tx подтягивает к 5-ти вольтам, а rx всегда может только слушать линию(то есть всегда в высокоимпедансн ом состоянии)?//прием символа по usart`у в буфер
interrupt [USART_RXC] void usart_rxc_my(void)
usartRxBuf = UDR;
fl=1;
>Читайте также: