Апаратна реалізація. 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 у вкладенні.
Прикреплені файли:
- transmitter_uart_crr.rar (43 Кб)