roboforum.ru

Технический форум по робототехнике.

WinAVR USART помогите

WinAVR USART помогите

LoLo » 26 дек 2008, 12:11

При инициализации 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.
Почему???

Модератор "Digit":При оформлении листингов программ следует тег [ CODE ] использовать!

Re: WinAVR USART помогите

=DeaD= » 26 дек 2008, 12:23

Даташит читали?

Accessing UBRRH/ UCSRC Registers писал(а):The UBRRH Register shares the same I/O location as the UCSRC Register. Therefore some
special consideration must be taken when accessing this I/O location.

When doing a write access of this I/O location, the high bit of the value written, the USART Register
Select (URSEL) bit, controls which one of the two registers that will be written. If URSEL is
zero during a write operation, the UBRRH value will be updated. If URSEL is one, the UCSRC
setting will be updated


Есть такое ощущение, что симулятор при выводе тоже выводит из 1 адреса значения и всё. раз оно по 1 адресу.
А реально может как раз всё хорошо работает.

Добавлено спустя 29 секунд:
PS: А еще у нас принято обозначать город :) так сказать правила хорошего тона :)

Re: WinAVR USART помогите

Duhas » 29 дек 2008, 14:17

у меня был подобный трабл... вопщем решилось все порядком записи регистров.... хотя в даташите пишут что выбор зависит от одного бита... если я ничего не путаю...

Re: WinAVR USART помогите

blindman » 29 дек 2008, 14:30

Читайте внимательней даташит. Выбор регистра, в который будет производиться запись осуществляется битом URSEL. При чтении, сначала читается UBRRH. Если в следующем цикле прочитать тот же регистр еще раз, будет прочитано содержимое UCSRC. Причем во время чтения должны быть запрещены прерывания.

Код: Выделить всёРазвернуть
in R24, UBRRH
; в R24 содержимое UBRRH

Код: Выделить всёРазвернуть
in R24, UBRRH
nop
in R24, UCSRC
; в R24 содержимое UBRRH

Код: Выделить всёРазвернуть
cli
in R24, UBRRH
in R24, UCSRC
sei
; в R24 содержимое UCSRC

Код: Выделить всёРазвернуть
in R24, UBRRH
; здесь произошло прерывание
in R24, UCSRC
; в R24 содержимое UBRRH

Re: WinAVR USART помогите

Duhas » 29 дек 2008, 14:36

даташит читал... и у нас тут запись имеет место быть... и запись вот в таком порядке
Код: Выделить всёРазвернуть
   ldi      tmp1,   191
   out      UBRRL,   tmp1
   ldi      tmp1,   0
   out      UBRRH,   tmp1
   ldi      tmp1,   0b00001000
   out      UCSRB,   tmp1
   ldi      tmp1,   0b10000110
   out      UCSRC,   tmp1

работает нормально, а если наоборот - то увы...

Re: WinAVR USART помогите

blindman » 29 дек 2008, 14:44

Код: Выделить всёРазвернуть
void init_uart(uint16_t ubrr)
{
    UCSRB = _BV(TXEN) |_BV(RXEN) | _BV(UDRIE) | _BV(RXCIE);
    UCSRC = UCSC_MASK;
    UBRRH = ubrr >> 8;
    UBRRL = ubrr & 0xFF;
}/*}}}*/

транслируется вот в это
Код: Выделить всёРазвернуть
void init_uart(uint16_t ubrr)
{
    UCSRB = _BV(TXEN) |_BV(RXEN) | _BV(UDRIE) | _BV(RXCIE);
  3a:   28 eb           ldi r18, 0xB8   ; 184
  3c:   2a b9           out 0x0a, r18   ; 10
    UCSRC = UCSC_MASK;
  3e:   24 e4           ldi r18, 0x44   ; 68
  40:   20 bd           out 0x20, r18   ; 32
    UBRRH = ubrr >> 8;
  42:   29 2f           mov r18, r25
  44:   33 27           eor r19, r19
  46:   20 bd           out 0x20, r18   ; 32
    UBRRL = ubrr & 0xFF;
  48:   89 b9           out 0x09, r24   ; 9
  4a:   08 95           ret
}

То есть пишу как раз UCSRC сначала, потом UBRRH. Проблем не замечно было

Re: WinAVR USART помогите

Duhas » 29 дек 2008, 14:46

хз, есть вероятность что версия АВР студии у мну глючная.... ибо встречались и другие странности...

Re: WinAVR USART помогите

blindman » 29 дек 2008, 14:49

Так табл только в том, что в студии не то показывает? Да и фиг с ней. Главное что в железе работает нормально. А при симуляции ставим брэйкпоинт непосредственно перед записью в регистр, убеждаемся что пишем туда то что надо - и забываем.

Re: WinAVR USART помогите

Duhas » 29 дек 2008, 16:05

хз... дебагал в студии.... в железо лил уже то что пашет в студии... хотя с 11 и более битным режимом работы таймера1 непонятно.. в меге32... вроде ни в студии ни в железе не хатит пахать...


Rambler\'s Top100 Mail.ru counter