Подписаться на получение новых статей на почту:

UART/USART (УАПП). Прием и передача между двумя AVR. Шаг №41

Всем привет. В прошлой статьемы с Вами разобрали настройки модуля USART /UART микроконтроллера AVR. Сегодня мы с Вами разберем приема-передачу, алгоритм ( UART ) и протестируем на примере в симуляторе. Итак разберем принцип приема и передачи микроконтроллером. Начнем с передачи данных. Для этого установим разряд TXEN регистра UCSRB (регистры управления смотри в предыдущей статье). Вывод микроконтроллера TXD переключается к передатчику, независимо от настроек порта.

В случае использовании синхронного режима необходимо переопределить вывод XCK. Передача начинается записью данных в регистр UDR, после этого данные перемещаются в сдвиговый регистр передатчика. В случае использования 9-ти разрядного кадра, значение разряда TXB8, которое загружается в него до записи младшего байта слова в регистр данных, копируется в 9-й разряд. В предыдущей статье мы рассматривали, что формат кадра может быть от 5 до 9 бит.

После пересылки слова данных, флаг UDRE регистра UCSRA устанавливается в 1, что означает готовность передатчика к получению нового слова данных. Состояние флага остается до следующего записи в буфер. В предыдущей статье мы разобрали что кадр содержит старт-бит, может содержать бит четности, один или два стоп – бита. После загрузки сдвигового регистра его содержимое начинает сдвигаться и поступать на вывод TXD.

После окончания передачи кадра, и если во время передачи не было записано новое слово в UDR, устанавливается флаг прерывания «Передача завершена» — TXC (UCSRA). Сброс осуществляется аппаратно при входе в подпрограмму или программно записью в него 1.

Выключается передатчик сбросом TXEN и после выполнения текущей и отложенной передачи. Ниже алгоритм настройки и передачи данных на Си.

void usart_init (unsigned int ubrr)
{
      // устанавливаем скорость Baud Rate: 9600
      UBRRH=(unsigned char)(ubrr>>8);
      UBRRL=(unsigned char) ubrr;
      UCSRA=0×00;
      // Разрешение работы передатчика 
      UCSRB=(1<<TXEN);
      //Установка формата посылки: 8 бит данных, 1 стоп-бит
      UCSRC=(1<<UCSZ1)|(1<<UCSZ0);
}

UDR=t; // записываем данные в регистр и сразу начинается передача

Прием данных. Начинается после обнаружения приемником корректного старт-бита. Каждый разряд содержимого кадра считывается с установленной частотой. Считанные данные перемещаются в сдвиговый регистр приемника до обнаружения первого стоп – бита и далее в буфер приемника. Если используется 9-ти разрядный кадр, то значение старшего разряда может быть определенно по состоянию флага RX8, причем при режиме USART до обращения к регистру данных. Если во время приема была включена схема контроля четности, то она вычитывает бит четности для всех разрядов принятого слова данных и сравнивает его с принятым битом четности. Результат проверки запоминается в буфере приемника вместе с принятым словом и стоп битами.

Наличие или отсутствия ошибки определяется по состоянию флага UPE, который устанавливается в 1 если следующее слово которое может быть прочитано из буфера имеет ошибку контроля четности.

Следующий флаг индикатор, который мы используем это FE, который устанавливается в 1, если значение первого стоп-бита = 0.

Флаги DOR ( USART ) и OR (UART) индицируют потерю данных из-за переполнения буфера приемника. Флаги в UART – FE читается перед обращением к регистру данных, а OR после. В USART состояние флагов читается перед обращением к регистру. Для индикации состояния приемника используется флаг прерывания RXC (прием завершен). Устанавливается в 1 при наличии в буфере непрочитанных данных. Сбрасывается в UART после прочтения регистра данных, в USART после опустошения буфера. Выключается приемник сразу после сброса RXEN.

Ниже алгоритм настройки и прерывание на прием данных для AVR ATmega8.

void usart_init (unsigned int ubrr)
{
       // устанавливаем скорость Baud Rate: 9600
      UBRRH=(unsigned char)(ubrr>>8);
      UBRRL=(unsigned char) ubrr;
      UCSRB|=(1<<RXEN);   
      // Разрешение работы приемника
      UCSRB|=(1<<RXCIE);
      // Разрешение прерываний по приему
      // Установка формата посылки: 8 бит данных, 1 стоп-бит
      UCSRC=(1<<UCSZ1)|(1<<UCSZ0);
}

//выводим принятый байт на дисплей
ISR (USART_RXC_vect)
{
     char r = UDR;
     Display®;
}

Рассмотрим принцип приема всех разрядов кадра, который осуществляется по разному в зависимости от модуля. Если USART то по одному из фронтов сигнала XCK. Если асинхронный режим, то используется схема восстановления сигнала и данных, который синхронизирует внутренний тактовый сигнал, формируемым контроллером скорости передач и кадров поступающих на вывод RXD. Схема считывает и фильтрует каждый разряд принимаемого кадра(слова), также опрашивает вход приемника с целью определения старт бита кадра. Частота опроса зависит от разряда U2X. Если равен 0, частота выборки в 16 раз превышает скорость передачи данных. Если = 1 в 8 раз.

Т.е. для распознавания старт бита, необходимо обнаружить изменение сигнала с 1 на 0, после чего возможный сигнал старт бита выбирается три раза (8,9, 10т при U2X = 0 и 4,5,6 = 1). Если хотя бы две выборки = 1, старт-бит считается ложным. Если нет , тогда с этим сигналом синхронизируется внутренний тактовый сигнал приемника. И далее включается схема восстановления данных. Далее сигналы выбираются аналогично, для всех включая стоп бит. На рисунке ниже представлен данный принцип.

Выборка данных в кадре по UART в AVR

И последнее в данном протоколе есть мультипроцессорный режим, что означает возможность реализации между несколькими ведомыми мк и одним ведущим, где каждый ведомый имеет свой уникальный адрес. Ведущий сначала посылает адресный байт ведомого, который распознает его и переходит в режим приема данных, и принимает последующие данные как данные. Остальные ведомые игнорируют байты до посылки нового байта адреса. Похоже на то как мы примененяли два ведущих AVR и DS1307 по TWI, только здесь UART.

Для включения режима фильтрации данных, не содержащих адрес, осуществляется установкой в 1 разряда MCPM (UCSRA). Также в ведущем должен быть установлен 9-й режим передачи данных. При передачи адреса старший разряд должен быть установлен в 1, при передачи данных сбрасываться в 0. Прием ведомым осуществляется если принимаемые кадры 5…8 разрядные, то идентификация содержимого кадра (адрес/данные) осуществляется по первому стоп-биту. Если 9 разрядов, то по старшему разряду слова данных. Если указанные разряды содержат 1 , значит кадр содержит адрес, если 0 – данные.

Для обмена данных необходимо использовать следующую последовательность.
1. Ведомые переключаются в мультипроцессорный режим, 1 в MCPM (UCSRA).
2. Ведущий посылает адресный кадр — ведомые принимают, у них устанавливается флаг RXC.
3. Ведомые считывают регистр данных, если его адрес совпадает с адресом посланным ведущим, он сбрасывает в 0 MCPM
4. Начинается прием данных. Если приемник ведомого настроен на 5...8 кадр будет генерироваться ошибка кадрирования, поскольку первый стоп-бит = 0
5. После приема последнего байта данных ведомый устанавливает в 1 разряд MCPM и снова ожидает прихода кадра адреса.

Данный режим мы используем в следующей статье при передаче данных на ПК. Сегодня мы протестируем передачу данных между двумя мк AVR, где первый микроконтроллер считывает температуру пересылает информацию второму мк, тот в свою очередь выводит данные на дисплей. Ниже рисунок нашей схемы.

Передача/прием данных по UART в AVR

Ниже исходники и проект в Proteus.

Передача данных по UART в AVR ( Скачали: 512 чел. ) 

Выше мы с Вами рассмотрели основы передачи по даному протоколу. После ознакомления с базой можем смело брать любую сторонюю библиотеку, подключать к своему проекту, настравать конфигурвцию и наслаждаться результатом. В следующей статье мы передадим все данные логгера, который мы собрали в статье №39, на пк, используя UART-преобразователь, который собрали в статье №8. На этом все. Всем пока.

Просмотрено 7975 раз.

Я на Google+

Добавить комментарий

Ваш e-mail не будет опубликован.

Можно использовать следующие HTML-теги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Subscribe without commenting