|
HELP! MEGA16 UART, как правильно инициализировать UART? |
|
|
|
Jul 9 2009, 18:04
|
Участник

Группа: Участник
Сообщений: 67
Регистрация: 30-11-07
Пользователь №: 32 846

|
Столкнулся с проблемой - не получается инициализировать UART в МЕГЕ16. Причина: не получается запрограммировать регистр UCSRC, который отвечает за кол-во бит в пакете. Как известно, данный регистр по адресу (0х20(0х40)) совпадает с регистром UBRRH, а выбор того или иного осуществляется записью в бит URSEL определенного значения. Не получается запрограммировать ни тот, ни другой. Требуется РАБОТАЮЩИЙ кусок кода на С для инициализации UART. Код C Code Example #define FOSC 1843200// Clock Speed #define BAUD 9600 #define MYUBRR FOSC/16/BAUD-1 void main( void ) { :. USART_Init ( MYUBRR ); :. } void USART_Init( unsigned int ubrr) { /* Set baud rate */ UBRRH = (unsigned char)(ubrr>>8); UBRRL = (unsigned char)ubrr; /* Enable receiver and transmitter */ UCSRB = (1<<RXEN)|(1<<TXEN); /* Set frame format: 8data, 2stop bit */ UCSRC = (1<<URSEL)|(1<<USBS)|(3<<UCSZ0); } - это не заработало (пример из doc8154.pdf, стр 153)
|
|
|
|
|
 |
Ответов
|
Jul 9 2009, 21:00
|

Местный
  
Группа: Участник
Сообщений: 403
Регистрация: 14-05-07
Из: Россия, г.Пенза
Пользователь №: 27 719

|
Блин ! Чем дальше в лес, тем больше дров ! Это интересно !
По порядку... Подключил старую отладочную плату. ATmega16 через COM1 JTAG ICE , через COM2 - терминал. Все работает и туда и оттуда ! Настройки только вот эти:
/* Инициализация UART при 9600 Bd, tx/rx, 8N1.*/ void uart_init(void) { #if F_CPU > 2000000UL && defined(U2X) UCSRA = _BV(U2X); /* improve baud rate error by using 2x clk */ UBRRL = (F_CPU / (8UL * UART_BAUD)) - 1; #else UBRRL = (F_CPU / (16UL * UART_BAUD)) - 1; #endif UCSRB = _BV(TXEN) | _BV(RXEN); /* tx/rx enable */ } Т.е UCSRC я не трогаю... это видно и в отладке через JTAG ! :
UBRRH 0x00 0 0 0 0 0 0 0 0 UBRRL 0x5F 0 1 0 1 1 1 1 1 UCSRA 0x62 0 1 1 0 0 0 1 0 UCSRB 0x18 0 0 0 1 1 0 0 0 UCSRC 0x00 0 0 0 0 0 0 0 0 UDR 0x00 0 0 0 0 0 0 0 0
Как видите UCSRC пуст и как пишет наш топикстартер в режиме USART должно быть 5 битов данных ! Но у меня все корректно работает ! И принимает и передает ! Т.е. модуль работает в режиме UART... Так, что-же, если я сейчас изменю бит, и загоню его в синхронный режим, то он станет USART-ом и перестанет работать корректно ? Тогда вопрос такой: Как наш коллега умудрился увидеть 5 бит данных, если у него передатчик работает в асинхронном режиме и может передавать только или 8 бит или 9 бит ? Глюк ? Или у меня в голове глюк ? JTAG ICE четко показывает состояние регистров ...
--------------------
" Многие вещи нам непонятны не потому, что наши понятия слабы; но потому, что сии вещи не входят в круг наших понятий." (с) К.Прутков.
|
|
|
|
|
Jul 9 2009, 21:47
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
Цитата(manul78 @ Jul 10 2009, 00:00)  Как видите UCSRC пуст Как мы видим, в бите URSEL ноль, значит вы прочитали UBRRH: Цитата The read access is controlled by a timed sequence. Reading the I/O location once returns the UBRRH Register contents. If the register location was read in previous system clock cycle, reading the register in the current clock cycle will return the UCSRC contents. Note that the timed sequence for reading the UCSRC is an atomic operation. Interrupts must therefore be controlled (for example by disabling interrupts globally) during the read operation. Цитата • Bit 7 – URSEL: Register Select This bit selects between accessing the UCSRC or the UBRRH Register. It is read as one when reading UCSRC. The URSEL must be one when writing the UCSRC. Читайте даташиты... Цитата(pimen @ Jul 9 2009, 21:49)  отладка проводилась как в AVRStudio, так и в IAR на JTAGICE и JTAGICE mkII (родном) Студия некорректно отбражает этот регистр - читайе описание ее багов в хелпе. Смею предположить, что и JTAGICE и JTAGICE mkII при отображении в окнах регистров также отображают UCSRC неправильно, ибо читает его как и все остальные регистры - однократным чтением.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Jul 9 2009, 22:18
|

Местный
  
Группа: Участник
Сообщений: 403
Регистрация: 14-05-07
Из: Россия, г.Пенза
Пользователь №: 27 719

|
Цитата(Сергей Борщ @ Jul 10 2009, 01:47)  Читайте даташиты...
Студия некорректно отбражает этот регистр - читайе описание ее багов в хелпе. Смею предположить, что и JTAGICE и JTAGICE mkII при отображении в окнах регистров также отображают UCSRC неправильно, ибо читает его как и все остальные регистры - однократным чтением. Даташиты мы исправно читаем...  Хотелось верить, что все предусмотрено в JTAG-ах... У меня другой вопрос: Я правильно рассуждаю ? Если в разряде UMSEL (режим работы) регистра UCSRC стоит ноль, то модуль работает в режиме UART и берет размер слова из регистра UCSRB CHR9=0 это 8 разрядов CHR=1 это 9 разрядов... Если в разряде UMSEL (режим работы) регистра UCSRC стоит 1 , то модуль работает в режиме USART и берет размер слова из регистра UCSRC разрядов UCSZ0, UCSZ1 и UCSRB разряда CHR9...
--------------------
" Многие вещи нам непонятны не потому, что наши понятия слабы; но потому, что сии вещи не входят в круг наших понятий." (с) К.Прутков.
|
|
|
|
Сообщений в этой теме
pimen HELP! MEGA16 UART Jul 9 2009, 18:04 manul78 Цитата(pimen @ Jul 9 2009, 22:04) Столкну... Jul 9 2009, 18:10 pimen Цитата(manul78 @ Jul 9 2009, 22:10) Пожал... Jul 9 2009, 18:20  mempfis_ Цитатаээээ, спасибо конечно, но требуется код с ин... Jul 9 2009, 18:44   pimen Цитата(mempfis_ @ Jul 9 2009, 22:44) Ну д... Jul 9 2009, 18:49    mempfis_ Цитата(pimen @ Jul 9 2009, 21:49) это я у... Jul 9 2009, 18:57     pimen Цитата(mempfis_ @ Jul 9 2009, 22:57) А ко... Jul 9 2009, 19:11      mempfis_ Нашёл в одном работающем проекте код инициализации... Jul 9 2009, 19:31  manul78 Цитата(pimen @ Jul 9 2009, 22:20) ээээ, с... Jul 9 2009, 18:55   mempfis_ Цитата(manul78 @ Jul 10 2009, 01:18) Если... Jul 10 2009, 05:41    manul78 Цитата(mempfis_ @ Jul 10 2009, 09:41) Раз... Jul 10 2009, 07:56     Палыч Цитата(manul78 @ Jul 10 2009, 10:56) Блин... Jul 10 2009, 08:32      manul78 Цитата(Палыч @ Jul 10 2009, 12:32) Вот, и... Jul 10 2009, 12:28       Палыч Цитата(manul78 @ Jul 10 2009, 15:28) Инте... Jul 10 2009, 13:03       Сергей Борщ Цитата(manul78 @ Jul 10 2009, 15:28) Пото... Jul 10 2009, 13:08        manul78 Цитата(Сергей Борщ @ Jul 10 2009, 17:08) ... Jul 14 2009, 09:56 TechMike Вот работающий код, mega16+кварц 8мгц, avr studio+... Jul 10 2009, 07:39 pimen Цитата19.5 USART Initialization
...
The following ... Jul 13 2009, 19:43
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|