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

 
 
> WinAVR USART помогите
LoLo
сообщение Dec 26 2008, 08:07
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 40
Регистрация: 22-12-08
Пользователь №: 42 664



При инициализации USART, а именно запись в регистр UCSRC,
одновременно изменяет свое значение и регистр UBRRH.

Это видно в симуляторе (DEBUG) AVRStudio.

Вот инфа из ПДФ контроллера:

/* Set baud rate */
UBRRH = (unsigned char)(baud>>8);
UBRRL = (unsigned char)baud;
/* Enable receiver and transmitter */
UCSRB = (1<<RXEN)|(1<<TXEN);
/* Set frame format: 8data, 2stop bit */
UCSRC = (1<<URSEL)|(1<<USBS)|(3<<UCSZ0);

После выполнения последней строчки UBRRH Становится равным UCSRC.
Почему???
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
_Pasha
сообщение Dec 26 2008, 08:15
Сообщение #2


;
******

Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509



Цитата(LoLo @ Dec 26 2008, 12:07) *
После выполнения последней строчки UBRRH Становится равным UCSRC.
Почему???

Avrstudio известна некорректной симуляцией этих регистров. Лично наступал на эти грабли.
Смотрите листинг, если там все нормально, то на студию можно плюнуть. smile.gif
Go to the top of the page
 
+Quote Post
LoLo
сообщение Dec 26 2008, 08:50
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 40
Регистрация: 22-12-08
Пользователь №: 42 664



Цитата(_Pasha @ Dec 26 2008, 11:15) *
Avrstudio известна некорректной симуляцией этих регистров. Лично наступал на эти грабли.
Смотрите листинг, если там все нормально, то на студию можно плюнуть. smile.gif


ПОЧЕМУ-ТО ВСЕ РАВНО НЕ ШЛЕТ.
Вот мои функции:
Код
void UARTCreate(void)  
{
  bit_clear(DDRD, 0);
  bit_set(DDRD, 1);
  UBRRL = 77; // скорость 9600. кварц 20000000
  UCSRB = 0xD8;//11011000 разрешены прерывания при приеме и при посылке
  UCSRC =  0x86;//10000110 1 стоп бит, 8бит данных
}

void UARTOutByte(unsigned char Value)
{
  UDR = Value;
  TxReady = 0;
  do
  {
  }
  while (TxReady == 0);
}

ISR(USART_TX_vect)
{
    TxReady = 1;
}


В main просто процедура
UARTOutByte(0xAA)

Что не так?

P.S. Точнее шлет, не пойми что!!!

От модератора.
Сообщение отредактировано. Пожалуйста, пользуйтесь тегами code и codebox, для оформления исходных текстов.
Go to the top of the page
 
+Quote Post
chief_olimp
сообщение Dec 26 2008, 09:13
Сообщение #4


Местный
***

Группа: Участник
Сообщений: 249
Регистрация: 31-10-05
Из: Украина Нетешин
Пользователь №: 10 344



у меня так
Код
void USART_init(void)
{
    UBRR0H = 0;
    UBRR0L = 17;        // Set baud rate
    UCSR0B = (1<<RXCIE0) | (1<<RXEN0) | (1<<TXEN0);
    UCSR0C = (1<<URSEL0) | (1<<UCSZ01) | (1<<UCSZ00);
}
void USART0_TX(char *s)
{
    while (*s)
    {
    while ( !( UCSR0A & (1<<UDRE0)));
    UDR0 = *s++;
    }
}

USART0_TX("\xAA");


Сообщение отредактировал chief_olimp - Dec 26 2008, 09:13
Go to the top of the page
 
+Quote Post



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

 


RSS Текстовая версия Сейчас: 19th July 2025 - 19:29
Рейтинг@Mail.ru


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