ショート:
ATMEGA16U2ファームウェア( https://github.com/arduino/ArduinoCore-sam/blob/master/firmwares/atmega16u2/arduino-usbserial/Arduino-usbserial.c )エミュレートされたUSBの設定を変更したり変更したりするとシリアルポートでは、USARTがリセットされます。これはArduinoシリアルモニタを開いても発生します(シリアル速度などを設定する必要があります)。これはあなたのスパイクを引き起こします。
長いです:
関数を見てください:
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のゼロへの書き込み)は行われません
進行中および保留中の送信が完了するまで、すなわち、
送信シフトレジスタと送信バッファレジスタが
送信されるデータを含む。無効にすると、Transmitterはno
TxDnポートをオーバーライドしてください。
したがって、 UCSR1B = 0;
を書くことで、入力として機能するTXD1ピンをオーバーライドすることはなくなりました。
ATMEGA16U2 TXDは、ATSAM3X8EのRXラインに接続されています。通常の動作では、UARTを有効にすると、データが送信されていなければそのラインはハイのままです。 UARTをディセーブルすると、その特定のラインはドライバが1になります。初期化コードはそのピンのプルアップを設定していないため、ピンはフローティング入力になり、 GND、またはプローブの入力インピーダンス(ピンとGNDの間)でさえも、ロジックレベルはゆっくりと0になります。
これを無効にするには、次のいずれかを行う必要があります。
1)ATMEGA16U2ファームウェアを、そのPINをOUTPUTとして値1で設定して変更します。
2)ATMEGA16U2ファームウェアを変更するには、そのピンのプルアップを有効にします。
3)(推奨)ATSAM3X8EのRXラインのプルアップを有効にします。