Использование TX как gpio, а RX как последовательного контакта для чтения данных из другого микроконтроллера - Arduino atmega8
У меня есть схема, в которой я использую вывод RX для приема данных (int) от другого микроконтроллера (ESP12E) в качестве односторонней связи, а из-за нехватки выводов мне пришлось использовать вывод TX как GPIO для цифры семисегментного дисплея.
Схема и дисплей работали нормально до того, как я использовал Serial.begin(9600) в функции настройки.
После инициализации последовательного соединения программа перестает работать.
Я использую ATmega8 с фреймворком Arduino и задаюсь вопросом, связана ли проблема с использованием TX как GPIO, а RX — как последовательного порта. Если да, то как решить эту проблему, обозначив только RX как последовательный порт и используя TX как GPIO?
По какой-то причине программная библиотека Serial не работает нормально с atmega8.
@Maher, 👍0
2 ответа
Лучший ответ:
Последовательный порт ATmega8 состоит из модуля передатчика и Модуль приёмника, который можно включать и выключать независимо. Для вашего приложение, вы хотите, чтобы приемник был включен, а передатчик - быть отключен. Когда передатчик включен, он занимает контакт TX.
К сожалению, основная библиотека Arduino не позволяет включить только один Половину порта. Самый простой вариант — включить весь порт, а затем отключить передатчик, очистив соответствующий бит на подходящий регистр управления:
Serial.begin(9600); // включить и передатчик, и приемник
UCSRB &= ~bit(TXEN); // отключить передатчик
Вызываете ли вы Serial.begin() после настройки вывода TX как gpio? Если да, попробуйте сначала вызвать Serial.begin(), затем настроить вывод TX нужным образом и выполнить полную настройку.
Аппаратный сброс микросхем Atmega оставляет выводы в режиме INPUT без подтяжки, и некоторый код ожидает их найти именно в этом состоянии. Но после вызова Serial.begin() не делайте никаких предположений о состоянии вывода TX. На самом деле, лучшая практика программирования — всегда устанавливать вывод в тот режим и состояние подтяжки, которые ожидает ваш код. Это даст следующему читателю вашего кода (возможно, вам, через год?) понять, что вы имели в виду, и сделает код более переносимым в другую среду, где выводы ввода/вывода могут инициализироваться не так, как это делает Atmega8.
Это не поможет. Согласно [техпаспорту](https://ww1.microchip.com/downloads/en/DeviceDoc/Atmel-2486-8-bit-AVR-microcontroller-ATmega8_L_datasheet.pdf#G1.1196637), «_При включении передатчика обычная работа порта вывода TxD переопределяется USART, и ему назначается функция последовательного выхода передатчика_»., @Edgar Bonet
Ах, ты, как всегда, прав, @EdgarBonet! В данном случае правильная настройка контакта Tx должна включать его отсоединение от UART., @JRobert
- Использовать все контакты как цифровые входы/выходы
- Как контролировать количество void loop в секунду?
- Как получить ненулевой выход из HX711 и ячейки загрузки?
- Какие компоненты можно подключить к контактам 0/1 (RX/TX) без предотвращения загрузки кода?
- Можно ли использовать SoftwareSerial в ESP01
- Использую nRF2401, и в передатчике и приемнике Rx не мигает, а Tx мигает; почему Rx не мигает?
- Проблема с подключением датчика сердцебиения и температуры на arduino uno, но работает по отдельности
- Как разделить входящую строку?
Большое спасибо... это сработало идеально, @Maher