짧은:
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을 0으로 쓰기)는 진행 중이거나 보류중인 전송이 완료 될 때까지, 즉 전송 시프트 레지스터 및 전송 버퍼 레지스터에 전송할 데이터가 포함되지 않은 경우에는 적용되지 않습니다. 비활성화되면 트랜스미터는 더 이상 TxDn 포트를 무시하지 않습니다.
따라서 쓰기 UCSR1B = 0;
를하면 TXD1 핀을 더 이상 덮어 쓰지 않아도되며 입력으로 작동합니다.
ATMEGA16U2 TXD는 ATSAM3X8E의 RX 라인에 연결되어 있습니다. 정상 작동에서 UART가 활성화 된 상태에서 데이터가 전송되지 않으면 해당 라인은 계속 높게 유지됩니다. UART를 비활성화하면 해당 라인이 더 이상 드라이버가되지 않습니다. 초기화 코드는 해당 핀에서 풀업을 설정하지 않으며 출력으로 구성되지 않기 때문에 핀이 부동 입력이되고 누수가 발생합니다. GND 또는 프로브의 입력 임피던스 (핀과 GND 사이에 있음)는 천천히 로직 레벨을 0으로 만듭니다.
이 문제를 무시하려면 1) 해당 PIN을 OUTPUT으로 값 1로 설정하여 ATMEGA16U2 펌웨어를 수정하십시오. 2) 해당 핀에서 풀업을 활성화하여 ATMEGA16U2 펌웨어를 수정하십시오. 3) (추천) ATSAM3X8E의 RX 라인에서 풀업을 활성화하십시오.