Corto:
Guardando il firmware ATMEGA16U2 ( https://github.com/arduino/ArduinoCore-sam/blob/master/firmwares/atmega16u2/arduino-usbserial/Arduino-usbserial.c ) lo trovo quando configuri / modifichi le impostazioni del Porta seriale emulata USB, USART viene reimpostato. Ciò accade anche quando si apre Arduino Serial Monitor (deve configurare la velocità seriale, ecc.). Questo provoca il tuo picco.
Lungo:
Guarda la funzione:
void EVENT_CDC_Device_LineEncodingChanged(USB_ClassInfo_CDC_Device_t* const CDCInterfaceInfo)
Lì vedrai che dopo alcune righe, ripristina USART, azzerando i suoi registri:
/* Must turn off USART before reconfiguring it, otherwise incorrect operation may occur */
UCSR1B = 0;
UCSR1A = 0;
UCSR1C = 0;
A pagina 168, dell'attuale scheda tecnica ATMEGA16U2, scoprirai che, impostando il bit 3 (TXEN1) di UCSR1B, abiliti il trasmettitore, ignorando il normale funzionamento della porta (cioè diventa output). Citando la scheda tecnica:
Scrivere questo bit su uno abilita il trasmettitore USART. Il trasmettitore sovrascriverà il normale funzionamento della porta per il pin TxDn quando abilitato. La disabilitazione del trasmettitore (scrivendo TXENn a zero) non diventerà effettiva fino al completamento delle trasmissioni in corso e in sospeso, vale a dire quando il registro di invio turno e il registro buffer di trasmissione non contengono dati da trasmettere. Se disabilitato, il trasmettitore non sovrascriverà più la porta TxDn.
Pertanto, scrivendo UCSR1B = 0;
non si sostituisce più il pin TXD1, che fungerà da input.
ATMEGA16U2 TXD è collegato alla linea RX dell'ATSAM3X8E. Durante il normale funzionamento, con UART abilitato, quella linea rimane alta se non vengono trasmessi dati. Se disabiliti l'UART, quella particolare linea non è più un driver su 1. Poiché il codice di inizializzazione non imposta il pull-up su quel pin (e non è configurato come output), il pin diventa un input flottante e qualsiasi perdita a GND o persino l'impedenza di ingresso della sonda (che si trova tra il pin e GND), porterà lentamente il livello logico a 0.
Per ovviare a questo problema, è necessario: 1) Modificare il firmware ATMEGA16U2, impostando quel PIN come OUTPUT, con valore 1. 2) Modificare il firmware ATMEGA16U2, abilitando il pull-up su quel pin. 3) (suggerito) Abilitare il pull-up sulla linea RX sull'ATSAM3X8E.