ショート:
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;
現在のATMEGA16U2データシートの168ページで、UCSR1Bのビット3(TXEN1)を設定することにより、トランスミッターを有効にし、通常のポート操作を無効にします(つまり、出力になります)。データシートの引用:
このビットを1に書き込むと、USARTトランスミッターが有効になります。トランスミッターを有効にすると、TxDnピンの通常のポート操作がオーバーライドされます。トランスミッタの無効化(TXENnをゼロに書き込む)は、進行中および保留中の送信が完了するまで、つまり、送信シフトレジスタと送信バッファレジスタに送信するデータが含まれなくなるまで有効になりません。無効にすると、トランスミッタはTxDnポートをオーバーライドしなくなります。
したがって、記述によりUCSR1B = 0;
、入力として機能するTXD1ピンをオーバーライドする必要がなくなります。
ATMEGA16U2 TXDはATSAM3X8EのRXラインに接続されています。UARTを有効にした通常の動作では、データが送信されていない場合、そのラインはハイのままです。UARTを無効にすると、その特定の行は1になりません。初期化コードはそのピンのプルアップを設定しないため(出力としても設定されないため)、ピンはフローティング入力になり、 GNDまたはプローブの入力インピーダンス(ピンとGNDの間にある)でさえ、論理レベルをゆっくりと0にします。
これを無効にするには、次のいずれかを実行する必要があります。1)PINを値として1に設定してOUTPUTとしてATMEGA16U2ファームウェアを変更します。2)ピンのプルアップを有効にしてATMEGA16U2ファームウェアを変更します。3)(推奨)ATSAM3X8EのRXラインでプルアップを有効にします。