Машинка на ДУ управлении своими руками. Аппаратная реализация. 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 во вложении.