реклама на сайте
подробности

 
 
> HELP! MEGA16 UART, как правильно инициализировать UART?
pimen
сообщение Jul 9 2009, 18:04
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 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)
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
manul78
сообщение Jul 9 2009, 21:00
Сообщение #2


Местный
***

Группа: Участник
Сообщений: 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 четко показывает состояние регистров ...


--------------------
" Многие вещи нам непонятны не потому, что наши понятия слабы; но потому, что сии вещи не входят в круг наших понятий." (с) К.Прутков.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jul 9 2009, 21:47
Сообщение #3


Гуру
******

Группа: Модераторы
Сообщений: 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)
Go to the top of the page
 
+Quote Post
manul78
сообщение Jul 9 2009, 22:18
Сообщение #4


Местный
***

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



Цитата(Сергей Борщ @ Jul 10 2009, 01:47) *
Читайте даташиты...

Студия некорректно отбражает этот регистр - читайе описание ее багов в хелпе. Смею предположить, что и JTAGICE и JTAGICE mkII при отображении в окнах регистров также отображают UCSRC неправильно, ибо читает его как и все остальные регистры - однократным чтением.


Даташиты мы исправно читаем... biggrin.gif Хотелось верить, что все предусмотрено в JTAG-ах...

У меня другой вопрос: Я правильно рассуждаю ?

Если в разряде UMSEL (режим работы) регистра UCSRC стоит ноль, то модуль работает в режиме UART и
берет размер слова из регистра UCSRB CHR9=0 это 8 разрядов CHR=1 это 9 разрядов...

Если в разряде UMSEL (режим работы) регистра UCSRC стоит 1 , то модуль работает в режиме USART и
берет размер слова из регистра UCSRC разрядов UCSZ0, UCSZ1 и UCSRB разряда CHR9...


--------------------
" Многие вещи нам непонятны не потому, что наши понятия слабы; но потому, что сии вещи не входят в круг наших понятий." (с) К.Прутков.
Go to the top of the page
 
+Quote Post
Палыч
сообщение Jul 10 2009, 05:34
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954



Цитата(manul78 @ Jul 10 2009, 01:18) *
Даташиты мы исправно читаем... Я правильно рассуждаю ?
Как в DS написано - так оно и работает! Про бит CHR9 в DS упоминается всего один раз и то - в сравнении USART с UART AVR. Забудте про такой бит! Бит UMSEL - это всего лишь переключение между режимами: синхронный - асинхронный (грубо говоря: определяет - есть ли между устройствами кроме проводов Rx и Tx ещё один провод XCK).
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- 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


Closed TopicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 23rd July 2025 - 02:55
Рейтинг@Mail.ru


Страница сгенерированна за 0.01428 секунд с 7
ELECTRONIX ©2004-2016