реклама на сайте
подробности

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> Atmega32+UART
nvk
сообщение Nov 21 2011, 09:35
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 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
Go to the top of the page
 
+Quote Post
Палыч
сообщение Nov 21 2011, 09:47
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954



Хорошо бы указывать: чем вы это компилировали...

Определите: в какой памяти хранится ваша строка "HELLO, WORLD!"; как к ней получить доступ; как с ней работают библиотечные процедуры (типа strlen)...
Go to the top of the page
 
+Quote Post
nvk
сообщение Nov 21 2011, 09:54
Сообщение #3


Участник
*

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



Цитата(Палыч @ Nov 21 2011, 16:47) *
Хорошо бы указывать: чем вы это компилировали...

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


Работаю в среде CodeBlocks, компилятор GNU AVR GCC. Строка хранится во флэш-памяти программ. Пробовал даже писать так:
UDR = 'a';
Ничего не помогает, никаких символов в терминале нет.
Go to the top of the page
 
+Quote Post
Genadi Zawidowsk...
сообщение Nov 21 2011, 10:09
Сообщение #4


Профессионал
*****

Группа: Участник
Сообщений: 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
Go to the top of the page
 
+Quote Post
hd44780
сообщение Nov 21 2011, 10:14
Сообщение #5


Профессионал
*****

Группа: Свой
Сообщений: 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


--------------------
Чтобы возить такого пассажира, необходим лимузин другого класса.
(с) Мария Эдуарда
Go to the top of the page
 
+Quote Post
nvk
сообщение Nov 21 2011, 10:33
Сообщение #6


Участник
*

Группа: Участник
Сообщений: 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%. Хотя бы должны приходить какие-нибудь кракозябры.
Go to the top of the page
 
+Quote Post
hd44780
сообщение Nov 21 2011, 10:51
Сообщение #7


Профессионал
*****

Группа: Свой
Сообщений: 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


--------------------
Чтобы возить такого пассажира, необходим лимузин другого класса.
(с) Мария Эдуарда
Go to the top of the page
 
+Quote Post
Палыч
сообщение Nov 21 2011, 10:55
Сообщение #8


Гуру
******

Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954



Цитата(nvk @ Nov 21 2011, 14:33) *
3. Ошибка на скорости 9600 всего 0,2%. Хотя бы должны приходить какие-нибудь кракозябры.
Должны... Если fuses действительно установлены на внешний кварц 8 МГц.
Go to the top of the page
 
+Quote Post
Navovvol
сообщение Nov 21 2011, 11:01
Сообщение #9


Частый гость
**

Группа: Участник
Сообщений: 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 всегда помагает. )))
Go to the top of the page
 
+Quote Post
hd44780
сообщение Nov 21 2011, 11:04
Сообщение #10


Профессионал
*****

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



Да, и проверьте ещё распайку кабеля. На порте нога 2 - RxD - RS232 выход на MAX232, нога 3 - TxD - RS232 вход на MAX.
Если на устройстве такой же разъём как на компе, то в кабеле д.б. т.н. "крест" 2-3, 3-2.


--------------------
Чтобы возить такого пассажира, необходим лимузин другого класса.
(с) Мария Эдуарда
Go to the top of the page
 
+Quote Post
Navovvol
сообщение Nov 21 2011, 11:04
Сообщение #11


Частый гость
**

Группа: Участник
Сообщений: 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 ? Почему синхронных режим связи ?
Go to the top of the page
 
+Quote Post
hd44780
сообщение Nov 21 2011, 11:09
Сообщение #12


Профессионал
*****

Группа: Свой
Сообщений: 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 всегда помагает. )))


Это верно biggrin.gif

Цитата(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


--------------------
Чтобы возить такого пассажира, необходим лимузин другого класса.
(с) Мария Эдуарда
Go to the top of the page
 
+Quote Post
Navovvol
сообщение Nov 21 2011, 11:14
Сообщение #13


Частый гость
**

Группа: Участник
Сообщений: 105
Регистрация: 9-09-11
Пользователь №: 67 080



Цитата(hd44780 @ Nov 21 2011, 14:09) *
Синхронный режим - UMSEL....

А ну да точно. Моя не прав
Go to the top of the page
 
+Quote Post
nvk
сообщение Nov 21 2011, 14:47
Сообщение #14


Участник
*

Группа: Участник
Сообщений: 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
Go to the top of the page
 
+Quote Post
hd44780
сообщение Nov 21 2011, 15:20
Сообщение #15


Профессионал
*****

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



Цитата(nvk @ Nov 21 2011, 17:47) *
Светодиод TX на конверторе моргает, но на гипертерминал ничего не выводится.


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

Проверьте всё-таки на интегрированном порте обычного компа. Чем xxx не шутит ...


--------------------
Чтобы возить такого пассажира, необходим лимузин другого класса.
(с) Мария Эдуарда
Go to the top of the page
 
+Quote Post

2 страниц V   1 2 >
Reply to this topicStart new topic
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 20th July 2025 - 16:21
Рейтинг@Mail.ru


Страница сгенерированна за 0.01501 секунд с 7
ELECTRONIX ©2004-2016