Главная страница
Библиотека (скачать книги)
Скачать софт
Введение в программирование
Стандарты для C++
Уроки по C#
Уроки по Python
HTML
Веб-дизайн
Ассемблер в среде Windows
ActiveX
Javascript
Общее о Линукс
Линукс - подробно
Линукс - новое
Delphi
Паскаль для начинающих
Турбопаскаль
Новости
Партнеры
Наши предложения
Архив новостей





В промежутке между посылками линия TxD (если UART инициализирован) находится в состоянии логической единицы, а на линии RxD должна присутствовать логическая единица, установленная внешним передатчиком. Поэтому, если UART включен, не рекомендуется эти линии использовать еще для каких-то функций, иначе приемопередатчики могут вас "неправильно понять". За исключением ситуации, когда по этому интерфейсу обмениваются данными контроллеры между собой, обычно предполагается, что линии RxD и TxD подсоединены к преобразователю, конвертирующему логические уровни UART в сигналы соответствующего интерфейса (например, RS-232 или RS-485). Этим определяется основное назначение UART, в отличие от SPI или 12С — связь удаленных устройств между собой. О том, как конкретно осуществлять такое преобразование и чем различаются интерфейсы, мы поговорим далее в этой главе, а подробности того, как организовать обмен данными с персональным компьютером и отлаживать программы прямо в конкретной схеме с его помощью, описаны в приложении 4. Сейчас же мы остановимся на том, как организовать прием и передачу данных с помощью собственно UART.

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

Листинг 13.1
/для "чистого" UART (семейство Classic) при частоте 4 МГц ldi temp,25 /скорость передачи 9600 при 4 МГц out UBRR,temp /устанавливаем ldi temp, (1«RXEN 11«TXEN 11«RXB8 11«TXB8) out UCR,temp /разрешение приема/передачи 8 бит Число BAUD для делителя частоты (в данном случае 25) определяется из таблиц, которые имеются в описании соответствующего контроллера (там же приводится и ошибка для выбранного значения частоты), или рассчитывается по формуле: BAUD "=ypC3/16(UBRR + I). Для семейства Mega, в котором имеется, как правило, расширенный модуль USART, процедура несколько усложняется, потому что регистров для задания режима больше (листинг 13.2).

ЮЗак. Ш
;для USART (семейство Меда) при частоте 16 МГц ldi temp,103 ;9600 при 16 МГц out UBRRL, temp
ldi temp, (1«RXEN) | (1«TXEN) ; разрешение приема-передачи out UCSRB,temp
ldi temp, (1«URSEL) | (3«UCSZ0) ;UCSZ0=1, UCSZ1=1, формат 8nl out UCSRC,temp

Чем выше тактовая частота МКУрез, тем точнее может быть установлена скорость. При частоте кварца 4 МГц мы с приемлемой точностью можем получить скорости обмена не более 28 800 бод. Правда, при выборе специального кварца (например, 3,6864 МГц) можно получить с нулевой ошибкой весь набор скоростей вплоть до 115 200, но для других целей такие частоты неудобны. Для получения скоростей передачи выше указанных придется увеличивать частоту "кварца". Так, при "кварце" 8 МГц и значении UBRR, равном единице, мы получим скорость 250 000 бод (что достаточно близко к стандартной для СОМ-порта скорости 256 000).

В USART (только в асинхронном режиме!) имеется возможность удвоения скорости обмена, для чего следует установить в единицу бит U2X в регистре UCSRA. При этом скорость будет определяться формулой BAUD =/pe3/8(UBRR + 1). Кроме того, как мы можем заключить из листинга 13.2, регистр UBRR в USART состоит из двух половинок: UBRRL И UBRRH. Причем в старшей части UBRRH работают только первые четыре разряда, итого значение UBRR в расширенном модуле USART может быть 12-разрядным (т. е. от 0 до 4095).
На практике в большинстве случаев достаточно устанавливать значение лишь младшего регистра (UBRRL): например, при тактовой частоте 4 МГц его максимально возможное значение 255 даст нестандартную скорость обмена 976 бод (ближайшая стандартная 1200 обеспечивается значением UBRR, равным 208), что для интерфейса RS-232 позволяет обеспечить бессбойную связь на расстоянии в несколько сотен метров (см. табл. 13.2 далее в этой главе). Но следует учесть, что старший регистр UBRRH И регистр управления UCSRC (в котором задается формат обмена) имеют один и тот же адрес, и по умолчанию запись будет производиться в UBRRH. Чтобы задать режим обмена, т. е. записать именно в UCSRC, нужно одновременно с соответствующими битами обязательно установить бит выбора регистра URSEL (см. листинг 13.2).

Передача и прием данных
В общем случае наша задача формулируется так: модуль UART все время ожидает посланного извне байта, и при получении его должен послать в ответ некоторое число байтов. Такой процесс можно организовать по-разному. Технические описания МК приводят простейший способ, заключающийся в бесконечном цикле ожидания приема. Когда принятый байт окажется в регистре данных, автоматически устанавливается бит RXC регистра статуса. Этот регистр в "чистом" UART называется USR, а в USART— UCSRA. Данные при этом, как мы уже говорили, будут находиться в регистре UDR (ЛИСТИНГ 13.3).

Листинг 13.3
In_com: /прием байта в temp с ожиданием готовности
sbis UCSRA,RXC /для Classic UCSRA заменить на USR rjmp in_com
in temp,UDR /собственно прием байта
ret /возврат из процедуры In_com



     
 

Библиотека программиста. 2009.
Администратор: admin@programmer-lib.ru