Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: atmega8 usart
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
Kirill Trusov
Здраствуйте, я делал устройство чтобы оно с уарта брало символы и в дисплей их загоняло на тини2313
и дернул меня черт переделать его на мегу8

написал, включил не работает уарт....

использую винавр от 2007 25 мая вроде и студию тоже вроде последнию...
включаю симуляция и вижу что инициализация неверная
Код
void USART_init(void)
{
  cli();
  UCSRB = (1<<RXEN)|(1<<RXCIE);
  UCSRC = 0b10000110;
  UBRRH = 0x00;
  UBRRL = (unsigned char)47;
  sei();
}


а именно, ккогда в ucsrc а записываю значение, он его же записывае и в ubrrh
а когда я обнуляю ubrrh он обнуляет и контрольный регистр Ц.....

бред какойто ........
help.gif
vesago
В некоторых аврах кое-какие регистры уарта совмещены. В соответствующем регистре надо выставить или сбросить битик при доступе к нужному регистру. Внимательно сравните описание уарта 2313 и м8. В частности бит URSEL UCSRC. Я так понимаю после его выставления работа идет с UCSRC. У вас он выставляется. Попробуйте инициализировать скорость перед инициализацией контрольного регистра.
=AVR=
Из-за того, что при проектировании Меги8 не хватило одного адресочка, регистры UBRRH и UCSRC живут по одному и тому же адресу, и в какой из них будет проведена запись - определяется старшим (7) битом в этом адресе - URSEL. Когда он в 0 - запись идет в UCSRC, когда в 1 - в UBRRH. Для чтения UCSRC надо читать этот адрес дважды подряд при выключенных прерываниях. Кури даташыт, все разжевано в разделе USART
vesago
Вот примерчик инициализации
Код
void USART_Init( unsigned int baudrate )
{
  unsigned char x;

  UBRRH = (unsigned char) (baudrate>>8);
  UBRRL = (unsigned char) baudrate;

  UCSRA = (1 << U2X);
  /* Enable UART receiver and transmitter */
  UCSRB = ( ( 1 << RXCIE ) | ( 1 << RXEN ) | ( 1 << TXEN ) | ( 1 << TXCIE ));

  /* Set frame format: 8 data 2stop */
  UCSRC = (1<<URSEL)|(1<<USBS)|(1<<UCSZ1)|(1<<UCSZ0);

  /* Flush receive buffer */
  x = 0;

  USART_RxTail = x;
  USART_RxHead = x;
  USART_TxTail = x;
  USART_TxHead = x;
}


зы тоже как-то накололся - писал для m168, m128 - проблем не было. Потом вствил драйвер в код для m16 - перестало работать. Что только не делал - даже макс232 перепаял. Потом, когда уже когда ничего не оставалось, заглянул в даташит. Воистину "Если ты всё перепробовал, и ничего не получается, прочти, наконец, инструкцию. (Вольное переложение закона Мерфи)"
Kirill Trusov
спасибо, страница 150 , читал , сюда нписал не сразу , сначала как раз в даташитах и лазил, короче менять пробовал. и и так и сяк
и
и по 2 раза и по 1
vesago
А в железке? Может я не прав, но имхо в данном случае некорректность отображения в симуляторе студии не показатель.
Kirill Trusov
вот и весь программе....

короче студия неверно показывает , я записал программу в камень, включил и заработало , т.е просто в студии неправельно пашет ну и протеус тоже неверно работает, у меня он ии с 2313 неверно работал


спасибо за помощь
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.