Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: ATMEGA32 инициализация USART
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > MCS51, AVR, PIC, STM8, 8bit
lisstret
Помогите разобраться с инициализацией USART'а.

Вообщем проблема при записи или доступе к регистрам UBRRH и UCSRC. Для доступа к первому нужно сбрасывать бит URSEL и для доступа ко второму устанавливать. А получается что когда я использую строчку UCSRC=(1<<URSEL)|(3<<UCSZ0)|(2<<UPM0); у меня все равно идет запись в два регистра.

Код
void init_uart(void)
{    
   UBRRH = UBRRH_VALUE;
   UBRRL = UBRRL_VALUE;
   #if USE_2X
   UCSRA |= (1 << U2X);
   #else
   UCSRA &= ~(1 << U2X);
   #endif
   UCSRB=(1<<RXEN)|(1<<TXEN);
   UCSRC=(1<<URSEL)|(3<<UCSZ0)|(2<<UPM0);
}


UBRRH_VALUE и UBRRL_VALUE считал при помощи макросов в составе пакета. Использую компилятор avr-toolchain-3.0.0.240 и avrstudio4 соответственно.

Также пытался сделать тип такого, но результат остался прежним:

Код
void init_uart(void)
{    
   UBRRH = UBRRH_VALUE;
   UBRRL = UBRRL_VALUE;
   #if USE_2X
   UCSRA |= (1 << U2X);
   #else
   UCSRA &= ~(1 << U2X);
   #endif
   UCSRB=(1<<RXEN)|(1<<TXEN);
   UCSRC=(1<<URSEL);
   UCSRC=(3<<UCSZ0)|(2<<UPM0);
}


В прикрепленных файлах скриншоты при работе с симулятором и сам проект. Заранее спасибо.
M_Andrey
Попробуйте команды местами поменять:
Код
void init_uart(void)
{    
UBRRH = UBRRH_VALUE;
UBRRL = UBRRL_VALUE;
UCSRC=(1<<URSEL)|(3<<UCSZ0)|(2<<UPM0);
#if USE_2X
UCSRA |= (1 << U2X);
#else
UCSRA &= ~(1 << U2X);
#endif
UCSRB=(1<<RXEN)|(1<<TXEN);
}
SysRq
Цитата(lisstret @ Mar 5 2011, 04:40) *
Помогите разобраться с инициализацией USART'а.

Вообщем проблема при записи или доступе к регистрам UBRRH и UCSRC.
//...
Использую компилятор avr-toolchain-3.0.0.240 и avrstudio4 соответственно.

Пользуйтесь поиском по форуму. Это задокументированное ATMEL ошибочное поведение AVRStudio 4:
Цитата
The USART's UBRRH and UCSRC registers share the same I/O address. Writing to one of the registers will cause both registers to contain the new value, regardless of the value of URSEL.

demiurg_spb
Как Вам уже советовали, так точно должно в UCSRC записаться:
Код
UCSRC=(1<<URSEL)|(3<<UCSZ0)|(2<<UPM0);
И студия действительно эту ситуацию неправильно отрабатывает.
lisstret
Цитата
Пользуйтесь поиском по форуму. Это задокументированное ATMEL ошибочное поведение AVRStudio 4:


Название документика не подскажете?

Цитата
И студия действительно эту ситуацию неправильно отрабатывает


Т.е. я так понял в симуляторе эт такой глюк, а в самом контроллере все нормально работает? Надо с JTAG'oм попробывать отладить. Просто когда в телнет посылал строку Hello World отображался только один символ черви, так что я думал все из за скорости. Походу мож скосячил в самой настройке телнета.
Палыч
Цитата(lisstret @ Mar 9 2011, 13:22) *
Название документика не подскажете?
AVR Studio -> Menu -> Help -> AVR Studio User Guide -> Simulator -> Simulator known issues
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.