Nastavení USART při použití ATmega32 s Arduino prostředím

Raspberry, Arduino, Mini-PC a další

Moderátor: Moderátoři

Odpovědět
Zpráva
Autor
Uživatelský avatar
mtajovsky
Příspěvky: 3728
Registrován: 19 zář 2007, 00:00
Bydliště: Praha

Nastavení USART při použití ATmega32 s Arduino prostředím

#1 Příspěvek od mtajovsky »

Na webu je popsáno použití i jiných typů ATmega v prostředí Arduino než jen těch, co jsou na stadardních deskách. Vyzkoušel jsem použití ATmega32 s knihovnami pro Arduino v prostředí Atmel Studio 6.2. Přitom jsem narazil na chybu, která způsobí špatné nastavení registru UBBRH pro USART a tím (mimo jiné) i špatnou rychlost přenosu.

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__)
Odpovědět

Zpět na „Miniaturní počítače (Arduino, Raspberry a další)“