USART. Сопряжение МК с компьютером через COM-порт. Теория. Настало время научиться работать с СОМ-портом. Несмотря на то, что на этом сайте есть статьи про него, в них не рассказывается, как он работает (на уровне схемотехники). Я считаю, что это может быть не интересно для прикладного программиста, но для человека, программирующего МК (т. е. электронщика) знание этой информации лишним не будет. Но в то же время вдаваться в излишние подробности мы не будем. Поэтому данная статья будет, так сказать, охватывать теоретическую часть вопроса. А вот практика будет в следующей статье. Но не спешите переходить сразу же туда, иначе вряд ли это хорошо закончится. Здесь нужно все читать по-порядку.
Небольшое лирическое отступление. Блуждая по просторам Интернета, наткнулся на несколько интересных страниц и сайтов, так или иначе связанных с программированием AVR. Теперь Вы уже многое умеете (если читали предыдущие статьи), и я хотел бы поделиться ссылками на эти ресурсы, думаю, найдете там много полезной информации.
* Datasheet на ATMEGA128 на русском языке.
Большинство Datasheetов на электронные компоненты сделано на английском языке. Для одних это не проблема, а другим создает определенные трудности. Конечно, русский текст читать приятнее. Данный текст является полным качественным переводом английского варианта и подробно рассказывает обо всех возможностях этого МК. Поскольку все МК серии MEGA имеют сходное строение, при возникновении вопросов и проблем ищите решение в первую очередь здесь.
*Сайт о роботах, робототехнике и микроконтроллерах.
Роботы и микроконтроллеры - неразлучные друзья. Практически любой робот содержит в себе электронный "мозг", состоящий из одного или нескольких МК. На сайте можно найти рекомендации по проектированию и изготовлению роботов и программированию МК для них.
* Статья об устройстве и архитектуре AVR
* Сайт "Железный Феликс" о робототехнике
* Сайт о программировании AVR
Итак, слово USART расшифровывается как "универсальный синхронный и асинхронный приемник и передатчик" (УСАПП) ("Universal Synchronous and Asynchronous Receiver and Transmitter"). Так называют устройство, умеющее работать с интерфейсом RS-232 (и его аналогами), на котором и построен СОМ-порт. Помимо этого, существуют еще устройства UART, которые могут работать только в асинхронном режиме. Мы будем использовать только асинхронный, т. к. современные компьютеры имеют 9-контактный СОМ порт без линии автоматических тактовых сигналов.
Напряжениями логического уровня в интерфейсе RS-232C (существуют еще RS-232A и RS-232B, но в компьютере и МК RS-232C) являются +12 В (лог. 0) и -12 В (лог. 1). Состояние 0 В не используется для передачи данных и существует только при отключении питания СОМ-порта. В СОМ порте (на рисунке ниже представлена вилка) 9 проводников.
"Ножка" № Название сигнала Описание
1 _____________DCD________Обнаружение устройства
2 _____________RXD ________Прием данных
3 _____________TXD ________Посылка данных
4 _____________DTR_________Готовность терминала к передаче данных
5 _____________GND________ Земля (общий)
6 _____________DSR ________Data Set Ready. Готовность внешнего устройства к передаче данных
7 _____________RTS ________ Запрос на передачу
8 _____________CTS_________Разрешение передачи данных терминалу
9 _____________RI __________Ring Indicator (специализированная сигнальная линия управления)
Как работать с компьютера с линиями 5 и 7 уже рассказывалось в статьях по СОМ-порту. Нас теперь интересуют линии 2 (RXD) и 3 (TXD). Именно по ним и происходит передача данных. Рассмотрим, как это реализовано. Оба провода передачи данных работают совершенно одинаково. При этом RXD одного устройства соединяется с TXD другого и наоборот, TXD первого устройства цепляется к RXD второго устройства. Только не забудьте соединить 5-й провод (землю)!
Изначально на линии передачи данных установлена лог. 1 (-12 В). Передача данных осуществляется кадрами по 5-8 бит. Чтобы обозначить начало и конец кадра, используют "старт-бит" и "стоп-бит". Приемник и передатчик заранее должны быть настроены на работу с одинаковыми параметрами для гарантированной передачи данных. Когда нужно передать данные, передатчик меняет состояние линии с лог. 1 на лог. 0 (+12 В). Это стартовый бит. После него начинается передача информационных битов. Этот момент (появление стартового бита) фиксируется приемником и в нем начинают "тикать часы". Биты передаются через одинаковые фиксированные моменты времени с определенной скоростью, называемой битрейтом (baudrate). Например, пусть этот интервал составляет 100 мкс. Передатчик держит стартовый бит (всегда лог. 0) в течение 100 мкс, а затем выставляет на линии первый информационный бит. Еще через 100 мкс он устанавливает второй бит и т.д.. Приемник, в свою очередь, обнаружив стартовый бит, ждет 100 мкс, затем ждет половину этого времени, т.е. 50 мкс (чтобы попасть как раз в середину первого бита), после чего начинает запоминать состояние линии каждые 100 мкс.
За информационными битами следуют бит четности и стоповые биты. Стоповые биты всегда имеют уровень -12 В (лог. 1) и служат одновременно паузой между кадрами данных. Если стоповый бит один, то пауза между кадрами меньше и скорость передачи данных выше. Если их два, то пауза будет дольше. Бит четности (P) служит для контроля правильности передачи данных. Если выставлен параметр четность как Odd (Нечетный), то бит четности будет таким, чтобы сумма всех отправленных информационных битов вместе с ним была обязательно нечетной. Если приемник, приняв кадр, установил, что сумма нечетная, то все верно, если она оказалась четной, значит, была ошибка в одном бите (или в 3-х, 5-ти, 7-ми, 9-ти). Этот способ достаточно примитивен и не обнаружит ошибки в 2-х, 4-х, 6-ти или 8-ми битах. Но наиболее вероятной является ошибка именно в 1 бит, а не в 2 и больше. Если четность установлена как Even (Четная), то сумма всех отправленных битов будет всегда четной.
Как видим, часы, по которым происходит передача и прием данных, синхронизируются по стартовому биту. Если они идут синхронно, то все отлично, если же нет, то момент считывания будет смещаться от середины бита в ту или иную сторону, но, поскольку битов немного (5-9, до 10 с битом четности), небольшая ошибка погоду не испортит и момент считывания не успеет сместиться в соседний бит. К тому же, МК содержит модуль коррекции принятых данных. В качестве часов в МК, используется, естественно, кварцевый резонатор. Вот здесь и нужно будет вспомнить о том, что я говорил в первой статье.
Существуют стандартные битрейты для передачи данных через интерфейс RS-232C.
* 2400 bps (bps - бит в секунду)
* 4800 bps
* 9600 bps
* 14400 bps
* 19200 bps
* 28800 bps
* 38400 bps
* 57600 bps
* 76800 bps
* 115.2 kbps
* 230.4 kbps
Заметили связь между скоростями? Так вот, чаще всего используют 9600 бит/с. Для того, чтобы получить эти значения скоростей с высокой точностью, следует использовать резонаторы на те частоты, о которых говорилось в первой статье, например, 11,0592 МГц. Чем выше частота резонатора, тем выше и максимальная скорость. Для нашего МК с резонатором на 16 МГц возможна скорость до 2 Мбит/с. Но не надо забывать, что это скорость между битами в кадре, а в кадрах есть еще стоп-биты и биты четности. Поэтому реально скорость будет на 10-35% ниже. При использовании других резонаторов (4 МГц, 8 МГц и т. п.) будет возникать погрешность для первых 11 скоростей, скорости в 250 кбит/с и кратные будут без погрешностей. Чем больше погрешность, тем ниже устойчивость к помехам и выше вероятность ошибок. Наш МК может также передавать данные с двойной скоростью, что задается спецальным регистром. Ниже приведена схема модуля USART в МК AtMega16.
За работу USARTа отвечают несколько специальных регистров (они обозначены жирным шрифтом на рисунке выше). Во первых, следует выделить регистр UDR (USART Data Register). Он используется для хранения принятых/отправляемых данных. Сделан он особым образом, т.к. на самом деле регистров UDR 3 штуки. При записи значения в UDR происходит запись в тот, который изображен на рисунке верхним (UDR (transmit) или TXB). Это значение незамедлительно отправляется другому устройству через COM-порт и регистр очищается. Когда в МК приходит байт информации, он сохраняется в другом UDR-регистре (UDR (receive) или RXB), причем в верхнем RXB-регистре. Как только байт полностью принят, он автоматически копируется в нижний RXB-регистр, откуда его можно уже прочитать, а в верхний при этом принимается следующий байт (чтобы избежать пауз в работе и потери данных). Итак, при чтении данных из UDR берется принятый байт, а при записи в него данные сразу же отправляются через интерфейс приемнику. Если после приема двух байтов в оба RXB-регистра не произошло считывания из нижнего, то третий байт не будет принят USARTом и USART выставит флаг ошибки Data OverRun (DOR).
Существуют регистры управления и статуса USARTом: UCSRA, UCSRB и UCSRC. Рассмотрим в них подробно те биты, которые чаще всего используются.
UCSRA.
* Бит 7 - RXC (Receive Comlete). Бит завершения приема. Автоматически устанавливается, если принимаются данные. При чтении принятых данных сбрасывается.
* *Бит 6 - TXC (Transmit Comlete). Бит завершения передачи. Автоматически устанавливается после отправки кадра данных при отсутствии следующих данных для отправки.
* Бит 5 - UDRE (UDR Empty). Бит отсутствия данных для отправки. Если установлен, нет данных для отправки.
* Бит 4 - FE (Frame Error). Бит ошибки кадра. Равен единице, если была ошибка в формате принятого кадра.
* Бит 3 - DOR (Data OverRun). Бит ошибки переполнения буфера. Равен единице, если нет места для приема нового кадра данных.
* Бит 2 - PE (Parity Error). Бит ошибки четности. Равен единице, если была ошибка четности.
* *Бит 1 - U2X (Double speed). Бит двойной скорости USARTа. Если установлен, скорость работы и битрейт удваиваются.
* *Бит 0 - MPCM (Multi-Processor Communication Mode). Бит работы в многопроцессорном режиме. Если равен единице, включен многопроцессорный режим.
* Звездочку я поставил около тех битов, которые доступны для записи. Остальные биты доступны только для чтения. Некоторая информация, думаю, требует пояснения. Биты 7, 6, 5 могут использоваться для генерации прерываний. Обычно делают прерывание по приему данных. Многопроцессорный режим используется, когда к одному СОМ-порту цепляются сразу несколько МК. Например, Вы подключаете к компьютеру (или другому МК) устройство, в котором есть несколько МК, подключенных к одному интерфейсу RS-232C. Тогда обычно используют 9 битов данных, при этом первый бит сигнализирует о передаче адреса (если установлен) либо данных. МК, принимая остальные биты, если они являются адресом, сравнивает их со своим адресом. В случае совпадения он принимает кадры данных и отвечает на них, а все остальные МК "помалкывают". Если адрес не совпадает, МК реагирут только на первый бит, что уменьшает нагрузку на процессор.
UCSRB.
* Бит 7 - RXCIE (Receive Comlete Interrupt Enable). Бит генерации прерывания при приеме данных. Если установлен, происходит прерывание для немедленной обработки принятых данных.
* Бит 6 - TXCIE (Transmit Comlete Interrupt Enable). Бит генерации прерывания при завершении передачи. Если установлен, происходит прерывание после отправки данных.
* Бит 5 - UDRIE (UDR Empty Interrupt Enable). Бит генерации прерывания при отсутствии данных для передачи.
* Бит 4 - RXEN (Receiver Enable). Бит наличия приемника данных. Если установлен, МК будет принимать данные через RS-232C.
* Бит 3 - TXEN (Transmitter Enable). Бит наличия передатчика данных. Если установлен, МК будет передавать данные через RS-232C.
* Бит 2 - UCSZ2 (USART Character SiZe 2). Определяет количество бит в кадре. Работает вместе с битами UCSZ1 и UCSZ0 в UCSRC.
* #Бит 1 - RXB8 (Receive Data Bit 8). Девятый бит принятых данных (восьмой при нумерации с 0), использующийся в многопроцессорном режиме.
* Бит 0 - TXB8 (Transmit Data Bit 8). Девятый бит отправляемых данных, использующийся в многопроцессорном режиме.
# Решеткой отмечен бит, доступный только для чтения. Все остальные доступны для чтения/записи.
Наконец, самый "страшный" регистр.
UCSRC.
* Бит 7 - URSEL (USART Register SELect). Бит выбора регистра. 1 - UCSRC, 0 - UBRRH.
* Бит 6 - UMSEL (USART Mode SELect). Бит выбора режима работы. 1 - синхронный, 0 - асинхронный.
* Бит 5 - UPM1 (USART Parity Mode 0). Установка режима четности/нечетности. Оба сброшены - нет контроля.
* Бит 4 - UPM0 (USART Parity Mode 0). Оба установлены - нечетная сумма. UPM0 = 0 и UPM1 = 1 - четная сумма.
* Бит 3 - USBS (USART Stop Bit Select). Количество стоп-битов. Если сброшен, то 1 стоп-бит, иначе - 2.
* Бит 2 - UCSZ1 (USART Character Size 1). Размер кадра данных (вместе с UCSZ2 из UCSRB).
* #Бит 1 - UCSZ1 (USART Character Size 1). Таблицу возможных значений см. ниже
* Бит 0 - UCPOL (USART Clock POLarity). Используется в синхронном режиме. Если равен нулю, то тактирование отправляемых данных по переднему фронту импульса, принимаемых - по заднему. Если установлен, то наоборот.
Чем же так страшен этот регистр управления USARTом? Он имеет тот же адрес, что и верхний регистр битрейта (0x80). Это означает, что процессор не видит разницы между этими регистрами. Для того, чтобы их можно было отличать, сделан седьмой бит URSEL. Если он равен единице, процессор работает с UCSRC, иначе с UBRRH. Это, возможно, справедливо не для всех МК серии MEGA, так что читайте Datasheet. Ниже обещанная таблица установки размера кадра данных.
Остались два регистра. Это регистры установки битрейта - UBRRH и UBRRL. В регистре UBRRH доступны биты 0-3 (если в UCSRC URSEL = 0). Регистр UBRRL доступен весь для сохранения восьми младших битов числа. В этих двух регистрах может быть сохранено 12-битное число (От 0 до 4095). Это число вычисляется по следующей формуле:
UBRR = fosc / (X * BAUD) - 1
Здесь X равно 16 при режиме с нормальной скоростью (бит U2X = 0) и 8 в режиме удвоенной скорости (бит U2X = 1), BAUD - нужный битрейт, fosc - частота кварцевого резнонатора. По этой формуле легко вычислить значение регистра самостоятельно, но существуют также специальные таблицы наиболее типичных битрейтов и соответствующих значений UBRR. Такую таблицу из-за её громоздкости приводить не буду. Ее можно найти в Datasheetе к МК. Для AtMega16 таблица находится на стр. 169 его Datasheetа.
В заключение хотелось бы отметить, что COM-порт гарантированно будет работать на больших скоростях (0,5 - 2 Мбит/с) при длине кабеля до 8 метров. При небольших скоростях длину кабеля можно увеличить до 15 метров. При большей длине, возможно, будут ошибки. Хотя... хотя можно в случае надобности придумывать различные ухищрения и особые алгоритмы, позволяющие увеличить длину кабеля, возможно, в ущерб скорости. Тем не менее, помимо RS-232 есть еще и другие подобные интерфейсы, среди которых есть и низковольтные помехоустойчивые с дифференциальными линиями, где можно использовать провода длиной до километра.
На этом теоретический материал закончен. Практическая реализация - в следующей статье.
Киселев Роман (romchik1989@mail.ru)
30 июня 2007 года
www.pcports.ru
При возникновении проблем обращайтесь к автору статьи Romchik1989@mail.ru