Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: UART на Mega8A не работает? или?
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
Batman
Стандартная программа передачи по асинхронному UART
Инициализирую:
Цитата
void USART_init(void)
{
int temp;

temp = baud_r;

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


UCSRB = (1<<RXEN) | (1<<RXCIE);
UCSRA = (1<<U2X);

UCSRC = (1<<URSEL)|(0<<USBS)|(1<<UCSZ1)|(1<<UCSZ0);

}

и принимаю по прерыванию:
Цитата
ISR (SIG_UART_RECV)
{
control=UDR;

if (control!=100) PORTD=0;

switch (control)
{

Так вот контроллер в прерывание не заходит (sei включено), прерывание от АЦП работает. Фишка в том, что в предыдущем устройстве, где используется mega 8L (без A) все это работало... У кого было что-нить подобное... Как правило по опыту, кривые руки вероятнее чудес, к сожалению. Где копать-то? biggrin.gif
ведущий_специалист
у меня другая проблема возникла. Порт не захватывает состояние из 1 в 0. Видимо в регистрах что то намутили. В том же устройстве м8l работает прекрасно. Уарт вроде норм живет....Проверю досканальней.
Batman
glare.gif Странно.... а у меня захватывает нормально, специально проверил, думал может нога внутри отвалилась... считывал ногу и передавал на другую... со светодиодом. Поморгал. Все ок. Атмел решил, упаковать по "сюрплизу насяльнику" в каждый МК что-ли?
Xenia
Проверьте без стоп-бита (уберите USBS бит).
Так все равно должно работать, даже если этот бит есть во входной посылке.
А то бывают случаи, когда прошивку делают с лишним стоп-битом, а потом садятся за комп, на котором этот стоп-бит не установлен - вот и не выходит у них прием.

Потом еще baud_r проверьте - помните , что у вас включено удвоение (установлен U2X)! А то забыв про это, устанавливают на компе скорость baud_r бод, а потом плачут, что не работает.
Batman
Скорость не причем... Он не заходит в прерывание вообще... не видит старт бит... mad.gif
Xenia
Цитата(Batman @ Sep 26 2010, 00:23) *
Скорость не причем... Он не заходит в прерывание вообще... не видит старт бит... mad.gif

А разве по старт-биту происходит прерывание? Прерывание должно происходить по концу посылки.
_Pasha
Стесняюсь спросить: а как у Вас с лог. уровнями и фронтами?
Batman
Xenia Да, верно. Я имел ввиду, что прерывание не происходит даже если проводком замкнуть rxd на землю. Он по окончании должен войти в прерывание и установить флаги ошибок.
Pasha Если вопрос об уровне напряжения 0-1 и крутизне... Тогда в норме.
Здесь нет вопроса о корректном или не корректном приеме. Такое чувство, что УАРТА вообще нет

Ведущий_специалист, попробуйте с УАРТОМ, отпишитесь rolleyes.gif
Batman
не, неправильно ноги у него работают. Хотел сделать программный уарт, ничего не получается. Не видит он перехода из 1 в 0. Из 0 в 1 видит

Это не работает:
Цитата
uin2 = (PIND & (1<<PD0))>>PD0;
if (uin2==0) tst1;
else tst0;

Это работает
Цитата
uin2 = (PIND & (1<<PD0))>>PD0;
if (uin2==1) tst1;
else tst0;


tst - это светодиод вкл/выкл

компилятор винавр... может он...
SasaVitebsk
А причём здесь ноги?!!!! Вы соображаете что пишете?
Сами хоть подумайте!
Что значит "Не видит он перехода из 1 в 0. Из 0 в 1 видит"???

Процу вообще до лампочки. Вы просто читаете порт. Там либо 0 либо 1. Что значит в вашем понимании "переход"? Если "он видит" переход из 0 в 1 (читай вы видите - то есть вы видите и нули и единицы), то обратный переход вы также обязаны видеть.
alexeyv
to Batman
1. А каким образом управляется PD0 ??
2. поконкретнее что такое tst0 & tst1 ? макросы ?
3. зачем нужна uin2 ? Не проще так :
Код
if ((PIND & _BV(PD0)) tst1;
   else tst0;


Lisitsin
С флагами прерывания приёмника и передатчика надо поиграть. Одновременно приёмник и передатчик что-то глючат, но стоит лишний раз флаги сбросить - начинает работать.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.