Krótki:
Patrząc na oprogramowanie układowe ATMEGA16U2 ( https://github.com/arduino/ArduinoCore-sam/blob/master/firmwares/atmega16u2/arduino-usbserial/Arduino-usbserial.c ) stwierdzam, że podczas konfigurowania / zmiany ustawień Emulowany port szeregowy USB USART jest resetowany. Dzieje się tak nawet po otwarciu Arduino Serial Monitor (musi skonfigurować prędkość szeregową itp.). To powoduje twój skok.
Długo:
Spójrz na funkcję:
void EVENT_CDC_Device_LineEncodingChanged(USB_ClassInfo_CDC_Device_t* const CDCInterfaceInfo)
Tam zobaczysz, że po niektórych wierszach resetuje USART, zerując swoje rejestry:
/* Must turn off USART before reconfiguring it, otherwise incorrect operation may occur */
UCSR1B = 0;
UCSR1A = 0;
UCSR1C = 0;
Na stronie 168 aktualnego arkusza danych ATMEGA16U2 przekonasz się, że ustawiając bit 3 UCSR1B (TXEN1), włączasz nadajnik, zastępując normalne działanie portu (tzn. Staje się on wyjściowy). Cytując arkusz danych:
Zapisanie tego bitu do jednego umożliwia nadajnik USART. Nadajnik zastąpi normalne działanie portu dla styku TxDn, jeśli jest włączony. Wyłączenie nadajnika (zapis TXENn na zero) nie zacznie obowiązywać, dopóki transmisje trwające i oczekujące nie zostaną zakończone, tj. Gdy rejestr przesunięcia transmisji i rejestr bufora transmisji nie będą zawierały danych do przesłania. Po wyłączeniu nadajnik nie będzie już zastępował portu TxDn.
Dlatego pisząc UCSR1B = 0;
, nie zastępujesz już styku TXD1, który będzie działał jako wejście.
ATMEGA16U2 TXD jest podłączony do linii RX ATSAM3X8E. W normalnej pracy, przy włączonym UART, linia ta pozostaje wysoka, jeśli żadne dane nie są przesyłane. Jeśli wyłączysz UART, ta konkretna linia nie będzie już sterownikiem do 1. Ponieważ kod inicjujący nie ustawia podciągania na tym pinie (i nie jest skonfigurowany jako wyjście), pin staje się zmiennoprzecinkowym wejściem, a wszelkie wycieki do GND, a nawet impedancja wejściowa twojej sondy (która jest pomiędzy pinem a GND), powoli doprowadzi poziom logiczny do 0.
Aby rozwiązać ten problem, należy: 1) Zmodyfikować oprogramowanie układowe ATMEGA16U2, ustawiając ten PIN jako WYJŚCIE, o wartości 1. 2) Zmodyfikować oprogramowanie układowe ATMEGA16U2, umożliwiając podciągnięcie na ten pin. 3) (sugerowane) Włącz podciąganie na linii RX w ATSAM3X8E.