Апаратна реалізація. UART. Передавач на AVR

На цьому уроці ми з Вами розглянемо варіант апаратної реалізації протоколу обміну на основі модуля універсального асинхронного прийомопередавача УАПП (Universal Asynchronous Receiver-Transmitter, UART) мікроконтролера AVR.

У ті давні часи, коли починали з'являтися перші мікроконтролери, апаратні модулі інтерфейсів обміну відсутні були. Усі інтерфейси зв'язку організовувалися програмно (на подібі того, чим ми займалися на попередніх уроках). У наші дні, коли практично кожен мікроконтролер буквально напичкан апаратними модулями UART, I2C, SPI, CAN і т.п, програмну реалізацію практично не використовують.

Апаратна реалізація інтерфейсу дозволяє звільнити машинний час завдяки автономності модулів і використанню переривань. На сьогоднішній день майже кожен мікроконтролер має на борту універсальний послідовний інтерфейс UART. AVR підтримує цей протокол повністю.

!! У зв'язку з фіксованим розташуванням виводів модуля UART кнопки управління довелося перенести. Зверніть на це увагу.

Перед використанням налаштуємо UART. Нам потрібно задати швидкість обміну і формат передаваних даних.

Для того, щоб встановити швидкість обміну необхідно записати в регістр генератора швидкості UBRR зв'язку константу, обчислену за формулою, наведеною в документації. Однак є більш простий шлях – вибрати константу з таблиці стандартних швидкостей.

Я обираю швидкість 9600 біт/сек...

UBRRH = 0;
UBRRL = 103; //Швидкість 9600 бод

Щодо формату передаваних даних...

У початку передається один стартовий біт. Потім передається байт даних. У завершенні передається стоповий біт, що говорить про те, що передача цього байта завершена.

В кінці байта даних, перед стоповим бітом, може знаходитися біт четності.

Також, для надійності, може використовуватися два стопових біти.

Я збираюся використовувати найпопулярніший формат: 8 біт, один стартовий і один стоповий біт, без біта четності...

UCSRC = (0 << UMSEL)| // Біт 6 – USART Mode Select
        (0 << UPM0)| // Біт 5 – Parity Mode
        (0 << UPM1)| // Біт 4 – Parity Mode
      (0 << USBS)| // Біт 3 – Stop Bit Select
        (1 << UCSZ1)| // Біт 2 – Character Size
        (1 << UCSZ0)| // Біт 1 – Character Size
        (0 << UCPOL); // Біт 0 – Clock Polarity

Увімкнемо передавач...

UCSRB = (0 << RXCIE)| // Біт 7 – RX Complete Interrupt Enable
   (0 << TXCIE)| // Біт 6 – TX Complete Interrupt Enable
   (0 << UDRIE)| // Біт 5 – USART Data Register Empty Interrupt Enable
   (0 << RXEN)| // Біт 4 – Receiver Enable
   (1 << TXEN)| // Біт 3 – Transmitter Enable
   (0 << UCSZ2); // Біт 2 – Character Size

Для того, щоб почати передачу необхідно завантажити байт даних у регістр введення/виведення даних UDR. Передача даних відбувається автономно і не займає машинного часу.

UDR = <байт даних>;

Ну і звісно ж, перш ніж відправляти наступний байт необхідно дочекатися закінчення передачі попереднього. Для цього використовуємо прапор звільнення регістра даних UDRE...

while(!(UCSRA & (1 << UDRE)));

Для передачі даних я використовую дві функції: передача байта...

USART_TransmitByte(unsigned char txData) {

   UDR = txData;
   while(!(UCSRA & (1 << UDRE)));
}

...і передача рядка...

USART_TransmitString(unsigned char txData[]) {

   for (int i=0; i < strlen(txData);) {

   USART_TransmitByte(txData[i]);
   i++;
   }
}

Ну а далі... опитуємо ручку газу, кнопки пульта управління і передаємо...

   //Передача стартових байт
   USART_TransmitString(START_SEQUENCE);
 
   //Передача байта потужності
   USART_TransmitByte(ADCH);

   //Передача байта commandBuffer
   USART_TransmitByte(commandBuffer);

   //Передача стопових байт
   USART_TransmitString(STOP_SEQUENCE);

Кілька слів на завершення. У наступному відео ми напишемо програму приймача на основі апаратного модуля UART, МК AVR.

ПРОЕКТ З ІСХОДНИМ КОДОМ І СИМУЛЯЦІЯ В PROTEUS у вкладенні.

Прикреплені файли:

Top