Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: USART
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > MCS51, AVR, PIC, STM8, 8bit
amaora
Написал недавно простенький код для работа с USART, почти копия примеров doc2486.pdf. Все конечно заработало, но на следующий день, запускаю программу со стороны ПК - ответа МК (ATmega8) нет. Плата и подключение не трогались. Беру другую прошивку (в стабильности работы которой я ещё сомневался, там используются прерывания и FIFO), со второй попытки она работает. Возвращаю предыдущую прошивку, теперь работает и она, что это? и так уже 4 дня. Один раз ещё помогло вот это wink.gif
$ cat /dev/urandom > /dev/ttyS0
$ make reset (reset через LPT)

код,
CODE

void uart_open( uint8_t scale )
{
UBRRH = 0;
UBRRL = scale;
UCSRA = (1<<1);
UCSRB = (1<<4) | (1<<3);
UCSRC = (1<<7) | (1<<2) | (1<<1);

DDRD |= (1<<1);
DDRD &= ~(1<<0);
PORTD |= (1<0);
}

void uart_send( uint8_t data )
{
while ( ( UCSRA & (1<<5) ) == 0 ) ;
UDR = data;
}

uint8_t uart_recv()
{
while ( ( UCSRA & (1<<7) ) == 0 ) ;
return UDR;
}
_Pasha
Да вы что, сговорились все бит TXC не чистить после приема ?! 
amaora
А какое он имеет отношение к приёму?
_Pasha
Цитата(amaora @ Jan 24 2009, 17:48) *
А какое он имеет отношение к приёму?

*)После передачи
amaora
Цитата(_Pasha @ Jan 24 2009, 17:57) *
*)После передачи

И зачем? мне момент завершения передачи не интересен.
_Pasha
Вот не пишИте так:
Код
UCSRB = (1<<4) | (1<<3);
 UCSRC = (1<<7) | (1<<2) | (1<<1);


Чем Вам символические имена не нравятся? Мало того, что нечитабельно, лично я обос**лся с этим ТХС...А как насчет электрической стороны rs232? Может у Вас опторазвязка, фронты не годятся?
amaora
Цитата
Чем Вам символические имена не нравятся?

Да я бы не сказал, что не нравятся, мне безразлично, могу и на символические имена перейти.

Цитата
А как насчет электрической стороны rs232? Может у Вас опторазвязка, фронты не годятся?

MAX232 там.

CODE

...
val = uart_recv();

switch ( val )
{
case 0x00:
break;

case 0x11:
LED( 1, ON );
break;

case 0x12:
LED( 1, OFF );
break;
...


Если слать в порт 0x11 - светодиод не включается, если 'cat /dev/urandom' то иногда включается. Доходит ли оно посмотреть не чем, могу сказать только, что на RXD выводе МК наблюдается среднее значение (между нулём и питанием) во время непрерывной посылки случайных значений.
xelax
А источник тактирования меги какой? Не знаю как в 8-х мегах, а в 128-х если работаешь от внутреннего RC генератора, то пока его не откалибруешь контроллер с писишкой общался через раз.
amaora
Цитата
А источник тактирования меги какой?

Кварц, 10МГц, делитель для USART - 10, то есть скорость - 113636 bps, со стороны PC - 115200 bps, раньше всегда работало.
smalcom
ошибка большая. поставьте 7.3728, 11.0592, 14.7456

Цитата
раньше всегда работало

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

для проверки попробуйте сверхнизкие скорости для уменьшения ошибки скорости
_Pasha
Цитата(smalcom @ Jan 26 2009, 14:01) *
 7.3728, 11.0592, 14.7456

+ 9.216 - такие тоже есть. Выбирайте!
xelax
Цитата(amaora @ Jan 26 2009, 12:51) *
Кварц, 10МГц, делитель для USART - 10, то есть скорость - 113636 bps, со стороны PC - 115200 bps, раньше всегда работало.


Писишка терпит(могу ошибаться, давно читал) до 10% разницу в скоростях, а вот со стороны меги всё намного хуже.
Вот у вас и получается, что нет ответа от меги. Можете ради интереса посмотреть биты ошибок в UART меги, наверняка какой-нибудь frame error взводится.
_Pasha
Цитата(xelax @ Jan 26 2009, 14:31) *
 Можете ради интереса ...

Есть средство - длинный стоп-бит и отказ от непрерывной передачи. Т.е. пауза где-то в пол-посылки облагородит ситуацию
amaora
Поставил 12.0 МГц (таких хороших как перечислено выше у меня нет), скорость теперь 115384 bps. frame error действительно взводится, сразу же после инициализации проверяю, и флаг иногда оказывается установленным, пощёлкаю питанием - нет флага. На это ещё как то влияет подключение SPI к LPT, если отключить то frame error не взводится. Может это от того, что питание 4.5в (от USB, через два разветвителя), а на LPT 5.0в, и подключение напрямую, без резисторов?
_Pasha
Цитата(amaora @ Jan 27 2009, 16:27) *
подключение SPI к LPT, если отключить то frame error не взводится.


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