|
Atmega32+UART |
|
|
|
Nov 21 2011, 09:35
|
Участник

Группа: Участник
Сообщений: 50
Регистрация: 22-07-11
Пользователь №: 66 352

|
Добрый день!
Пытаюсь с контроллера отправить на терминал компьютера фразу "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[i]; }
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); } }
Заранее спасибо за помощь!
Сообщение отредактировал nvk - Nov 21 2011, 09:36
|
|
|
|
|
Nov 21 2011, 09:54
|
Участник

Группа: Участник
Сообщений: 50
Регистрация: 22-07-11
Пользователь №: 66 352

|
Цитата(Палыч @ Nov 21 2011, 16:47)  Хорошо бы указывать: чем вы это компилировали...
Определите: в какой памяти хранится ваша строка "HELLO, WORLD!"; как к ней получить доступ; как с ней работают библиотечные процедуры (типа strlen)... Работаю в среде CodeBlocks, компилятор GNU AVR GCC. Строка хранится во флэш-памяти программ. Пробовал даже писать так: UDR = 'a'; Ничего не помогает, никаких символов в терминале нет.
|
|
|
|
|
Nov 21 2011, 10:09
|

Профессионал
    
Группа: Участник
Сообщений: 1 620
Регистрация: 22-06-07
Из: Санкт-Петербург, Россия
Пользователь №: 28 634

|
Строка хранится в 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;
Сообщение отредактировал Genadi Zawidowski - Nov 21 2011, 10:12
|
|
|
|
|
Nov 21 2011, 10:14
|

Профессионал
    
Группа: Свой
Сообщений: 1 202
Регистрация: 26-08-05
Из: Донецк, ДНР
Пользователь №: 7 980

|
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.
Сообщение отредактировал hd44780 - Nov 21 2011, 10:23
--------------------
Чтобы возить такого пассажира, необходим лимузин другого класса. (с) Мария Эдуарда
|
|
|
|
|
Nov 21 2011, 10:33
|
Участник

Группа: Участник
Сообщений: 50
Регистрация: 22-07-11
Пользователь №: 66 352

|
Цитата(hd44780 @ Nov 21 2011, 17:14)  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%. Хотя бы должны приходить какие-нибудь кракозябры.
|
|
|
|
|
Nov 21 2011, 10:51
|

Профессионал
    
Группа: Свой
Сообщений: 1 202
Регистрация: 26-08-05
Из: Донецк, ДНР
Пользователь №: 7 980

|
Цитата(nvk @ Nov 21 2011, 13:33)  1. МАХ232. 2. У меня ноутбук с PCMCIA-картой ST-LAB 191. Нареканий на неё нет. Прекрасно работает в терминале с GSM-модулем SIM300. 3. Ошибка на скорости 9600 всего 0,2%. Хотя бы должны приходить какие-нибудь кракозябры. Нормально вроде ... Соедините Rx-Tx у MAX232 (на стороне RS232, можно даже на том конце кабеля, который в комп втыкается. Заодно и кабель сам проверите) и проверьте в контроллере - будете ли принимать то же, что и послали. Может сама MAX232 кривая или чего-то где-то недопаяли.
Сообщение отредактировал hd44780 - Nov 21 2011, 10:54
--------------------
Чтобы возить такого пассажира, необходим лимузин другого класса. (с) Мария Эдуарда
|
|
|
|
|
Nov 21 2011, 11:01
|
Частый гость
 
Группа: Участник
Сообщений: 105
Регистрация: 9-09-11
Пользователь №: 67 080

|
Цитата(hd44780 @ Nov 21 2011, 13:14)  3. Проверьте в доке контроллера отклонение от требуемой скорости. Д.б. 0.2-0.3%. 2.x% у меня никогда не работало. Типа скорость 115200 на "целочисленных" кварцах 4, 8, 12, 16 MHz невыполнимая задача - большое отклонение, надо ставить кристалл с дробными MHz. Ерунда. нормально работал при 16 MHz на скорости 115200 при погрешности 2.1%. Ошибок нет. Правда это RS485. Поменяйте провода местами Rx Tx всегда помагает. )))
|
|
|
|
|
Nov 21 2011, 11:04
|
Частый гость
 
Группа: Участник
Сообщений: 105
Регистрация: 9-09-11
Пользователь №: 67 080

|
Цитата(Navovvol @ Nov 21 2011, 14:01)  Ерунда. нормально работал при 16 MHz на скорости 115200 при погрешности 2.1%. Ошибок нет. Правда это RS485.
Поменяйте провода местами Rx Tx всегда помагает. ))) Код /* Set frame format: 8data, 1stop bit */ UCSRC = (1<<URSEL)|(3<<UCSZ0); Почему URSEL = 1 ? Почему синхронных режим связи ?
|
|
|
|
|
Nov 21 2011, 11:09
|

Профессионал
    
Группа: Свой
Сообщений: 1 202
Регистрация: 26-08-05
Из: Донецк, ДНР
Пользователь №: 7 980

|
Цитата(Navovvol @ Nov 21 2011, 14:01)  Ерунда. нормально работал при 16 MHz на скорости 115200 при погрешности 2.1%. Ошибок нет. Правда это RS485. У меня на комповый порт не работало никогда ... Цитата(Navovvol @ Nov 21 2011, 14:01)  Поменяйте провода местами Rx Tx всегда помагает. ))) Это верно  Цитата(Navovvol @ Nov 21 2011, 14:04)  Код /* Set frame format: 8data, 1stop bit */ UCSRC = (1<<URSEL)|(3<<UCSZ0); Почему URSEL = 1 ? Почему синхронных режим связи ? Синхронный режим - UMSEL.... А вообще в посте 4 дан нормальный код инициализации ...
Сообщение отредактировал hd44780 - Nov 21 2011, 11:10
--------------------
Чтобы возить такого пассажира, необходим лимузин другого класса. (с) Мария Эдуарда
|
|
|
|
|
Nov 21 2011, 11:14
|
Частый гость
 
Группа: Участник
Сообщений: 105
Регистрация: 9-09-11
Пользователь №: 67 080

|
Цитата(hd44780 @ Nov 21 2011, 14:09)  Синхронный режим - UMSEL.... А ну да точно. Моя не прав
|
|
|
|
|
Nov 21 2011, 14:47
|
Участник

Группа: Участник
Сообщений: 50
Регистрация: 22-07-11
Пользователь №: 66 352

|
Цитата(Палыч @ Nov 21 2011, 17:55)  Должны... Если fuses действительно установлены на внешний кварц 8 МГц. Установлен внешний кварц: CKOPT=0, CKSEL3=CKSEL2=CKSEL1=1. Цитата(Genadi Zawidowski @ Nov 21 2011, 17:09)  Строка хранится в 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[i]; } } 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 на конверторе моргает, но на гипертерминал ничего не выводится.
Сообщение отредактировал nvk - Nov 21 2011, 14:48
|
|
|
|
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0
|
|
|