Перейти к содержанию
    

Добрый день!

 

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

}

 

Заранее спасибо за помощь!

Изменено пользователем nvk

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

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

 

Работаю в среде CodeBlocks, компилятор GNU AVR GCC. Строка хранится во флэш-памяти программ. Пробовал даже писать так:

UDR = 'a';

Ничего не помогает, никаких символов в терминале нет.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Строка хранится в 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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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%. Хотя бы должны приходить какие-нибудь кракозябры.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1. МАХ232.

2. У меня ноутбук с PCMCIA-картой ST-LAB 191. Нареканий на неё нет. Прекрасно работает в терминале с GSM-модулем SIM300.

3. Ошибка на скорости 9600 всего 0,2%. Хотя бы должны приходить какие-нибудь кракозябры.

 

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

 

Соедините Rx-Tx у MAX232 (на стороне RS232, можно даже на том конце кабеля, который в комп втыкается. Заодно и кабель сам проверите) и проверьте в контроллере - будете ли принимать то же, что и послали.

Может сама MAX232 кривая или чего-то где-то недопаяли.

Изменено пользователем hd44780

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

3. Ошибка на скорости 9600 всего 0,2%. Хотя бы должны приходить какие-нибудь кракозябры.
Должны... Если fuses действительно установлены на внешний кварц 8 МГц.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

3. Проверьте в доке контроллера отклонение от требуемой скорости. Д.б. 0.2-0.3%. 2.x% у меня никогда не работало. Типа скорость 115200 на "целочисленных" кварцах 4, 8, 12, 16 MHz невыполнимая задача - большое отклонение, надо ставить кристалл с дробными MHz.

Ерунда. нормально работал при 16 MHz на скорости 115200 при погрешности 2.1%. Ошибок нет. Правда это RS485.

 

Поменяйте провода местами Rx Tx всегда помагает. )))

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Если на устройстве такой же разъём как на компе, то в кабеле д.б. т.н. "крест" 2-3, 3-2.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ерунда. нормально работал при 16 MHz на скорости 115200 при погрешности 2.1%. Ошибок нет. Правда это RS485.

 

Поменяйте провода местами Rx Tx всегда помагает. )))

/* Set frame format: 8data, 1stop bit */
UCSRC = (1<<URSEL)|(3<<UCSZ0);

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ерунда. нормально работал при 16 MHz на скорости 115200 при погрешности 2.1%. Ошибок нет. Правда это RS485.

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

 

Поменяйте провода местами Rx Tx всегда помагает. )))

 

Это верно :biggrin:

 

/* Set frame format: 8data, 1stop bit */
UCSRC = (1<<URSEL)|(3<<UCSZ0);

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

 

Синхронный режим - UMSEL....

А вообще в посте 4 дан нормальный код инициализации ...

Изменено пользователем hd44780

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Должны... Если 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 на конверторе моргает, но на гипертерминал ничего не выводится.

Изменено пользователем nvk

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Светодиод TX на конверторе моргает, но на гипертерминал ничего не выводится.

 

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

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...