nvk 0 21 ноября, 2011 Опубликовано 21 ноября, 2011 (изменено) · Жалоба Добрый день! Пытаюсь с контроллера отправить на терминал компьютера фразу "Hello world!", но ничего не получается. Переходник TTL-RS232 проверял перемычкой на TX и RX - символы нормально приходят на терминал. Скорость - 9600, частота кварца - 8МГц. Вот исходный код программы: #include <avr/io.h> #include <util/delay.h> void USART_Transmit(char *data) { /* Wait for empty transmit buffer */ while (!( UCSRA & (1<<UDRE))); /* Put data into buffer, sends the data */ int i,s; s = strlen(data); for(i=0;i<s;i++) UDR = data; } void main(void) { int i; /* Set baud rate */ UBRRH = (unsigned char)(51>>8); UBRRL = (unsigned char)51; /* Enable receiver and transmitter */ UCSRB = (1<<RXEN)|(1<<TXEN); /* Set frame format: 8data, 1stop bit */ UCSRC = (1<<URSEL)|(3<<UCSZ0); //Десять раз пытаемся отправить фразу for(i=1;i<11;i++) { USART_Transmit("HELLO, WORLD!"); _delay_ms(100); } } Заранее спасибо за помощь! Изменено 21 ноября, 2011 пользователем nvk Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Палыч 10 21 ноября, 2011 Опубликовано 21 ноября, 2011 · Жалоба Хорошо бы указывать: чем вы это компилировали... Определите: в какой памяти хранится ваша строка "HELLO, WORLD!"; как к ней получить доступ; как с ней работают библиотечные процедуры (типа strlen)... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
nvk 0 21 ноября, 2011 Опубликовано 21 ноября, 2011 · Жалоба Хорошо бы указывать: чем вы это компилировали... Определите: в какой памяти хранится ваша строка "HELLO, WORLD!"; как к ней получить доступ; как с ней работают библиотечные процедуры (типа strlen)... Работаю в среде CodeBlocks, компилятор GNU AVR GCC. Строка хранится во флэш-памяти программ. Пробовал даже писать так: UDR = 'a'; Ничего не помогает, никаких символов в терминале нет. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
GenaSPB 11 21 ноября, 2011 Опубликовано 21 ноября, 2011 (изменено) · Жалоба Строка хранится в RAM. Доступ к ней делается правильно. Готовность надо проверять перед передачей каждого символа. Попробуйте творчески использовать кусок инициализации сгенерированный codewizard: // USART initialization // Communication Parameters: 8 Data, 1 Stop, No Parity // USART Receiver: On // USART Transmitter: On // USART Mode: Asynchronous // USART Baud Rate: 9600 UCSRA=0x00; UCSRB=0x18; UCSRC=0x86; UBRRH=0x00; UBRRL=0x33; Изменено 21 ноября, 2011 пользователем Genadi Zawidowski Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
hd44780 0 21 ноября, 2011 Опубликовано 21 ноября, 2011 (изменено) · Жалоба 1. Что у Вас в роли конвертера TTL-RS232? MAX232? 2. Какого рода COM-порт в компе? Интегрированный в мать, PCI карта, т.н. "USB переходник"? По моему опыту интегрированные наиболее стабильны (мои "поделки" с MAX232 всегда работали). С 2-мя имеющимися у меня PCI картами на чипах Moschip были сплошные глюки - в обе стороны всегда шёл откровенный мусор и бред. Кстати, мой старый APC UPS тоже в упор отказывался работать на Moschip порте. Но древнейший Dial-up модем US Robotics работает там идеально. Я не разбирался с данным приколом, хотя мне кажется, что м.б. глюки потому, что MAX232 даёт +-10в вместо +-12. USB переходники лично не пользовал, не знаю. Хотя читал немало нареканий на них со стороны владельцев ноутбуков. Короче, если можете, проверьте на интегрированном порте. 3. Проверьте в доке контроллера отклонение от требуемой скорости. Д.б. 0.2-0.3%. 2.x% у меня никогда не работало. Типа скорость 115200 на "целочисленных" кварцах 4, 8, 12, 16 MHz невыполнимая задача - большое отклонение, надо ставить кристалл с дробными MHz. Изменено 21 ноября, 2011 пользователем hd44780 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
nvk 0 21 ноября, 2011 Опубликовано 21 ноября, 2011 · Жалоба 1. Что у Вас в роли конвертера TTL-RS232? MAX232? 2. Какого рода COM-порт в компе? Интегрированный в мать, PCI карта, т.н. "USB переходник"? По моему опыту интегрированные наиболее стабильны (мои "поделки" с MAX232 всегда работали). С 2-мя имеющимися у меня PCI картами на чипах Moschip были сплошные глюки - в обе стороны всегда шёл откровенный мусор и бред. Кстати, мой старый APC UPS тоже в упор отказывался работать на Moschip порте. Но древнейший Dial-up модем US Robotics работает там идеально. Я не разбирался с данным приколом, хотя мне кажется, что м.б. глюки потому, что MAX232 даёт +-10в вместо +-12. USB переходники лично не пользовал, не знаю. Хотя читал немало нареканий на них со стороны владельцев ноутбуков. Короче, если можете, проверьте на интегрированном порте. 3. Проверьте в доке контроллера отклонение от требуемой скорости. Д.б. 0.2-0.3%. 2.x% у меня никогда не работало. Типа скорость 115200 на "целочисленных" кварцах 4, 8, 12, 16 MHz невыполнимая задача - большое отклонение, надо ставить кристалл с дробными MHz. 1. МАХ232. 2. У меня ноутбук с PCMCIA-картой ST-LAB 191. Нареканий на неё нет. Прекрасно работает в терминале с GSM-модулем SIM300. 3. Ошибка на скорости 9600 всего 0,2%. Хотя бы должны приходить какие-нибудь кракозябры. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
hd44780 0 21 ноября, 2011 Опубликовано 21 ноября, 2011 (изменено) · Жалоба 1. МАХ232. 2. У меня ноутбук с PCMCIA-картой ST-LAB 191. Нареканий на неё нет. Прекрасно работает в терминале с GSM-модулем SIM300. 3. Ошибка на скорости 9600 всего 0,2%. Хотя бы должны приходить какие-нибудь кракозябры. Нормально вроде ... Соедините Rx-Tx у MAX232 (на стороне RS232, можно даже на том конце кабеля, который в комп втыкается. Заодно и кабель сам проверите) и проверьте в контроллере - будете ли принимать то же, что и послали. Может сама MAX232 кривая или чего-то где-то недопаяли. Изменено 21 ноября, 2011 пользователем hd44780 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Палыч 10 21 ноября, 2011 Опубликовано 21 ноября, 2011 · Жалоба 3. Ошибка на скорости 9600 всего 0,2%. Хотя бы должны приходить какие-нибудь кракозябры.Должны... Если fuses действительно установлены на внешний кварц 8 МГц. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
navovvol 0 21 ноября, 2011 Опубликовано 21 ноября, 2011 · Жалоба 3. Проверьте в доке контроллера отклонение от требуемой скорости. Д.б. 0.2-0.3%. 2.x% у меня никогда не работало. Типа скорость 115200 на "целочисленных" кварцах 4, 8, 12, 16 MHz невыполнимая задача - большое отклонение, надо ставить кристалл с дробными MHz. Ерунда. нормально работал при 16 MHz на скорости 115200 при погрешности 2.1%. Ошибок нет. Правда это RS485. Поменяйте провода местами Rx Tx всегда помагает. ))) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
hd44780 0 21 ноября, 2011 Опубликовано 21 ноября, 2011 · Жалоба Да, и проверьте ещё распайку кабеля. На порте нога 2 - RxD - RS232 выход на MAX232, нога 3 - TxD - RS232 вход на MAX. Если на устройстве такой же разъём как на компе, то в кабеле д.б. т.н. "крест" 2-3, 3-2. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
navovvol 0 21 ноября, 2011 Опубликовано 21 ноября, 2011 · Жалоба Ерунда. нормально работал при 16 MHz на скорости 115200 при погрешности 2.1%. Ошибок нет. Правда это RS485. Поменяйте провода местами Rx Tx всегда помагает. ))) /* Set frame format: 8data, 1stop bit */ UCSRC = (1<<URSEL)|(3<<UCSZ0); Почему URSEL = 1 ? Почему синхронных режим связи ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
hd44780 0 21 ноября, 2011 Опубликовано 21 ноября, 2011 (изменено) · Жалоба Ерунда. нормально работал при 16 MHz на скорости 115200 при погрешности 2.1%. Ошибок нет. Правда это RS485. У меня на комповый порт не работало никогда ... Поменяйте провода местами Rx Tx всегда помагает. ))) Это верно /* Set frame format: 8data, 1stop bit */ UCSRC = (1<<URSEL)|(3<<UCSZ0); Почему URSEL = 1 ? Почему синхронных режим связи ? Синхронный режим - UMSEL.... А вообще в посте 4 дан нормальный код инициализации ... Изменено 21 ноября, 2011 пользователем hd44780 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
navovvol 0 21 ноября, 2011 Опубликовано 21 ноября, 2011 · Жалоба Синхронный режим - UMSEL.... А ну да точно. Моя не прав Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
nvk 0 21 ноября, 2011 Опубликовано 21 ноября, 2011 (изменено) · Жалоба Должны... Если fuses действительно установлены на внешний кварц 8 МГц. Установлен внешний кварц: CKOPT=0, CKSEL3=CKSEL2=CKSEL1=1. Строка хранится в RAM. Доступ к ней делается правильно. Готовность надо проверять перед передачей каждого символа. Переписал программу: /* */ #include <avr/io.h> #include <util/delay.h> void USART_Transmit(char *data) { int i,s; s = strlen(data); for(i=0;i<s;i++) { /* Wait for empty transmit buffer */ while (!( UCSRA & (1<<UDRE))); /* Put data into buffer, sends the data */ UDR = data; } } void main(void) { int i; UBRRH = 0x0; UBRRL = 0x33; UCSRC = 0x86; UCSRA = 0x0; UCSRB = 0x19; for(i=1;i<11;i++) { USART_Transmit("HELLO, WORLD!"); _delay_ms(100); } } Светодиод TX на конверторе моргает, но на гипертерминал ничего не выводится. Изменено 21 ноября, 2011 пользователем nvk Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
hd44780 0 21 ноября, 2011 Опубликовано 21 ноября, 2011 · Жалоба Светодиод TX на конверторе моргает, но на гипертерминал ничего не выводится. А в гипертеминале вы не забыли отключить всякие "фенечки" типа управления потоком? Проверьте всё-таки на интегрированном порте обычного компа. Чем xxx не шутит ... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться