USART на Atmega8535 работает странно

Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
Закрыто
123kill12
Родился
Сообщения: 16
Зарегистрирован: Пт апр 16, 2010 23:20:56

USART на Atmega8535 работает странно

Сообщение 123kill12 »

подключил генератор на 4M. по расчету для скорости на 9600 нужно 25 в константу. но когда смотрю на выходе передачика 8 бит данных передается на 50 мс. и при настройке на компе приемника на 160 принемает данные.

подключил генератор на 8M. изменил константу на 12 и скорость на 320 тоже все идет норм.

void USART_INIT( void ){
UBRRL = 25;
UBRRH = 0;
UCSRB |= RXEN;
UCSRB |= TXEN;
UCSRB |= TXCIE;
UCSRB |= RXCIE;
UCSRC = 0x06;
UCSRC |= URSEL;}

void send_UART(void){
while (!( UCSRA & UDRE));
UDR=0x0F;}

void main(void)
{ USART_INIT();
while(1){send_UART(); }}
Реклама
andre_ksd
Встал на лапы
Сообщения: 129
Зарегистрирован: Вс апр 11, 2010 11:53:02

Re: USART на Atmega8535 работает странно

Сообщение andre_ksd »

Пункт 1.

Ничего, что у тебя в UBBRH 0x06?..
Делитель получается 16 * (256 * 6 + 25 + 1) = 24992, 4 МГц / 24992 = 160.05 бит/с.

Регистр UCSRC и UBBRH имеют общий адрес.
Чтение с этого адреса всегда приводит к чтению UBBRH.
Запись в этот адрес значения(!) с URSEL = 1, приводит к записи в UCSRC, а с URSEL = 0 к записи в UBBRH.
Там дешифрация по старшему биту.

Замени:

UCSRC = 0x06; - запись 0x06 в UBRRH
UCSRC |= URSEL;

на:

UCSRC = URSEL | 0x06;

Это не УСАПП странно работает, а разработчик. :)

Пункт 2.

Вообще не ясно, зачем так инициализацию делать:

UCSRB |= RXEN;
UCSRB |= TXEN;
UCSRB |= TXCIE;
UCSRB |= RXCIE;

логичней:

UCSRB = RXEN | TXEN | TXCIE | RXCIE;

Это не УСАПП странно работает, а снова разработчик. :)

Пункт 3.

Неверно:

UCSRB = RXEN | TXEN | TXCIE | RXCIE;

Верно:

UCSRB = (1 << RXEN) | (1 << TXEN) | (1 << TXCIE) | (1 << RXCIE);

RXEN, TXEN, ... - номера(!) бит, а не готовые маски.

Это не УСАПП странно работает, и снова разработчик. :)

Пункт 4.

Есть такая штука - симуляторы...
Реклама
123kill12
Родился
Сообщения: 16
Зарегистрирован: Пт апр 16, 2010 23:20:56

Re: USART на Atmega8535 работает странно

Сообщение 123kill12 »

спс. это мой первый опыт с мегой.

RXEN, TXEN, ... - я хидер переписал чтоб можно было как маски использовать, так как привык писать на IAR под 51 кристал.
симулятор я как раз юзал - Proteus 7.6 SP0. и там он работает как надо.
andre_ksd
Встал на лапы
Сообщения: 129
Зарегистрирован: Вс апр 11, 2010 11:53:02

Re: USART на Atmega8535 работает странно

Сообщение andre_ksd »

RXEN, TXEN, ... - я хидер переписал чтоб можно было как маски использовать, так как привык писать на IAR под 51 кристал.
Ох, зря ты заголовочные файлы переписываешь... :)
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
simpleX
Первый раз сказал Мяу!
Сообщения: 39
Зарегистрирован: Сб май 30, 2009 00:51:42
Откуда: Россия, г. Курск
Контактная информация:

Re: USART на Atmega8535 работает странно

Сообщение simpleX »

123kill12 писал(а):спс. это мой первый опыт с мегой.

RXEN, TXEN, ... - я хидер переписал чтоб можно было как маски использовать, так как привык писать на IAR под 51 кристал.
симулятор я как раз юзал - Proteus 7.6 SP0. и там он работает как надо.
В протеусе у меги есть такая бодяга как Configure Diagnostics, которая (при настройке) покажет параметры UART по мере их задания в программе, например, ту же скорость. Незаменима при отладке

P.S. Челябинские программисты настолько суровы, что вместо исправлений своих исходников правят хидеры от разработчика =)
"Никогда не опускайся чего б тебе ни стоило, как бы ни было плохо.
А если отступил и сдал немного, то, считай, душа продалась и сдохла!
Честь и кровь - сохрани свою совесть, свобода и любовь - вот она русская гордость"
Реклама
Закрыто

Вернуться в «Микроконтроллеры и ПЛИС»