|
|
  |
Передача сигнала по UART |
|
|
|
May 29 2007, 04:43
|

Частый гость
 
Группа: Новичок
Сообщений: 153
Регистрация: 29-03-07
Из: Саратов
Пользователь №: 26 613

|
Передаю некорый набор символов по 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.
Где я что делаю не так и как мне получить именно те переменные, которыя я и посылаю.
--------------------
!!! All you need is LOVE !!!
|
|
|
|
|
May 29 2007, 06:20
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
Цитата(Freeze Anti @ May 29 2007, 07:43)  Передаю некорый набор символов по UART. "Отличный" вопрос для заздела по IAR компилятору. Перенесен к AVR, при условии, что: 1. Тексты будете оформлять в читабельном (code /code и без повсеместного использования "магических" нечитаемых чисел вместо поименованных битов и констант) виде. 2. хоть попробуете подумать, можно-ли не контролируя состояние UART запихивать в него информацию. 3. зачем в тексте куча мусора в виде _SEI, _CLI, _NOP, постоянных UCR=.... Цитата все делаю по-человечески...
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
May 29 2007, 09:17
|

Частый гость
 
Группа: Новичок
Сообщений: 153
Регистрация: 29-03-07
Из: Саратов
Пользователь №: 26 613

|
Я, конечно, понимаю, что необходимо выполнять проверку USR, но когда я в конце подпрограммы пишу строчку Код while (USR & 0x20); у меня программа уходит в бесконечный цикл. А какие нечитаемые символы я использую вместо поименованных констант? 0x90 - это я заполняю регистр UCR и настраиваю UART на прием 0x9C - это значение ргистра UBRR при скорости передачи 2400 бод и частоте осциллятора 6 МГц 0х18 - настраиваю UART на передачу 0xAA - символ, который я использую, чтобы при получении его с компьютера, скинуть информацию в UART. И еще... Хочу попробовать переписать подпрограмму передачи одного символа в ассемблере. У меня, к сожалению из литературы только книжка Шпака по программированию в среде WinAVR. Переписывать полностью программу под этот компиллятор нет ни времени ни желания. Напишите, если возможно, как в IARе написать ассемблерную вставку. Он ругается на asm и говорит, что не знает данного слова.
--------------------
!!! All you need is LOVE !!!
|
|
|
|
Guest_Serg79_*
|
May 30 2007, 05:15
|
Guests

|
Если нужно просто отправлять данные по 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(); } Вот и все.
|
|
|
|
|
Jun 6 2007, 16:52
|

Участник

Группа: Участник
Сообщений: 30
Регистрация: 1-08-05
Из: Украина Винница
Пользователь №: 7 258

|
Цитата(Freeze Anti @ May 29 2007, 07:43)  Передаю некорый набор символов по UART........ Извините пожалуйста...., но!!!! Вы проверили настройки скорости на компе???? Да и запрет прерываний во время передачи - это конечно оччччень логично. Всё равно, что заглушить двигатель и пытаться поехать. (И какого непонятного он входит в бесконечный цикл.... даже не понятно  ))
Сообщение отредактировал Juk1976 - Jun 6 2007, 16:54
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|