Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Передача сигнала по UART
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
Freeze Anti
Передаю некорый набор символов по UART.
Вроде, все делаю по-человечески, но у меня в ответ на компьютере приходи абсолютно не то, что я хотел...

Вот два куска кода.

1. Обращение к подпрограмме передачи сообщения

_SEI();
UCR = 0x90;
UBRR = 0x9C;
if (UDR == 0xAA)
{
_CLI();
UCR = 0x18;
HistoryTransmit(); // Передача некоторой строчки в UART
SEI_();
}

2. Функция, связанная непосредственно, с передачей одного символа.

void COMWriteChar(unsigned char C)
{
_NOP();
_NOP();
UCR = 0x18;
UDR = C;
// Далее, для проверки, рисую все это на экране дисплея, и посылаю нулевой символ...
ScreenWriteChar©;
UDR = 0;
}

Потом, при приеме на компьютере некоторой строчки, (предположим, в функцию загоняются значения 0xFF, 0xA0, 0x61, 0xB7) получаем в ком порте компьютера значения 0xFF, 0x00, 0x30, 0x00, 0x20, 0x30, 0x30, 0x30.

Где я что делаю не так и как мне получить именно те переменные, которыя я и посылаю.
zltigo
Цитата(Freeze Anti @ May 29 2007, 07:43) *
Передаю некорый набор символов по UART.

"Отличный" вопрос для заздела по IAR компилятору.
Перенесен к AVR, при условии, что:
1. Тексты будете оформлять в читабельном (code /code и без повсеместного использования "магических" нечитаемых чисел вместо поименованных битов и констант) виде.
2. хоть попробуете подумать, можно-ли не контролируя состояние UART запихивать в него информацию.
3. зачем в тексте куча мусора в виде _SEI, _CLI, _NOP, постоянных UCR=....
Цитата
все делаю по-человечески...

sad.gif
Freeze Anti
Я, конечно, понимаю, что необходимо выполнять проверку USR, но когда я в конце подпрограммы пишу строчку

Код
while (USR & 0x20);


у меня программа уходит в бесконечный цикл.

А какие нечитаемые символы я использую вместо поименованных констант?

0x90 - это я заполняю регистр UCR и настраиваю UART на прием
0x9C - это значение ргистра UBRR при скорости передачи 2400 бод и частоте осциллятора 6 МГц
0х18 - настраиваю UART на передачу
0xAA - символ, который я использую, чтобы при получении его с компьютера, скинуть информацию в UART.

И еще... Хочу попробовать переписать подпрограмму передачи одного символа в ассемблере. У меня, к сожалению из литературы только книжка Шпака по программированию в среде WinAVR. Переписывать полностью программу под этот компиллятор нет ни времени ни желания. Напишите, если возможно, как в IARе написать ассемблерную вставку. Он ругается на asm и говорит, что не знает данного слова.
IEC
А что скрывается под:

HistoryTransmit(); // Передача некоторой строчки в UART

Запись в регистр UDR символов строки без контроля освобождения буфера передачи?
Или контроль освобождения все-таки происходит?
А зачем тогда отключать прерывания?
Текст в студию!
ЗЫ: Желательно более-менее полный.
Serg79
Если нужно просто отправлять данные по USART, то используй две простые функции:
Код
/* Код приведен для mega64. */

/* частота кварца */
#define F_CPU                           14745600UL
/* требуема скорость передачи */
#define BAUD                                4800UL
/* вспомогательные макросы */
#define LOBYTE(w)         ((uint8_t)((uint16_t)(w)))
#define HIBYTE(w)         ((uint8_t)((uint16_t)(w) >> 8))
/* команда "nop" */
#define nop()  { __asm__ __volatile__ ( "nop \n\t" ); }

/* инициализация usart */
void init_usart(void)
{
    /* установка скорости передачи */
    UBRR0H = HIBYTE( (F_CPU / (16 * BAUD)) - 1 );
    UBRR0L = LOBYTE( (F_CPU / (16 * BAUD)) - 1 );
    /* разрешаем только передачу */
    UCSR0B |= (1<<TXEN0);
}

/* отправка одного символа */
void write_char_usart(uint8_t ch)
{
    /* сбросим флаг завершения передачи (это называется параноей :-) ) */
    UCSR0A |= (1<<TXC0);
    /* закидываем символ на передачу */
    UDR0 = ch;
    /* ждем завершение передачи */
    while( !(UCSR0A & (1<<TXC0)) ) nop();
}
Вот и все.
mdmitry
Работу можно организовать на прерываниях: для передаче UDRE, на прием RXD. Складыват ь в кольцевые буферы и по мере необходимости их читать или писать. В какой-то версии к AVR-GCC были соответствующие примеры smile.gif . Сам на их основе делал код для работы с UART.
PS. ZOC терминал удобная программа для работы с сом-портом, но коммерческая. sad.gif
adnega
Исходники функций для работы с UART с буферизацией по приему и передаче.
Правда, на асме wink.gif
На С есть дома... и для ARM. Но идею понять можно... Могу заслать, если надо.
Juk1976
Цитата(Freeze Anti @ May 29 2007, 07:43) *
Передаю некорый набор символов по UART........


Извините пожалуйста...., но!!!!
Вы проверили настройки скорости на компе????
Да и запрет прерываний во время передачи - это конечно оччччень логично. Всё равно, что заглушить двигатель и пытаться поехать. (И какого непонятного он входит в бесконечный цикл.... даже не понятно smile.gif))
bloodden
Цитата(mdmitry @ May 30 2007, 09:38) *
Работу можно организовать на прерываниях: для передаче UDRE, на прием RXD. Складыват ь в кольцевые буферы и по мере необходимости их читать или писать. В какой-то версии к AVR-GCC были соответствующие примеры smile.gif . Сам на их основе делал код для работы с UART.
PS. ZOC терминал удобная программа для работы с сом-портом, но коммерческая. sad.gif

CodeVisionAVR генерит неплохой код с ФИФО буферами и на приём и на передачу. Пользуюсь постоянно smile.gif
PS: Ленивый я smile.gif
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.