Rövid :
Az ATMEGA16U2 firmware megtekintése ( https://github.com/arduino/ArduinoCore-sam/blob/master/firmwares/atmega16u2/arduino-usbserial/Arduino-usbserial .c) Megállapítottam, hogy amikor konfigurálja / megváltoztatja az USB emulált soros port beállításait, az USART visszaáll. Ez akkor is megtörténik, amikor megnyitja az Arduino soros monitort (konfigurálnia kell a soros sebességet stb.). Ez okozza a csúcsot.
Hosszú:
Nézze meg a függvényt:
void EVENT_CDC_Device_LineEncodingChanged (USB_ClassInfo_CDC_Device_t * const CDCInterfaceInfo)
Ott látni fogja, hogy néhány sor után visszaállítja az USART-ot a regiszterek nullázásával:
/ * Az USART újrakonfigurálása előtt ki kell kapcsolnia az USART-ot, különben helytelen működés történhet * / UCSR1B = 0; UCSR1A = 0; UCSR1C = 0;
A jelenlegi ATMEGA16U2 adatlap 168. oldalán azt találja, hogy az UCSR1B 3. bitjének (TXEN1) beállításával engedélyezi az adót, felülírva a normál port működését (azaz kimenetivé válik). Az adatlap idézése:
Ennek a bitnek az egyikbe írása lehetővé teszi az USART adóját. Az adó felülbírálja a TxDn tű normál portjának működését, ha engedélyezve van. Az adó letiltása (a TXENn nullára írása) addig nem lép hatályba, amíg a folyamatban lévő és függőben lévő adások nem fejeződnek be, vagyis amikor az Adáseltolás-nyilvántartás és az Adáspuffer-nyilvántartás nem tartalmaznak továbbítandó adatokat. Ha le van tiltva, az adó már nem írja felül a TxDn portot.
Ezért az UCSR1B = 0;
beírásával már nem írja felül a TXD1 tűt, amely működni fog bemenetként.
Az ATMEGA16U2 TXD csatlakozik az ATSAM3X8E RX vonalához. Normál üzemben, engedélyezve az UART-ot, ez a vonal magas marad, ha nem továbbítunk adatot. Ha letiltja az UART-ot, akkor az adott sor már nem az 1-es illesztőprogram. Mivel az inicializálási kód nem állítja be a felhúzást az adott csapra (és kimenetként sem van konfigurálva), a tű lebegő bemenetté válik, és az esetleges szivárgás A GND vagy akár a szonda bemeneti impedanciája (amely a tű és a GND között van) lassan 0-ra emeli a logikai szintet.
Ennek felülbírálásához a probléma az alábbiakat kell tennie: , a PIN-kód kimenetként történő beállításával, 1.2-es értékkel.) Módosítsa az ATMEGA16U2 firmware-t, engedélyezve az adott csap felhúzását.