Технический форум по робототехнике.
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 ] использовать!
=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: А еще у нас принято обозначать город
так сказать правила хорошего тона
Duhas » 29 дек 2008, 14:17
у меня был подобный трабл... вопщем решилось все порядком записи регистров.... хотя в даташите пишут что выбор зависит от одного бита... если я ничего не путаю...
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
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
работает нормально, а если наоборот - то увы...
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. Проблем не замечно было
Duhas » 29 дек 2008, 14:46
хз, есть вероятность что версия АВР студии у мну глючная.... ибо встречались и другие странности...
blindman » 29 дек 2008, 14:49
Так табл только в том, что в студии не то показывает? Да и фиг с ней. Главное что в железе работает нормально. А при симуляции ставим брэйкпоинт непосредственно перед записью в регистр, убеждаемся что пишем туда то что надо - и забываем.
Duhas » 29 дек 2008, 16:05
хз... дебагал в студии.... в железо лил уже то что пашет в студии... хотя с 11 и более битным режимом работы таймера1 непонятно.. в меге32... вроде ни в студии ни в железе не хатит пахать...