|
|
  |
USART, чудеса |
|
|
|
Jan 24 2009, 11:50
|
Местный
  
Группа: Участник
Сообщений: 421
Регистрация: 2-01-08
Пользователь №: 33 778

|
Написал недавно простенький код для работа с USART, почти копия примеров doc2486.pdf. Все конечно заработало, но на следующий день, запускаю программу со стороны ПК - ответа МК (ATmega8) нет. Плата и подключение не трогались. Беру другую прошивку (в стабильности работы которой я ещё сомневался, там используются прерывания и FIFO), со второй попытки она работает. Возвращаю предыдущую прошивку, теперь работает и она, что это? и так уже 4 дня. Один раз ещё помогло вот это  $ 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; }
|
|
|
|
|
Jan 24 2009, 15:46
|
Местный
  
Группа: Участник
Сообщений: 421
Регистрация: 2-01-08
Пользователь №: 33 778

|
Цитата(_Pasha @ Jan 24 2009, 17:57)  *)После передачи И зачем? мне момент завершения передачи не интересен.
|
|
|
|
|
Jan 24 2009, 19:57
|
Местный
  
Группа: Участник
Сообщений: 421
Регистрация: 2-01-08
Пользователь №: 33 778

|
Цитата Чем Вам символические имена не нравятся? Да я бы не сказал, что не нравятся, мне безразлично, могу и на символические имена перейти. Цитата А как насчет электрической стороны 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 выводе МК наблюдается среднее значение (между нулём и питанием) во время непрерывной посылки случайных значений.
|
|
|
|
|
Jan 26 2009, 09:51
|
Местный
  
Группа: Участник
Сообщений: 421
Регистрация: 2-01-08
Пользователь №: 33 778

|
Цитата А источник тактирования меги какой? Кварц, 10МГц, делитель для USART - 10, то есть скорость - 113636 bps, со стороны PC - 115200 bps, раньше всегда работало.
|
|
|
|
|
Jan 26 2009, 11:01
|

Профессионал
    
Группа: Свой
Сообщений: 1 292
Регистрация: 26-06-07
Пользователь №: 28 718

|
ошибка большая. поставьте 7.3728, 11.0592, 14.7456 Цитата раньше всегда работало не аргумент. подобное часто случается если не соблюдаешь правил(имею в виду все работало, а теперь нет... просто повезло) для проверки попробуйте сверхнизкие скорости для уменьшения ошибки скорости
|
|
|
|
|
Jan 26 2009, 11:31
|

Местный
  
Группа: Свой
Сообщений: 370
Регистрация: 7-11-06
Пользователь №: 22 035

|
Цитата(amaora @ Jan 26 2009, 12:51)  Кварц, 10МГц, делитель для USART - 10, то есть скорость - 113636 bps, со стороны PC - 115200 bps, раньше всегда работало. Писишка терпит(могу ошибаться, давно читал) до 10% разницу в скоростях, а вот со стороны меги всё намного хуже. Вот у вас и получается, что нет ответа от меги. Можете ради интереса посмотреть биты ошибок в UART меги, наверняка какой-нибудь frame error взводится.
|
|
|
|
|
Jan 27 2009, 13:27
|
Местный
  
Группа: Участник
Сообщений: 421
Регистрация: 2-01-08
Пользователь №: 33 778

|
Поставил 12.0 МГц (таких хороших как перечислено выше у меня нет), скорость теперь 115384 bps. frame error действительно взводится, сразу же после инициализации проверяю, и флаг иногда оказывается установленным, пощёлкаю питанием - нет флага. На это ещё как то влияет подключение SPI к LPT, если отключить то frame error не взводится. Может это от того, что питание 4.5в (от USB, через два разветвителя), а на LPT 5.0в, и подключение напрямую, без резисторов?
|
|
|
|
|
  |
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0
|
|
|