Court:
En regardant le firmware ATMEGA16U2 ( https://github.com/arduino/ArduinoCore-sam/blob/master/firmwares/atmega16u2/arduino-usbserial/Arduino-usbserial.c ), je trouve que, lorsque vous configurez / modifiez les paramètres du Port série émulé USB, l'USART est réinitialisé. Cela se produit même lorsque vous ouvrez le moniteur série Arduino (il doit configurer la vitesse série, etc.). Cela provoque votre pic.
Longue:
Regardez la fonction:
void EVENT_CDC_Device_LineEncodingChanged(USB_ClassInfo_CDC_Device_t* const CDCInterfaceInfo)
Vous verrez qu'après quelques lignes, il réinitialise l'USART, en mettant à zéro ses registres:
/* Must turn off USART before reconfiguring it, otherwise incorrect operation may occur */
UCSR1B = 0;
UCSR1A = 0;
UCSR1C = 0;
À la page 168, de la feuille de données ATMEGA16U2 actuelle, vous constaterez qu'en définissant le bit 3 de l'UCSR1B (TXEN1), vous activez l'émetteur, remplaçant le fonctionnement normal du port (c'est-à-dire qu'il devient une sortie). Citant la fiche technique:
L'écriture de ce bit sur un active l'émetteur USART. L'émetteur annule le fonctionnement normal du port pour la broche TxDn lorsqu'il est activé. La désactivation de l'émetteur (écriture de TXENn sur zéro) ne prendra effet que lorsque les transmissions en cours et en attente seront terminées, c'est-à-dire lorsque le registre à décalage de transmission et le registre de tampon de transmission ne contiennent pas de données à transmettre. Lorsqu'il est désactivé, l'émetteur ne remplacera plus le port TxDn.
Par conséquent, en écrivant, UCSR1B = 0;
vous ne remplacez plus la broche TXD1, qui agira comme entrée.
L'ATMEGA16U2 TXD est connecté à la ligne RX de l'ATSAM3X8E. En fonctionnement normal, avec l'UART activé, cette ligne reste élevée si aucune donnée n'est transmise. Si vous désactivez l'UART, cette ligne particulière n'est plus un pilote à 1. Étant donné que le code d'initialisation ne définit pas le pull-up sur cette broche (et qu'il n'est pas configuré en sortie), la broche devient une entrée flottante et toute fuite vers GND ou même l'impédance d'entrée de votre sonde (qui est entre votre broche et GND) ramènera lentement le niveau logique à 0.
Pour contourner cela, problème, vous devez soit: 1) Modifier le micrologiciel ATMEGA16U2, en définissant ce code PIN comme SORTIE, avec la valeur 1. 2) Modifier le micrologiciel ATMEGA16U2, en activant le pull-up sur cette broche. 3) (suggéré) Activez le pull-up sur la ligne RX sur l'ATSAM3X8E.