Страница 1 из 1
разъясните про UBRRL,UBRRH и UCSRC:[ursel]
Добавлено: Пт дек 26, 2008 15:06:34
Alexeus
mega8
что то невкурю с даташита как эта связка работает...
1) в частности, если я пишу в UCSRC 7й бит и активирую ursel, то нужно прописывать бодрэйт в UBRRL,UBRRH? или уже не нужно...
2) в UBRR 15бит- это снова ursel, если я уже записал "1" в UCSRC[ursel], то как быть с UBRR[ursel]?
3) UBRR(H,L)-это 12 бит. как туда записать битрэйт?
ЗЫ: есть в даташите таблица для fosc = 2.0000 MHz, и бодр. 4800 -> в UBRR должно быть записано "25" при этом ошибки 0,2% что это, куда... без 100гр не разберешься

Re: разъясните про UBRRL,UBRRH и UCSRC:[ursel]
Добавлено: Пт дек 26, 2008 16:08:15
smac
Alexeus писал(а):mega8
что то невкурю с даташита как эта связка работает...
1) в частности, если я пишу в UCSRC 7й бит и активирую ursel, то нужно прописывать бодрэйт в UBRRL,UBRRH? или уже не нужно...
2) в UBRR 15бит- это снова ursel, если я уже записал "1" в UCSRC[ursel], то как быть с UBRR[ursel]?
3) UBRR(H,L)-это 12 бит. как туда записать битрэйт?
ЗЫ: есть в даташите таблица для fosc = 2.0000 MHz, и бодр. 4800 -> в UBRR должно быть записано "25" при этом ошибки 0,2% что это, куда... без 100гр не разберешься

Все просто, когда хотите записать данные в UCSRC всегда устанавливайте 7 бит в числе (или переменной) которую пишете в UCSRC
если хотите записать в UBRRH то следите за тем, чтобы в записываемых данных бит 7 был равен 0. Если вы хотите записать что то в UBRR (тут речь идет о С) то нужно следить за тем, чтобы в записываемых данных (константе или переменной) бит 15 был равен 0.
П. С. Нумерация бит естественно с 0.
Добавлено: Пт дек 26, 2008 19:50:32
Alexeus
ну а как в UBRRL, UBRRH прописать бодрэйт? если хочу 9600кбс при кварце 8мГц это 8000000/(9600*16)-1=51,08 получается, ну округляем до 51. -это 0х33 (hex) и куда его теперь вносить, в UBRRL или в UBRRH ???
Добавлено: Пт дек 26, 2008 22:34:50
smac
Alexeus писал(а):ну а как в UBRRL, UBRRH прописать бодрэйт? если хочу 9600кбс при кварце 8мГц это 8000000/(9600*16)-1=51,08 получается, ну округляем до 51. -это 0х33 (hex) и куда его теперь вносить, в UBRRL или в UBRRH ???
В вашем случае, поскольку число не превышает 1 байта, то вносить его нужно в UBRRL. В общем случае установка BaudRate зависит от того на чем вы пишете (в смысле синтаксиса).
Если на С то не заморачивайтесь, пишите
UBRR=YOUBAUDRATE&0x0fff (в вашем случае UBRR=51) и все. Пояснение: оператором &0x0fff мы устанавливаем бит URSEL в 0, а также отсекаем лишние 3 старших бита, поскольку UBRR - 12-ти битный
Если на асм, то немного больше возни, но тоже ничего страшного
например так
Код: Выделить всё
ldi r16, low(YOUBAUDRATE)
ldi r17, high(YOUBAUDRATE&0x0f)
UBRRH, r17
out
UBRRL, r16
out
Примечание:YOUBAUDRATE - число рассчитанное по формуле, приведенной в даташите, в вашем случае равно 51
Re: разъясните про UBRRL,UBRRH и UCSRC:[ursel]
Добавлено: Вт ноя 15, 2011 08:15:29
KamomeDono
Доброго времени суток.
Переделываю проект с atmega32 на atmega128.
Возникла проблема с регистрами UCSR1C и URSEL, которого в новом мк просто нет.
Помогите пожалуйста переписать код для нового мк.
Пока вот что получилось (проблема со строчкой URSEL):
//**************************************************
//UART0 initialize
//baud rate: 19200 (for controller clock = 8MHz)
//char size: 8 bit
//parity: Disabled
//**************************************************
void uart0_init(void)
{
UCSR1B = 0x00; //disable while setting baud rate
UCSR1A = 0x00;
UCSR1C = (1 << URSEL) | 0x06;
UBRR1L = 0x19; //set baud rate lo
UBRR1H = 0x00; //set baud rate hi
UCSR1B = 0x18;
}
Re: разъясните про UBRRL,UBRRH и UCSRC:[ursel]
Добавлено: Вт ноя 15, 2011 08:29:05
Мастер Ломастер
вы обратили внимание, что все регистры в вашем МК имеют индексы 0 ил 1? UDR1 или UDR0 например? это ведь потому, что модулей USART в вашем МК два. поэтому URSEL, которого нет, на самом деле или URSEL0 или URSEL1 - смотря по номеру модуля

очень полезно заглядывать в даташит время от времени.
Re: разъясните про UBRRL,UBRRH и UCSRC:[ursel]
Добавлено: Вт ноя 15, 2011 08:43:13
KamomeDono
В файле atmega128_bits.h нет ursel0 или ursel1.
Просто нет 8-го бита в регистре UCSR0C.
Или имени его нет, а он есть.
Программа не компилируется и выдаёт ошибку. От руки что ли его туда вписать?
Re: разъясните про UBRRL,UBRRH и UCSRC:[ursel]
Добавлено: Вт ноя 15, 2011 09:54:45
Мастер Ломастер
KamomeDono писал(а):В файле atmega128_bits.h нет ursel0 или ursel1.
Просто нет 8-го бита в регистре UCSR0C.
Или имени его нет, а он есть.
Программа не компилируется и выдаёт ошибку. От руки что ли его туда вписать?
ну, во-первых, я понятия не имею, откуда вы взяли ваш файл atmega128_bits.h - можно ли ему доверять?
во-вторых, бит UMSEL1 и UMSEL0 не восьмой, а седьмой по счету в этом регистре (или, раз уж мы программисты, то 6-й).
в-третьих, если хотите - опишите его самостоятельно #define UMSEL1 6 но вообще говоря, что-то у вас в консерватории не так...
Re: разъясните про UBRRL,UBRRH и UCSRC:[ursel]
Добавлено: Вт ноя 15, 2011 12:31:59
KamomeDono
Не UMSEL, а URSEL.
Первый то на месте.
В том то и дело. Библиотека с CVAVR.
Пришлось дописать вручную. В ДШ вроде как есть он, но почему то без имени.
Теперь другая проблема, говорит в ассемблерном файле двойные метки. Интересно с чем это связано?
Re: разъясните про UBRRL,UBRRH и UCSRC:[ursel]
Добавлено: Вт ноя 15, 2011 12:36:39
Мастер Ломастер
а... извините, недоглядел. URSEL действительно не существует в atmega128, так что паника на корабле отменяется.
Re: разъясните про UBRRL,UBRRH и UCSRC:[ursel]
Добавлено: Вт ноя 15, 2011 12:50:24
KamomeDono
Ну и как мне мой код тогда переписать, что делает строка: UCSR0C = (1 << URSEL) | 0x06;?
Re: разъясните про UBRRL,UBRRH и UCSRC:[ursel]
Добавлено: Вт ноя 15, 2011 12:53:48
Мастер Ломастер
KamomeDono писал(а):Ну и как мне мой код тогда переписать, что делает строка: UCSR0C = (1 << URSEL) | 0x06;?
а никак не переписывать, можно эту строчку удалить вообще - регистр и без этого установится после сброса в точно такое состояние, как вы его пытаетесь установить. читайте даташит.
Re: разъясните про UBRRL,UBRRH и UCSRC:[ursel]
Добавлено: Вт ноя 15, 2011 13:55:07
KamomeDono
Благодарю! Всё скомпилировалось!
Будем отлаживать
