Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
УП МПУ-13.doc
Скачиваний:
10
Добавлен:
01.04.2025
Размер:
6 Мб
Скачать
☆

7.6. Устройство контроллера u(s)art и его применение

Асинхронные протоколы (UART – Universal Asynchronous serial Receiver and Transmitter) не передают тактирующий сигнал, синхронизация передатчика и приемника выполняется за счет выбора одинаковой частоты тактирования и передачи в потоке данных дополнительных синхроимпульсов. Наличие двух линий передачи данных: RX(D) – вход приемника [receiver], TX(D) – выход передатчика [transmitter], позволяет при использовании контроллера UART вести передачу и прием одновременно, это называется дуплексным режимом обмена.

Рис. 7.15

Формат посылки протокола и контроллера UART допускает вариации, основные элементы: нулевой старт-бит для синхронизации генератора тактов приемника, от 5 до 9 битов данных (младший первый), необязательный бит паритета (четности или нечетности), 1–2 стоп-бита «единичного» уровня для контроля синхронизации. На рис. 1.9 приведен наиболее распространенный вариант формата 8N1 с 8 битами данных, без бита паритета (N) и одним стоп-битом. Необходимым условием является выбор одинаковой частоты работы тактовых генераторов передатчика и приемника из стандартного фиксированного ряда (9 600, 19 200, 57 600, 115 200 бод и т. д.), отклонение частоты приемника и передатчика не должно превышать 1–2 %.

Контроллер USART в AVR-8

Пример выбора частоты интерфейса, частоты МК и значений для кодирования:

Регистры состояния и управления:

USART I/O Data Register – UDR – регистр данных 8 бит, разделен по записи и чтению.

USART Control and Status Register A – UCSRA

USART Control and Status Register B – UCSRB

USART Control and Status Register C – UCSRC

USART Baud Rate Registers – UBRRL and UBRRH

В техническом описании МК приводятся примеры функций настройки, передачи и приема байта через UART, используются в примерах:

#define fclk 8000000L /* Частота тактирования процессора */

#define BAUD 9600 /* Скорость связи в бодах */

#define UBRR_VAL fclk/16/BAUD – 1 /* Вычисление кода задания скорости */

void init_USART( unsigned int ubrr) {//Настройка с заданием скорости

UBRRH = (unsigned char)(ubrr>>8); //Загрузка кода скорости

UBRRL = (unsigned char)ubrr; // побайтно

UCSRB = (1<<RXEN)|(1<<TXEN);/* Enable receiver and transmitter */

UCSRC = (1<<URSEL)|(1<<USBS)|(3<<UCSZ0);/* Set format: 8 data, 2stop bit */

} // ****************************

void transmit(char byte) { //Передача байта

while(!(UCSRA & (1<<UDRE)));//Ожидание готовности буфера передатчика

UDR = byte; //данные в буфер передатчика

} // *****************************

unsigned char receive(void) { //Прием байта

while (!(UCSRA & (1<<RXC)));//Ожидание завершения приема

return UDR; //чтение приемника

} // *****************************

Примеры использования UART в Proteus VSM

Примеры работы UART в системе моделирования Proteus VSM используют инструмент Virtual Terminal. Он позволяет в интерактивном режиме использовать экран и клавиатуру ПК для посылки и приема байт по асинхронному последовательному интерфейсу RS-232 из моделируемого МК.

Для выбора этого инструмента выберите в левом столбце пиктограмму Virtual Instrument Mode, окно буфера выбора теперь содержит список доступных инструментов (рис. а), выберите и разместите в окне схемного редактора Virtual Terminal (рис. , б). Как и в МК вывод RXD является входом данных, его надо соединить с выходом TXD МК, вывод TXD – выходом данных, соединяется со входом RXD МК. Выводы RTS [ready-to-send] CTS [clear-to-send] требуются для аппаратного квитирования [hardware handshake], в наших примерах соединены между собой. Основные настройки [properties] состоят из параметров частоты связи Baud Кate, длины посылки Data Bits, выбора проверки четности Parity, длины стопа Stop Bits, разрешения программного квитирования Send Xon/Xoff. Дополнительные настройки [advanced properties] позволяют выбрать полярность сигналов и задать настройки отладочных сообщений при трассировке.

После запуска сеанса интерактивного моделирования появляется всплывающее окно Virtual Terminal (см. рис. г, д), в это окно выводятся полученные по входу RXD данные в виде Hex-кодов или ASCII-символов, при вводе данных надо предварительно кликнуть в окне, затем нажимать клавиши клавиатуры. В окне действует контекстное всплывающее меню (рис в), оно позволяет выполнять стандартные функции с содержимым окна (очистка, пауза, копирование и вставка) и настраивать отображение (печать ввода с клавиатуры, Hex или ASCII, выбор шрифта).

www.spb98.com

а б в

Рис. 7.16

Пример 7.3.1 Терминал в режиме ASCII, общая схема примера на рис. 7, а состоит из МК и Virtual Terminal, потенциометра RV1 и генератора синусоидальных колебаний Sin на входах встроенного АЦП, фильтров нижних частот R1C1 и R2C2 на выходах сравнения (резисторы R3, R4 имитируют входное сопротивление следующих каскадов). Рассмотрим несколько примеров программ, по принципу «от простого к сложному».

Настройки Virtual Terminal:

- настройки в режиме редактора схемы (Edit Properties): “Baud Rate” = 9600, “Data Bits” = 8, “Parity” = NONE, ”Stop Bits” = 1 должны соответствовать программным настройкам UART’а, Xon/Xoff в этой задаче не влияет, Advanced Properties – без изменения,

- настройки в режиме интерактивного моделирования (правой кнопкой мыши в окне Virtual Terminal): “Hex Display Modes”, “Echo Typed Characters” – без галочки.

А) «Нулевой цикл» - в схеме используются только МК и Virtual Terminal, программа <VTo_m16> (рис. , б) выполняет периодический вывод на экран цифр (счет секунд), это пример для знакомства с терминалом в режимах Hex и ASCII.

Тестирование: временная диаграмма: период тактирования расчетный по BAUD = 9600 Т = 104 мкс, измеренный 935 / 9 = 103.89 мкс,

а

…

#define BAUD 9600

#define UBRR_VAL fclk/16/BAUD - 1

…

int main() {

static unsigned char i=0;

//DDRB = 0xff; DDRC = 0xff; DDRD = 0xff;

init_USART(UBRR_VAL);

while (1) {

transmit(i++);//Вывод на терминал

_delay_ms(100);//Комментировать в режиме временной диаграммы

}

} // ******************************

б

в

г

д

Рис. 7.17

Б) Клавиатура с индикатором без буферизации (схема та же), проект и программа <VTio_m16>, основной цикл (рис.) состоит из чтения байта с приемника и посылки его же на передатчик; при запуске в интерактивном режиме (не забудьте в свойствах МК <test_UART.dsn> заменить файл Programm file на <VTio_m16.elf>) коды нажатых клавиш отображаются в окне вывода Virtual Terminal, в режиме отображения ASCII мы увидим изображения нажатых клавиш, в режиме Hex – их шестнадцатеричные коды.

while (1) {

i = receive();

transmit(i);//Вывод на терминал

}

В) Иллюстрация простого протокола, работающего по принципу «Запрос» - «Ответ» использует все элементы схемы <test_UART.dsn>. Проект и программа в папке <VT_protocol_m16>, входы АЦП ADC0, 1 настроены на опору AVCC с программным запуском и чтением результата, выходы сравнения OC1A, B настроены на генерацию импульсов быстрой 8-разрядной ШИМ (f = 8 МГц / 256 = 31.25 кГц = 1 / (32мкс)), в основном цикле выполняется обработка протокола, Virtual Terminal в режиме отображения ASCII.

Запрос состоит минимум из двух байт B0, B1 и завершается клавишей <Enter>, если получены символы ‘R’ и ‘0’ или ‘1’, то печатается значение со входа АЦП “Un=XXXX ” (n – 0 или 1, XXXX – десятичное число из четырех цифр), если получены символы‘T’ и ‘0’ или ‘1’, то значение АЦП копируется на ЦАП (цифра задает номер канала), если ‘O’ – ввод числа и вывод его на ЦАП (пока не надо).

transmit('>');//Приглашение кo вводу

while (1) {

buf[i] = receive();//прием в очередь

transmit(buf[i]); //печать приема

if(i<2) i++; //сдвиг указателя очереди

else { //очередь заполнена, пора анализировать содержимое

if(buf[2]==ENTER) { // Если конец запроса

//и если первый байт 'R', а второй '0' или '1',

if(buf[0]=='R' && (buf[1]=='0' || buf[1]=='1')) {

transmit('U'); transmit(buf[1]); transmit('=');

if(buf[1]=='0') val = read_adc(0);

else val = read_adc(1);

u16to4dec(val);

transmit(b[3]+'0'); transmit(b[2]+'0'); transmit(b[1]+'0'); transmit(b[0]+'0');

}// то читать АЦП и вывести результат в окно VirtTerm

if(buf[0]=='T' && (buf[1]=='0' || buf[1]=='1')) {

//Если первый байт 'T', а второй '0' или '1',

transmit('T');

if(buf[1]=='0') {

val = read_adc(0);

OCR1A = val>>2;

} else {

val = read_adc(1);

OCR1B= val>>2;

}

}// то читать АЦП и вывести результат на ЦАП

i=0; transmit('>'); //, обнулить указатель очереди и вывести приглашение

}//Конец обработчика очереди

buf[0] = buf[1]; buf[1] = buf[2]; //сдвиг очереди

}

} // End of main cycle

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

1. UART + RS232 = COM-port в персональных компьютерах (ПК), связь ПК с модемом. Чаще всего это связь только двух устройств на небольшие расстояния с невысокими скоростями (15 м при 19 200 бод или 3 м при 115 200 бод) по синфазной (несимметричной) линии связи, аппаратно поддерживается режим дуплекса, но в приложениях чаще используется полудуплекс. Стандарт RS232 (первоначальное название, сейчас описывается целым семейством стандартов) предусматривает передачу «лог. 1» сигналом напряжения –15…–3 В, «лог. 0»: +3…+15 В, гальваническая развязка не предусмотрена.

Рис. 7.18

На рис. 1.10, а показана схема подключения формирователей уровня приемника и передатчика и объединения с другим устройством, усилители требуют двуполярного питания.

На рис. 1.11 приведена схема подключения к МК (D1) микросхемы усилителя-формирователя ADM202 (D4), имеющей в своем составе два усилителя передатчика, два усилителя приемника, преобразователь напряжения питания из 5 В в двуполярное на переключаемых конденсаторах, защиту входов от статического электричества. Для организации гальванической развязки RXD, TXD используются оптопары 6N137 (D3, D4) [www.firchildsemi.com], для развязки питания – микросхема импульсного преобразователя постоянного напряжения в постоянное V1-0505SS (D2) [www.motien.com]. Нагрузочная способность выхода R1out ИМС ADM202 не достаточна для непосредственного управления светодиодом оптопары, поэтому используется ключевой усилитель на транзисторе VT1.

2. UART + RS422/485 = шина локального управления, на базе которой построены протоколы в промышленных распределенных системах управления нижнего и среднего уровней. Стандарты RS422/485 используют дифференциальную, т. е. симметричную линию связи (экранированная витая пара) длиной до 1200 м при скоростях передачи до 500 Кбод. Передатчик может находиться в активном или в пассивном состоянии (рис. 10, б). В активном состоянии при передаче «лог. 1» на прямом выходе (A) 3.3…4.7 В, на инверсном (B) 1…1.8 В, при передаче «лог. 0» уровни меняются на противоположные. В пассивном состоянии передатчик представляет собой высокоимпедансную (Z) нагрузку и не влияет на линию связи. Гальваническая развязка стандартом не предусмотрена.

Рис. 7.19

Обычно реализуется режим полудуплекс, когда одно устройство в локальной сети является «ведущим» и активизирует свой передатчик для передачи сообщения одному из адресуемых «ведомых», после чего переходит в режим приема (выключает передатчик) для получения ответа от выбранного ведомого. После получения ответа или по окончании заданного времени (тайм-аут приема) ведущий вновь активизирует свой передатчик (рис. 1.10, б). Конфликт при попытке включения сразу нескольких передатчиков называется коллизией и решается программным способом в протоколах связи.

Микросхема ADM485 содержит передатчик и приемник с питанием +5 В и двумя входами разрешения – передатчика DE и приемника #RE.

3. UART + «токовая петля 20 мА» (TTY) = предусматривает гальваническую развязку оптопарой и передачу сигнала токовыми посылками (повышенная помехозащищенность), в остальном характеристики близки к решениям на базе RS232 (1 км – до 19 200 бод, более – до 9 600 бод). Источником тока в петле является передатчик, реже приемник. Для дуплекса требуется две пары проводов, в полудуплексе можно обойтись одной парой, при этом приемник «слышит» и сигнал своего передатчика.

Программная реализация протоколов связи

В принципе, возможно полностью программная реализация протоколов связи (за исключением физического уровня). Это обеспечивает максимальную гибкость в выборе типа и разновидности протокола связи, полную свободу в выборе выводов МК, но существенно снижает частоту тактирования последовательного интерфейса (особенно в режиме приема) и загружает процессор рутинными действиями. Программная реализация протоколов связи актуальна прежде всего в бюджетных МК с малым числом выводов (например, подсемейство Tiny семейства AVR), в которых отсутствуют аппаратные контроллеры последовательных интерфейсов.

Для начала рассмотрим программную реализацию синхронного трехпроводного протокола (типа SPI) в роли ведомого, так как ведущим обычно выступает МК с использованием аппаратного контроллера. Основная задача – выявление фронтов и срезов на входе тактов SCK, которые синхронизируют как процесс приема (вход SI), так и передачи (выход SO). Удобно использовать в качестве входа SCK вход внешнего прерывания INTx, настроенный на аппаратное выявление среза и фронта импульса.

На рис. 1.5 представлены два варианта временных диаграмм: режим Mode 0 с передачей начиная с младшего бита (рис. а), режим Mode 3 с передачей начиная со старшего бита (рис. б). На рис. представлены варианты блок-схем подпрограммы прерываний ISR INTx для вариантов диаграммы а и б соответственно.

Рис. 7.20

Рис. 7.21

В режим Mode 0 уровень младшего бита регистра передатчика OUT_REG копируется на выход данных SO до прихода первого тактового импульса. Например, сразу после записи нового значения в регистр передатчика, либо по фронту синхронизации выборки ведомого. По фронту SCK выполняется чтение уровня на входе SI и его копирование в младший бит регистра приемника IN_REG, затем сдвиг содержимого регистра приемника влево. По срезу выполняется копирование уровня старшего бита регистра передатчика OUT_REG на выход SO, затем сдвиг содержимого регистра передатчика вправо. Одновременно ведется счет тактов, после отсчета 8 тактов устанавливается флаг завершения процедуры приема/передачи flag_byte. Период тактов должен быть достаточным для поочередного выполнения каждой из ветвей подпрограммы.

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

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

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

Рис. 7.22

Программная реализация приема/передачи байта по протоколу UART:

  1. В основном цикле – монопольные задачи (рис. 1.12), только полудуплекс. В процессе приема возможно выявление ошибки приема (флаг rErr – байт не принят) и ошибки формата приема (флаг rFrErr – стоп-бит равен нулю).

  2. С использованием прерывания таймера по переполнению для тактирования передачи и приема (дуплекс и полудуплекс). Передача тактируется на частоте связи. Синхронизация со старт-битом при приеме выполняется либо на утроенной частоте (1 – 0 – 0, на следующих 9 тактах делить частоту на 3), либо с использованием входа прерывания INTx (срез), затем по таймеру половина такта и проверка на ноль, и еще 9 тактов.