Короткий:
Глядя на прошивку ATMEGA16U2 ( https://github.com/arduino/ArduinoCore-sam/blob/master/firmwares/atmega16u2/arduino-usbserial/Arduino-usbserial.c ) я обнаружил, что при настройке / изменении настроек Эмулируемый USB последовательный порт, USART сбрасывается. Это происходит даже тогда, когда вы открываете Arduino Serial Monitor (он должен настроить скорость последовательного порта и т. Д.). Это вызывает ваш всплеск.
Длинная:
Посмотрите на функцию:
void EVENT_CDC_Device_LineEncodingChanged(USB_ClassInfo_CDC_Device_t* const CDCInterfaceInfo)
Там вы увидите, что через несколько строк он сбрасывает USART, обнуляя свои регистры:
/* Must turn off USART before reconfiguring it, otherwise incorrect operation may occur */
UCSR1B = 0;
UCSR1A = 0;
UCSR1C = 0;
На странице 168 текущей таблицы данных ATMEGA16U2 вы обнаружите, что, устанавливая бит 3 UCSR1B (TXEN1), вы включаете передатчик, переопределяя нормальную работу порта (т. Е. Он становится выходным). Цитирование таблицы данных:
Запись этого бита в один включает передатчик USART. При включении передатчик отменяет нормальную работу порта для контакта TxDn. Отключение передатчика (запись TXENn в ноль) не вступит в силу до тех пор, пока не будут завершены текущие и ожидающие передачи, то есть когда регистр сдвига передачи и регистр буфера передачи не содержат данных для передачи. Когда отключено, передатчик больше не будет переопределять порт TxDn.
Таким образом, записывая, UCSR1B = 0;
вы больше не отменяете вывод TXD1, который будет действовать как ввод.
ATMEGA16U2 TXD подключен к линии RX ATSAM3X8E. При нормальной работе с включенным UART эта линия остается высокой, если данные не передаются. Если вы отключите UART, эта конкретная линия больше не будет драйвером 1. Поскольку код инициализации не устанавливает подтягивание на этом выводе (и при этом он не настроен как выход), вывод становится плавающим входом, и любая утечка к GND или даже входной импеданс вашего датчика (который находится между вашим выводом и GND), медленно снизит логический уровень до 0.
Чтобы устранить эту проблему, вам необходимо: 1) изменить прошивку ATMEGA16U2, установив этот PIN-код как OUTPUT со значением 1. 2) изменить прошивку ATMEGA16U2, включив подтягивание на этом выводе. 3) (рекомендуется) Включите подтягивание на линии RX на ATSAM3X8E.