Corto:
Mirando el firmware ATMEGA16U2 ( https://github.com/arduino/ArduinoCore-sam/blob/master/firmwares/atmega16u2/arduino-usbserial/Arduino-usbserial.c ) Lo encuentro, cuando configuras / cambias la configuración del Puerto serie emulado USB, el USART se reinicia. Esto sucede incluso cuando abre el monitor serie Arduino (debe configurar la velocidad de serie, etc.). Esto causa tu pico.
Largo:
Mira la función:
void EVENT_CDC_Device_LineEncodingChanged(USB_ClassInfo_CDC_Device_t* const CDCInterfaceInfo)
Allí verá que después de algunas líneas, restablece el USART, poniendo a cero sus registros:
/* Must turn off USART before reconfiguring it, otherwise incorrect operation may occur */
UCSR1B = 0;
UCSR1A = 0;
UCSR1C = 0;
En la página 168, de la hoja de datos ATMEGA16U2 actual, encontrará que, al configurar el bit 3 de UCSR1B (TXEN1), habilita el transmisor, anulando el funcionamiento normal del puerto (es decir, se convierte en salida). Citando la hoja de datos:
Escribir este bit en uno habilita el transmisor USART. El transmisor anulará la operación del puerto normal para el pin TxDn cuando esté habilitado. La desactivación del transmisor (escribiendo TXENn a cero) no será efectiva hasta que se completen las transmisiones en curso y pendientes, es decir, cuando el registro de desplazamiento de transmisión y el registro de búfer de transmisión no contengan datos para ser transmitidos. Cuando está deshabilitado, el transmisor ya no anulará el puerto TxDn.
Por lo tanto, al escribir UCSR1B = 0;
, ya no anulará el pin TXD1, que actuará como entrada.
El ATMEGA16U2 TXD está conectado a la línea RX del ATSAM3X8E. En funcionamiento normal, con el UART habilitado, esa línea permanece alta si no se transmiten datos. Si deshabilita el UART, esa línea en particular ya no es un controlador para 1. Dado que el código de inicialización no establece el pull-up en ese pin (y tampoco está configurado como salida), el pin se convierte en una entrada flotante y cualquier fuga a GND o incluso la impedancia de entrada de su sonda (que está entre su pin y GND), llevará lentamente el nivel lógico a 0.
Para anular este problema, debe: 1) Modificar el firmware ATMEGA16U2, estableciendo ese PIN como SALIDA, con el valor 1. 2) Modificar el firmware ATMEGA16U2, habilitando el pull-up en ese pin. 3) (sugerido) Habilite el pull-up en la línea RX en el ATSAM3X8E.