Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: WinAVR USART помогите
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > MCS51, AVR, PIC, STM8, 8bit
LoLo
При инициализации 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.
Почему???
_Pasha
Цитата(LoLo @ Dec 26 2008, 12:07) *
После выполнения последней строчки UBRRH Становится равным UCSRC.
Почему???

Avrstudio известна некорректной симуляцией этих регистров. Лично наступал на эти грабли.
Смотрите листинг, если там все нормально, то на студию можно плюнуть. smile.gif
chief_olimp
ну так вроде все правильно. попробуйте просимулировать PROTEUS или VMlab.
Из даташита "When the function writes to the UCSRC Register, the URSEL bit (MSB) must be set due to the sharing of I/O location by UBRRH and UCSRC."

http://perevod.i.ua/
demiurg_spb
Цитата(_Pasha @ Dec 26 2008, 11:15) *
Avrstudio известна некорректной симуляцией этих регистров. Лично наступал на эти грабли.
Смотрите листинг, если там все нормально, то на студию можно плюнуть. smile.gif
Подтверждаю сказанное. Сей трабл проявляется даже на кристаллах без бита URSEL
LoLo
Цитата(_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, для оформления исходных текстов.
chief_olimp
у меня так
Код
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");
shuks
Аналогичная ситуация и у меня: при изменении одного регистра, AVR Studio показывает изменение другого, и наоборот. НО только лишь ПОКАЗЫВАЕТ, реального изменения состояния нет. Просто глюк такой и надо с ним смириться)

Кину пример небольшой программки. Она производит АЦП и пересылает байт результата оцифровки по UART. Прога отлажена на реальном стенде, так что всё работает.

CODE
.include "m16def.inc"
.org $000 rjmp start
.org $018 rjmp trans
.org $01c rjmp adccomp
.org $030

trans:
out UDR,r28
reti

adccomp:
in r27,ADCL
out portb,r27
in r28,ADCH
out portc,r28
reti

start:
ldi r31,LOW(RAMEND)
out spl,r31
ldi r31,HIGH(RAMEND)
out sph,r31

sei

ldi r27,0b11111111
out ddrb, r27

ldi r27,0b11111111
out ddrc, r27

ldi r28,0b11101111
out ADCSRA,r28

ldi r28,0b00100000
out ADMUX,r28

ldi r28,95
out UBRRL,r28

ldi r28,0b00101000
out UCSRB,r28

ldi r28,0b10000110
out UCSRC,r28

Loop:
rjmp Loop


На порты В и С выводится результат АЦП для наглядности при симуляции в AVR Studio или Протеусе.
SysRq
Цитата(LoLo @ Dec 26 2008, 11:50) *
UBRRL = 77; // скорость 9600. кварц 20000000
//..
P.S. Точнее шлет, не пойми что!!!

Мнээ.. собстно, если формула расчета baudrate обычная (baudrate = f_osc/(16*(UBRR + 1))), то тут не 9600, а что-то в районе 16к. Принимающая сторона с режимом 9600-8-N-1 будет принимать, но всякую хрень.

PS: TxReady должна быть volatile.
LoLo
Цитата(SysRq @ Dec 27 2008, 00:50) *
Мнээ.. собстно, если формула расчета baudrate обычная (baudrate = f_osc/(16*(UBRR + 1))), то тут не 9600, а что-то в районе 16к. Принимающая сторона с режимом 9600-8-N-1 будет принимать, но всякую хрень.

PS: TxReady должна быть volatile.



Перепутал. Кварц 12000000
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.