WinAVR USART помогите

Программирование микроконтроллеров AVR, PIC, ARM.
Разработка и изготовление печатных плат для модулей.

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 ] использовать!
LoLo
 
Сообщения: 5
Зарегистрирован: 22 дек 2008, 16:28

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: А еще у нас принято обозначать город :) так сказать правила хорошего тона :)
Проект [[Open Robotics]] - Универсальные модули для построения роботов
Аватара пользователя
=DeaD=
 
Сообщения: 24218
Зарегистрирован: 06 окт 2004, 18:01
Откуда: Ебург
прог. языки: C++ / PHP / 1C
ФИО: Антон Ботов

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

Сообщение Duhas » 29 дек 2008, 14:17

у меня был подобный трабл... вопщем решилось все порядком записи регистров.... хотя в даташите пишут что выбор зависит от одного бита... если я ничего не путаю...
«Как сердцу выразить себя? … Мысль изреченная есть ложь!»
В этом мире меня подводит доброта и порядочность...
"двое смотрят в лужу, один видит лужу, другой отраженные в ней звезды"
Аватара пользователя
Duhas
 
Сообщения: 6338
Зарегистрирован: 15 сен 2007, 13:03
Откуда: Красноярск
прог. языки: ASM(МК), C(PC)
ФИО: Гагарский Андрей Александрович

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
Проект [[Open Robotics]] - универсальные модули для построения роботов
Модули Open Robotics можно приобрести в магазине shop.roboforum.ru

Day OFF? You must be pulling my leg! Stop making humor before someone sees you, fool!

Аватара пользователя
blindman
 
Сообщения: 4130
Зарегистрирован: 29 апр 2008, 21:15
Откуда: Хабаровск
прог. языки: C,C++,Assembler,PHP,Javascript,Ruby, SPIN,Java(?)
ФИО: Андрей Юрьевич

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

работает нормально, а если наоборот - то увы...
«Как сердцу выразить себя? … Мысль изреченная есть ложь!»
В этом мире меня подводит доброта и порядочность...
"двое смотрят в лужу, один видит лужу, другой отраженные в ней звезды"
Аватара пользователя
Duhas
 
Сообщения: 6338
Зарегистрирован: 15 сен 2007, 13:03
Откуда: Красноярск
прог. языки: ASM(МК), C(PC)
ФИО: Гагарский Андрей Александрович

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. Проблем не замечно было
Проект [[Open Robotics]] - универсальные модули для построения роботов
Модули Open Robotics можно приобрести в магазине shop.roboforum.ru

Day OFF? You must be pulling my leg! Stop making humor before someone sees you, fool!

Аватара пользователя
blindman
 
Сообщения: 4130
Зарегистрирован: 29 апр 2008, 21:15
Откуда: Хабаровск
прог. языки: C,C++,Assembler,PHP,Javascript,Ruby, SPIN,Java(?)
ФИО: Андрей Юрьевич

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

Сообщение Duhas » 29 дек 2008, 14:46

хз, есть вероятность что версия АВР студии у мну глючная.... ибо встречались и другие странности...
«Как сердцу выразить себя? … Мысль изреченная есть ложь!»
В этом мире меня подводит доброта и порядочность...
"двое смотрят в лужу, один видит лужу, другой отраженные в ней звезды"
Аватара пользователя
Duhas
 
Сообщения: 6338
Зарегистрирован: 15 сен 2007, 13:03
Откуда: Красноярск
прог. языки: ASM(МК), C(PC)
ФИО: Гагарский Андрей Александрович

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

Сообщение blindman » 29 дек 2008, 14:49

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

Day OFF? You must be pulling my leg! Stop making humor before someone sees you, fool!

Аватара пользователя
blindman
 
Сообщения: 4130
Зарегистрирован: 29 апр 2008, 21:15
Откуда: Хабаровск
прог. языки: C,C++,Assembler,PHP,Javascript,Ruby, SPIN,Java(?)
ФИО: Андрей Юрьевич

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

Сообщение Duhas » 29 дек 2008, 16:05

хз... дебагал в студии.... в железо лил уже то что пашет в студии... хотя с 11 и более битным режимом работы таймера1 непонятно.. в меге32... вроде ни в студии ни в железе не хатит пахать...
«Как сердцу выразить себя? … Мысль изреченная есть ложь!»
В этом мире меня подводит доброта и порядочность...
"двое смотрят в лужу, один видит лужу, другой отраженные в ней звезды"
Аватара пользователя
Duhas
 
Сообщения: 6338
Зарегистрирован: 15 сен 2007, 13:03
Откуда: Красноярск
прог. языки: ASM(МК), C(PC)
ФИО: Гагарский Андрей Александрович


Вернуться в Микроконтроллеры

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 8