Главная страница Случайная страница КАТЕГОРИИ: АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника |
Описание регистров GICR, gifr, mcucr
Урок 5: обмен данных по USART Цель урока: Понять назначение модуля USART и как с помощью данного модуля можно передавать/ принимать данные.
Теория Универсальный асинхронный приёмопередатчик (УАПП, англ. Universal Asynchronous Receiver-Transmitter, UART) – предназначен для организации связи с другими цифровыми устройствами через последовательный порт. UART может представлять собой отдельную микросхему (например, Intel I8251, I8250) или являться частью большой интегральной схемы (например, микроконтроллераAVR). UART преобразует передаваемые данные в последовательный код. Основные свойства UART МК AVR Atmega16: 1) Полнодуплексный обмен по последовательному каналу. 2) Синхронный и асинхронный режимы работы. 3) Синхронизация как от ведущего, так и от ведомого устройства. 4) Скорость передачи может варьироваться в довольно больших пределах. 5) Посылка может быть от 5-и до 9-и разрядов (UART 8-9 разрядов). 6) Аппаратная поддержка генерации и контроля бита чётности. 7) Имеются три прерывания: «передача завершена», «регистр данных передатчика пуст», «приём завершён». На рис. 18 изображены ножки МК AVR Atmega16. Обозначены: (RXD) PD0 – вход USART МК; (TXD) PD1 – выход USART МК; (XCK/T0) PB0 – вход/выход внешнего тактового сигнала.
МК AVR поддерживает асинхронный последовательный протокол UART аппаратно. Передающая сторона по очереди выдает в линию 0 и 1, а принимающая их запоминает. Синхронизация идет по времени, т.е. приемник и передатчик заранее договариваются о частоте (скорости) обмена данными. Скорость UART для конкретного соединения указывается в бодах (что в данном случае соответствует битам в секунду). Существует общепринятый ряд стандартных скоростей: 300; 600; 1200; 2400; 4800; 9600; 19200; 38400; 57600; 115200; 230400; 460800; 921600 бод. Скорость (бод) и длительность бита (секунда) связаны соотношением. Скорость в бодах иногда называют сленговым словом битрейт. Если скорость передатчика и приемника не совпадают, то передача может не состояться, либо данные будут считаны не в полном объёме. В МК AVR за организацию работы UART отвечают регистр UDR ( U ART D ata R egister) размером 1 байт. Он представляет собой два разных регистра (регистр передатчика и регистр приемника), но с одним именем (адресом). Данные переданные из UART передатчика, попадают в регистр UART приёмника. Различаются регистры между собой только на аппаратном уровне. При поступлении данных в регистр UDR приемника, в МК возникает прерывание по завершению приема (если прерывание разрешено). Прерывание вызывается сразу же, как только приемник получил все биты данных (8 или 9 бит, в зависимости от настройки UART). Данные из регистра UDR передатчика передаются побайтно (биты выходят из передатчика последовательно, друг за другом). По окончании пересылки байта из регистра UDR приёмника в сдвиговый регистр, в 5-ый разрядрегистра UCSRA поступает флаг опустошения регистра данных UDRE. Флаг вызываетаппаратное прерывание, сигнализируя о том, что UDR пуст и готов к приему нового байта. Флаг сбрасывается аппаратно при записи в UDR нового байта информации. Можно в памяти организовать кольцевой буфер, и туда поместить данные, которые будут побайтно передаваться в регистр UDR передатчика при появлении флага опустошения регистра данных - UDRE. При приеме данных действия аналогичные. По завершению приема байта данных вызывается прерывание (если оно разрешено) и по этому прерыванию данные из регистра UDR приемника записываются в кольцевой буфер. Помимо собственно информационного потока UART автоматически вставляет в поток синхронизирующие метки, так называемые стартовый и стоповый биты. При приёме эти лишние биты удаляются из потока. Обычно стартовый и стоповый биты обрамляют один байт информации (8 бит), однако встречаются реализации UART, которые позволяют передавать по 5, 6, 7, 8 или 9 бит. Обрамленные стартом и стопом биты являются минимальной посылкой. Некоторые реализации UART позволяют вставлять два стоповых бита при передаче для уменьшения вероятности рассинхронизации приёмника и передатчика при плотном трафике. Приёмник игнорирует второй стоповый бит, воспринимая его как короткую паузу на линии. Многие реализации UART имеют возможность автоматически контролировать целостность данных методом контроля битовой чётности. Когда эта функция включена, последний бит данных в минимальной посылке («бит чётности») контролируется логикой UART и содержит информацию о чётности количества единичных бит в этой минимальной посылке. Различают контроль на четность (англ. Even parity), когда сумма количества единичных бит в посылке является четным числом, и контроль на нечетность (англ. Odd parity), когда эта сумма нечетна (см. таблицу 5.1). При приеме такой посылки UART может автоматически контролировать бит четности и выставлять соответствующие признаки правильного или ошибочного приема. Таблица 5.1 Контроль чётности
Рассмотрим обмен данными на двух примерах: - обмен данных между двумя микроконтроллерами, - прием данных от компьютера через COM-порт.
Пример 1. Приём и чтение данных микроконтроллером
Настроим МК на приём данных с помощью CodeWizard (см.Рис.20 ).
Рис. 20 – Закладка USART в CodeWizard (без прерываний)
Включим строки 11, 12, 13(инициализации UART) в функцию инициализации: void MC_UNIT (void){UCSRA=0x00; UCSRB=0x18; // 8 - 1< < TXEN; 1 - Разрешение передачи, активирует выход TXD // 1 - 1< < RXEN; - Разрешение работы приемника, активирует вход RXDUCSRC=0x86; //6 - 1< < UCSZ1 и 1< < UCSZ0 - 8 бит данных в посылке, //8 - 1< < URSEL - выбор регистра UCSRC, «0» в 6-ом бите– асинхронный режимUBRRH=0x00; UBRRL=0x06; // скорость передачи 9600 бод = 1000000/16/6 = 10416, что почти = 9600, с погрешностью 7% PORTC=0x00; DDRC=0x01; }Опишем основную функцию mail: void main(void){char date=0; MC_UNIT(); while(1) { date=UDR; if (date =='1') PORTC.0=1; else PORTC.0=0; delay_ms(500); }}При передаче «1» с помощью терминала лампочка загорится на 500 мс. Соберём схему в Proteus (см. рис.21).
Рис.21 – Схема реализации в Proteus
Программа бесконечно ожидает прихода байта. Так делать нецелесообразно, потому что главный цикл загружен приемом и передачей данных через UART и больше ничего делать не может.
|