Машинка на ДУ управлінні своїми руками. Апаратна реалізація. UART. Приймач на AVR

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

Почнемо з налаштування UART. Швидкість і формат передачі даних зберігається. Включаємо приймач (передавач вимкнено)…

(1 << RXEN)| //Bit 4 – Receiver Enable

Приймання даних будемо здійснювати за допомогою перервань, включимо переривання по прийому байта…

(1 << RXCIE)| //Bit 7 – RX Complete Interrupt Enable

Інші налаштування залишаються незмінними. У перериванні…

ISR (USART_RXC_vect) { //Прийнято байт...

…зберігаємо прийняті дані…

rxBuffer[index] = UDR; //Зберігаємо прийнятий байт...

…якщо прийнятий байт відрізняється від першого байта стартової послідовності, виходимо з переривання і чекаємо наступний байт…

//Шукаємо перший стартовий біт...
   if (rxBuffer[0] != 'A') return; //Вихід з обробника...

Якщо початок стартової послідовності знайдено, приймаємо дані. При надходженні стопового байта встановлюємо флаг «команда прийнята» і вимикаємо переривання приймача на час обробки команди…

//Очікуємо ознака закінчення кадру...
   if (rxBuffer[5] == '&') {

   statusCommand = commandReceived; //Команда прийнята...
   UCSRB &= ~(1 << RXCIE); //Вимкнути переривання приймача...
   return; //Вихід з обробника...
   }   

В основній програмі опитуємо флаг прийому команди. Якщо команда прийнята…

   //Обробка прийнятих даних...
   if (statusCommand == commandReceived) {

…обробляємо її…

//Перевірка стартового байта...   if (rxBuffer[1] != 'B') continue;
   if (rxBuffer[2] != 'C') continue;

//Завантажуємо значення потужності
   OCR2 = rxBuffer[3];

//Виконуємо команди напрямку руху і повороту
   if (rxBuffer[4] & (1 << 0)) PORTC |= (1 << PC1); else PORTC &= ~(1 << PC1);
   if (rxBuffer[4] & (1 << 1)) PORTC |= (1 << PC2); else PORTC &= ~(1 << PC2);
   if (rxBuffer[4] & (1 << 2)) PORTC |= (1 << PC3); else PORTC &= ~(1 << PC3);

Готуємося до прийому наступної команди…

index = 0; //Переводимо вказівник на початок буфера
rxBuffer[5] = 0; //Очищаємо стоповий байт
statusCommand = noCommand; //Буфер даних порожній

Команда оброблена, буфер приймача порожній, чекаємо прийому наступної команди…

//Буфер даних порожній, почати прийом...
   UCSRB |= (1 << RXCIE); //Включити переривання приймача...

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

Ну а поки на сьогодні все. Я дякую Вам за увагу. Підписуйтесь на канал ПаяльникTV. Усього хорошого, до побачення!

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

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

Top