Использование TX как gpio, а RX как последовательного контакта для чтения данных из другого микроконтроллера - Arduino atmega8

У меня есть схема, в которой я использую вывод RX для приема данных (int) от другого микроконтроллера (ESP12E) в качестве односторонней связи, а из-за нехватки выводов мне пришлось использовать вывод TX как GPIO для цифры семисегментного дисплея.

Схема и дисплей работали нормально до того, как я использовал Serial.begin(9600) в функции настройки.

После инициализации последовательного соединения программа перестает работать.

Я использую ATmega8 с фреймворком Arduino и задаюсь вопросом, связана ли проблема с использованием TX как GPIO, а RX — как последовательного порта. Если да, то как решить эту проблему, обозначив только RX как последовательный порт и используя TX как GPIO?

По какой-то причине программная библиотека Serial не работает нормально с atmega8.

, 👍0


2 ответа


Лучший ответ:

1

Последовательный порт ATmega8 состоит из модуля передатчика и Модуль приёмника, который можно включать и выключать независимо. Для вашего приложение, вы хотите, чтобы приемник был включен, а передатчик - быть отключен. Когда передатчик включен, он занимает контакт TX.

К сожалению, основная библиотека Arduino не позволяет включить только один Половину порта. Самый простой вариант — включить весь порт, а затем отключить передатчик, очистив соответствующий бит на подходящий регистр управления:

Serial.begin(9600);   // включить и передатчик, и приемник
UCSRB &= ~bit(TXEN);  // отключить передатчик
,

Большое спасибо... это сработало идеально, @Maher


0

Вызываете ли вы 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