Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Atmega32+UART
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
nvk
Добрый день!

Пытаюсь с контроллера отправить на терминал компьютера фразу "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); }
}

Заранее спасибо за помощь!
Палыч
Хорошо бы указывать: чем вы это компилировали...

Определите: в какой памяти хранится ваша строка "HELLO, WORLD!"; как к ней получить доступ; как с ней работают библиотечные процедуры (типа strlen)...
nvk
Цитата(Палыч @ Nov 21 2011, 16:47) *
Хорошо бы указывать: чем вы это компилировали...

Определите: в какой памяти хранится ваша строка "HELLO, WORLD!"; как к ней получить доступ; как с ней работают библиотечные процедуры (типа strlen)...


Работаю в среде CodeBlocks, компилятор GNU AVR GCC. Строка хранится во флэш-памяти программ. Пробовал даже писать так:
UDR = 'a';
Ничего не помогает, никаких символов в терминале нет.
Genadi Zawidowski
Строка хранится в 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;
hd44780
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.
nvk
Цитата(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%. Хотя бы должны приходить какие-нибудь кракозябры.
hd44780
Цитата(nvk @ Nov 21 2011, 13:33) *
1. МАХ232.
2. У меня ноутбук с PCMCIA-картой ST-LAB 191. Нареканий на неё нет. Прекрасно работает в терминале с GSM-модулем SIM300.
3. Ошибка на скорости 9600 всего 0,2%. Хотя бы должны приходить какие-нибудь кракозябры.


Нормально вроде ...

Соедините Rx-Tx у MAX232 (на стороне RS232, можно даже на том конце кабеля, который в комп втыкается. Заодно и кабель сам проверите) и проверьте в контроллере - будете ли принимать то же, что и послали.
Может сама MAX232 кривая или чего-то где-то недопаяли.
Палыч
Цитата(nvk @ Nov 21 2011, 14:33) *
3. Ошибка на скорости 9600 всего 0,2%. Хотя бы должны приходить какие-нибудь кракозябры.
Должны... Если fuses действительно установлены на внешний кварц 8 МГц.
Navovvol
Цитата(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 всегда помагает. )))
hd44780
Да, и проверьте ещё распайку кабеля. На порте нога 2 - RxD - RS232 выход на MAX232, нога 3 - TxD - RS232 вход на MAX.
Если на устройстве такой же разъём как на компе, то в кабеле д.б. т.н. "крест" 2-3, 3-2.
Navovvol
Цитата(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 ? Почему синхронных режим связи ?
hd44780
Цитата(Navovvol @ Nov 21 2011, 14:01) *
Ерунда. нормально работал при 16 MHz на скорости 115200 при погрешности 2.1%. Ошибок нет. Правда это RS485.

У меня на комповый порт не работало никогда ...

Цитата(Navovvol @ Nov 21 2011, 14:01) *
Поменяйте провода местами Rx Tx всегда помагает. )))


Это верно biggrin.gif

Цитата(Navovvol @ Nov 21 2011, 14:04) *
Код
/* Set frame format: 8data, 1stop bit */
UCSRC = (1<<URSEL)|(3<<UCSZ0);

Почему URSEL = 1 ? Почему синхронных режим связи ?


Синхронный режим - UMSEL....
А вообще в посте 4 дан нормальный код инициализации ...
Navovvol
Цитата(hd44780 @ Nov 21 2011, 14:09) *
Синхронный режим - UMSEL....

А ну да точно. Моя не прав
nvk
Цитата(Палыч @ 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 на конверторе моргает, но на гипертерминал ничего не выводится.
hd44780
Цитата(nvk @ Nov 21 2011, 17:47) *
Светодиод TX на конверторе моргает, но на гипертерминал ничего не выводится.


А в гипертеминале вы не забыли отключить всякие "фенечки" типа управления потоком?

Проверьте всё-таки на интегрированном порте обычного компа. Чем xxx не шутит ...
Genadi Zawidowski
Нажмите для просмотра прикрепленного файла
Код
UCSRB = 0x19

Вы решили передавать девятибитные символы? Хотя это на формат не влияет, но если мы ищем проблему среди двух проводов, постарайтесь точнее следовать советам.
Отработайте с той инициализацией, что Вам предложили (0x18).
В аттачменте - терминалка игнорирующая все сигналы готовности.
Вход в настройки (и хелп) - alt+f3

Проверка преобразователя - сажаете RESET процессора на землю и соединив вход с выходом преобразователя накоротко, смотрите эхо символов в терминалке.
Питание 3.3 или 5 вольт? Преобразователь уровней питается в соответствии со своим паспортным напряжением?

Ваша программа рабочая. Добавив include для strlen, получил .hex, который прошил в имеющийся макет - работает.
Проект в аттачменте.
зы: Вас не затруднит привести состояние фюзов (тот экран, что перчатает AVREAL в процессе программирования)?
nvk
Преобразователь я уже проверял - символы нормально приходят. Питание преобразователя - 5В. Попробовал поставить UCSRB = 0x18, эффекта всё равно нет. Кстати, Algoritm Builder сформировал для 8 бит данных значение UCSRB = 0x19.
В прилагаемом файле скриншот фьюзов.
Палыч
Цитата(nvk @ Nov 22 2011, 18:28) *
В прилагаемом файле скриншот фьюзов.

В Пони: "галка" - это ноль (запрограммировано), нет "галки" - единица!
nvk
Цитата(Палыч @ Nov 23 2011, 00:39) *
В Пони: "галка" - это ноль (запрограммировано), нет "галки" - единица!


Как правильно поставить галки?
Genadi Zawidowski
Может помочь файл с фюзами для внутреннего генератора 8 МГц.
Для кварца CKSEL=0xf прменить вместо того, что стоит сейчас.
Аналогично для понипрога - все четыре бита CKSELx на предложенной картинке снять галочки.
У Вас на 1 МГц процессор работает.
Выставьте по моей картинке фюзы для начала.
nvk
С такими настройками работает. Не установил только бит BODEN.

Подключил внешний резонатор на 8МГц - не работает. Опять фьюзы неправильно установлены?
nvk
Цитата(nvk @ Nov 24 2011, 02:00) *
Подключил внешний резонатор на 8МГц - не работает. Опять фьюзы неправильно установлены?


Заработало. Установил СКОРТ=0.
Genadi Zawidowski
Цитата(nvk @ Nov 24 2011, 09:12) *
Заработало. Установил СКОРТ=0.

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