Příčinou je následující kód v souboru arduino_X_X_X\hardware\arduino\avr\cores\arduino\HardwareSerial.cpp , řádky 126 - 130 pro mojí verzi 1_6_8, (za X doplň instalovanou verzi):
Kód: Vybrat vše
//set the data bits, parity, and stop bits
#if defined(__AVR_ATmega8__)
config |= 0x80; // select UCSRC register (shared with UBRRH)
#endif
*_ucsrc = config;
Protože při použití zmíněného procesoru definujeme jeho typ symbolem __AVR_ATmega32__, tak se řádka 128 nastavující nejvyšší bit v config neprovede. Následně se přepíše registr UBRRH, který sdílí s UCSRC stejnou adresu 0x40 a rozlišení se děje právě chybějícím bitem. Výsledkem je špatné nastavení děliče hodin pro taktování USART a také chybějící nastavení typu přenosu a formátu vysílaných dat. Oprava je jednoduchá, kritický řádek pro podmíněný překlad opravíme následovně:
Kód: Vybrat vše
#if defined(__AVR_ATmega8__) || defined(__AVR_ATmega32__) || defined(__AVR_ATmega16__)