Kurz:
Betrachtet man die ATMEGA16U2-Firmware ( https://github.com/arduino/ArduinoCore-sam/blob/master/firmwares/atmega16u2/arduino-usbserial/Arduino-usbserial.c ), so stelle ich fest, dass beim Konfigurieren / Ändern der Einstellungen der USB emulierte serielle Schnittstelle, der USART wird zurückgesetzt. Dies geschieht auch, wenn Sie den Arduino Serial Monitor öffnen (er muss die serielle Geschwindigkeit usw. konfigurieren). Dies verursacht Ihre Spitze.
Lange:
Funktion anschauen:
void EVENT_CDC_Device_LineEncodingChanged(USB_ClassInfo_CDC_Device_t* const CDCInterfaceInfo)
Dort sehen Sie, dass nach einigen Zeilen der USART zurückgesetzt wird, indem seine Register auf Null gesetzt werden:
/* Must turn off USART before reconfiguring it, otherwise incorrect operation may occur */
UCSR1B = 0;
UCSR1A = 0;
UCSR1C = 0;
Auf Seite 168 des aktuellen ATMEGA16U2-Datenblattes finden Sie, dass Sie durch Setzen von Bit 3 (TXEN1) von UCSR1B den Sender aktivieren und den normalen Port-Betrieb außer Kraft setzen (dh, er wird ausgegeben). Zitat aus dem Datenblatt:
Durch Schreiben dieses Bits auf eins wird der USART-Transmitter aktiviert. Der Sender überschreibt den normalen Port-Betrieb für den TxDn-Pin, wenn er aktiviert ist. Die Deaktivierung des Senders (Schreiben von TXENn auf Null) wird erst wirksam, wenn laufende und anstehende Übertragungen abgeschlossen sind, dh wenn das Sendeschieberegister und das Sendepufferregister keine zu sendenden Daten enthalten. Wenn deaktiviert, überschreibt der Sender den TxDn-Port nicht mehr.
Wenn UCSR1B = 0;
Sie also schreiben , überschreiben Sie nicht mehr den TXD1-Pin, der als Eingang fungiert.
Der ATMEGA16U2 TXD ist an die RX-Leitung des ATSAM3X8E angeschlossen. Im normalen Betrieb bleibt diese Leitung bei aktiviertem UART hoch, wenn keine Daten übertragen werden. Wenn Sie den UART deaktivieren, ist diese bestimmte Leitung kein Treiber mehr für 1. Da der Initialisierungscode das Pull-up für diesen Pin nicht festlegt (und auch nicht als Ausgang konfiguriert ist), wird der Pin zu einem potentialfreien Eingang und führt zu einer Leckage GND oder sogar die Eingangsimpedanz Ihrer Sonde (die zwischen Ihrem Pin und GND liegt) bringen den Logikpegel langsam auf 0.
Um dieses Problem zu umgehen, sollten Sie entweder: 1) die ATMEGA16U2-Firmware ändern, indem Sie diese PIN als AUSGANG mit dem Wert 1 festlegen. 2) die ATMEGA16U2-Firmware ändern, indem Sie das Pull-up auf diesen Pin aktivieren. 3) (empfohlen) Aktivieren Sie das Pull-up auf der RX-Leitung des ATSAM3X8E.