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

Передача сигнала по UART

Передаю некорый набор символов по 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.

 

Где я что делаю не так и как мне получить именно те переменные, которыя я и посылаю.

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


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

Передаю некорый набор символов по UART.

"Отличный" вопрос для заздела по IAR компилятору.

Перенесен к AVR, при условии, что:

1. Тексты будете оформлять в читабельном (code /code и без повсеместного использования "магических" нечитаемых чисел вместо поименованных битов и констант) виде.

2. хоть попробуете подумать, можно-ли не контролируя состояние UART запихивать в него информацию.

3. зачем в тексте куча мусора в виде _SEI, _CLI, _NOP, постоянных UCR=....

все делаю по-человечески...

:(

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


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

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

 

while (USR & 0x20);

 

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

 

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

 

0x90 - это я заполняю регистр UCR и настраиваю UART на прием

0x9C - это значение ргистра UBRR при скорости передачи 2400 бод и частоте осциллятора 6 МГц

0х18 - настраиваю UART на передачу

0xAA - символ, который я использую, чтобы при получении его с компьютера, скинуть информацию в UART.

 

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

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


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

А что скрывается под:

 

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();
}

Вот и все.

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


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

Работу можно организовать на прерываниях: для передаче UDRE, на прием RXD. Складыват ь в кольцевые буферы и по мере необходимости их читать или писать. В какой-то версии к AVR-GCC были соответствующие примеры :) . Сам на их основе делал код для работы с UART.

PS. ZOC терминал удобная программа для работы с сом-портом, но коммерческая. :(

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


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

Исходники функций для работы с UART с буферизацией по приему и передаче.

Правда, на асме ;)

На С есть дома... и для ARM. Но идею понять можно... Могу заслать, если надо.

uart.rar

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


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

Передаю некорый набор символов по UART........

 

Извините пожалуйста...., но!!!!

Вы проверили настройки скорости на компе????

Да и запрет прерываний во время передачи - это конечно оччччень логично. Всё равно, что заглушить двигатель и пытаться поехать. (И какого непонятного он входит в бесконечный цикл.... даже не понятно :)))

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

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


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

Работу можно организовать на прерываниях: для передаче UDRE, на прием RXD. Складыват ь в кольцевые буферы и по мере необходимости их читать или писать. В какой-то версии к AVR-GCC были соответствующие примеры :) . Сам на их основе делал код для работы с UART.

PS. ZOC терминал удобная программа для работы с сом-портом, но коммерческая. :(

CodeVisionAVR генерит неплохой код с ФИФО буферами и на приём и на передачу. Пользуюсь постоянно :)

PS: Ленивый я :)

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


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

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

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

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

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

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

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

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

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

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