На этом уроке мы с Вами напишем программу приёмника на основе модуля 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 во вложении.