подключил генератор на 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(); }}
USART на Atmega8535 работает странно
- Реклама
Re: USART на Atmega8535 работает странно
Пункт 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.
Есть такая штука - симуляторы...
Ничего, что у тебя в 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 работает странно
спс. это мой первый опыт с мегой.
RXEN, TXEN, ... - я хидер переписал чтоб можно было как маски использовать, так как привык писать на IAR под 51 кристал.
симулятор я как раз юзал - Proteus 7.6 SP0. и там он работает как надо.
RXEN, TXEN, ... - я хидер переписал чтоб можно было как маски использовать, так как привык писать на IAR под 51 кристал.
симулятор я как раз юзал - Proteus 7.6 SP0. и там он работает как надо.
Re: USART на Atmega8535 работает странно
Ох, зря ты заголовочные файлы переписываешь...RXEN, TXEN, ... - я хидер переписал чтоб можно было как маски использовать, так как привык писать на IAR под 51 кристал.
- simpleX
- Первый раз сказал Мяу!
- Сообщения: 39
- Зарегистрирован: Сб май 30, 2009 00:51:42
- Откуда: Россия, г. Курск
- Контактная информация:
Re: USART на Atmega8535 работает странно
В протеусе у меги есть такая бодяга как Configure Diagnostics, которая (при настройке) покажет параметры UART по мере их задания в программе, например, ту же скорость. Незаменима при отладке123kill12 писал(а):спс. это мой первый опыт с мегой.
RXEN, TXEN, ... - я хидер переписал чтоб можно было как маски использовать, так как привык писать на IAR под 51 кристал.
симулятор я как раз юзал - Proteus 7.6 SP0. и там он работает как надо.
P.S. Челябинские программисты настолько суровы, что вместо исправлений своих исходников правят хидеры от разработчика =)
"Никогда не опускайся чего б тебе ни стоило, как бы ни было плохо.
А если отступил и сдал немного, то, считай, душа продалась и сдохла!
Честь и кровь - сохрани свою совесть, свобода и любовь - вот она русская гордость"
А если отступил и сдал немного, то, считай, душа продалась и сдохла!
Честь и кровь - сохрани свою совесть, свобода и любовь - вот она русская гордость"
- Реклама

