Страница 1 из 1

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

Добавлено: Сб апр 17, 2010 00:01:49
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(); }}

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

Добавлено: Сб апр 17, 2010 01:39:57
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.

Есть такая штука - симуляторы...

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

Добавлено: Сб апр 17, 2010 12:44:20
123kill12
спс. это мой первый опыт с мегой.

RXEN, TXEN, ... - я хидер переписал чтоб можно было как маски использовать, так как привык писать на IAR под 51 кристал.
симулятор я как раз юзал - Proteus 7.6 SP0. и там он работает как надо.

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

Добавлено: Сб апр 17, 2010 18:11:56
andre_ksd
RXEN, TXEN, ... - я хидер переписал чтоб можно было как маски использовать, так как привык писать на IAR под 51 кристал.
Ох, зря ты заголовочные файлы переписываешь... :)

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

Добавлено: Ср май 05, 2010 19:57:02
simpleX
123kill12 писал(а):спс. это мой первый опыт с мегой.

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

P.S. Челябинские программисты настолько суровы, что вместо исправлений своих исходников правят хидеры от разработчика =)