Freeze 0 29 мая, 2007 Опубликовано 29 мая, 2007 · Жалоба Передаю некорый набор символов по 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 1 29 мая, 2007 Опубликовано 29 мая, 2007 · Жалоба Передаю некорый набор символов по UART. "Отличный" вопрос для заздела по IAR компилятору. Перенесен к AVR, при условии, что: 1. Тексты будете оформлять в читабельном (code /code и без повсеместного использования "магических" нечитаемых чисел вместо поименованных битов и констант) виде. 2. хоть попробуете подумать, можно-ли не контролируя состояние UART запихивать в него информацию. 3. зачем в тексте куча мусора в виде _SEI, _CLI, _NOP, постоянных UCR=.... все делаю по-человечески... :( Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Freeze 0 29 мая, 2007 Опубликовано 29 мая, 2007 · Жалоба Я, конечно, понимаю, что необходимо выполнять проверку USR, но когда я в конце подпрограммы пишу строчку while (USR & 0x20); у меня программа уходит в бесконечный цикл. А какие нечитаемые символы я использую вместо поименованных констант? 0x90 - это я заполняю регистр UCR и настраиваю UART на прием 0x9C - это значение ргистра UBRR при скорости передачи 2400 бод и частоте осциллятора 6 МГц 0х18 - настраиваю UART на передачу 0xAA - символ, который я использую, чтобы при получении его с компьютера, скинуть информацию в UART. И еще... Хочу попробовать переписать подпрограмму передачи одного символа в ассемблере. У меня, к сожалению из литературы только книжка Шпака по программированию в среде WinAVR. Переписывать полностью программу под этот компиллятор нет ни времени ни желания. Напишите, если возможно, как в IARе написать ассемблерную вставку. Он ругается на asm и говорит, что не знает данного слова. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
IEC 1 29 мая, 2007 Опубликовано 29 мая, 2007 · Жалоба А что скрывается под: HistoryTransmit(); // Передача некоторой строчки в UART Запись в регистр UDR символов строки без контроля освобождения буфера передачи? Или контроль освобождения все-таки происходит? А зачем тогда отключать прерывания? Текст в студию! ЗЫ: Желательно более-менее полный. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Гость Serg79 30 мая, 2007 Опубликовано 30 мая, 2007 · Жалоба Если нужно просто отправлять данные по 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 0 30 мая, 2007 Опубликовано 30 мая, 2007 · Жалоба Работу можно организовать на прерываниях: для передаче UDRE, на прием RXD. Складыват ь в кольцевые буферы и по мере необходимости их читать или писать. В какой-то версии к AVR-GCC были соответствующие примеры :) . Сам на их основе делал код для работы с UART. PS. ZOC терминал удобная программа для работы с сом-портом, но коммерческая. :( Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
adnega 11 31 мая, 2007 Опубликовано 31 мая, 2007 · Жалоба Исходники функций для работы с UART с буферизацией по приему и передаче. Правда, на асме ;) На С есть дома... и для ARM. Но идею понять можно... Могу заслать, если надо. uart.rar Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Juk1976 0 6 июня, 2007 Опубликовано 6 июня, 2007 (изменено) · Жалоба Передаю некорый набор символов по UART........ Извините пожалуйста...., но!!!! Вы проверили настройки скорости на компе???? Да и запрет прерываний во время передачи - это конечно оччччень логично. Всё равно, что заглушить двигатель и пытаться поехать. (И какого непонятного он входит в бесконечный цикл.... даже не понятно :))) Изменено 6 июня, 2007 пользователем Juk1976 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
bloodden 0 5 сентября, 2007 Опубликовано 5 сентября, 2007 · Жалоба Работу можно организовать на прерываниях: для передаче UDRE, на прием RXD. Складыват ь в кольцевые буферы и по мере необходимости их читать или писать. В какой-то версии к AVR-GCC были соответствующие примеры :) . Сам на их основе делал код для работы с UART. PS. ZOC терминал удобная программа для работы с сом-портом, но коммерческая. :( CodeVisionAVR генерит неплохой код с ФИФО буферами и на приём и на передачу. Пользуюсь постоянно :) PS: Ленивый я :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться