|
USART на mega32, пердает нормально, а принимать не хочет |
|
|
|
Aug 5 2008, 07:16
|

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

|
Собственно, сабж. Инициализировал USART. сигнал с контроллера передается номально. По компорту ловлю на компьютере. А вот если с компьютера передавать - нет реакции. Вот кусок кода моей программы Код UBRRH = 0; UBRRL = 103; // Скорость обмена USART 9600 бод UCSRB = 0x18; /* Устанавливаем разряды TXEN и RXEN для активизации USART в режиме ввода/вывода через выводы 0 и 1 порта D */ UCSRC = 0x03; // Разряды UCSZx установлены для передачи 8 бит данных while (1) {
if(UCSRA & 0x80) { USARTBuffer = UDR; PORTB = USARTBuffer & 0xE0; PORTD = (USARTBuffer << 3) & 0xE0; } } просто пытаюсь поморгать светодиодами в зависимости от пришедших данных. ноль реакции. где может быть ошибка? использую WinAVR зы. видел тут в одной из соседних тем советовали указать при инициализации порта RxD выходом. делал. не помогло.
--------------------
!!! All you need is LOVE !!!
|
|
|
|
2 страниц
1 2 >
|
 |
Ответов
(1 - 14)
|
Aug 5 2008, 07:34
|
Частый гость
 
Группа: Участник
Сообщений: 149
Регистрация: 2-06-08
Из: Москва
Пользователь №: 38 003

|
Цитата(Freeze Anti @ Aug 5 2008, 11:16)  Собственно, сабж.
Инициализировал USART. сигнал с контроллера передается номально. По компорту ловлю на компьютере. А вот если с компьютера передавать - нет реакции. Вот кусок кода моей программы ...
просто пытаюсь поморгать светодиодами в зависимости от пришедших данных. ноль реакции.
где может быть ошибка?
использую WinAVR
зы. видел тут в одной из соседних тем советовали указать при инициализации порта RxD выходом. делал. не помогло. Лучше инициализировать не числами (хотя может быть это компилятор виноват, не силен я в С) а записями типа UCSRB = (1<<RXEN)|(1<<TXEN), В этом случае упрощается поиск ошибки. а если по теме, то может быть вы забыли порты Д и Б как выходы настроить ?
|
|
|
|
|
Aug 5 2008, 08:18
|

Гуру
     
Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954

|
Цитата(Freeze Anti @ Aug 5 2008, 10:59)  На ПК ипользую COM Port ToolKit 0.171. А как настроить правильно? С этой программой - не работал... В настройках СОМ-порта этой программы попробуйте найти "Управление потоком" (или как-то так), и убирите всякое (аппаратное и программное) управление. Для проверки правильности работы программы на ПК необходимо отключить кабель от МК и замкнуть контакты приёмника и передатчика между собой на отключённой стороне кабеля, и попробовать что-то передать: переданные данные должны тут же вернуться обратно (приняться). После чего всё вернуть на место и, зациклив передачу какого либо байта (удобно - символ U), убедиться, что данные доходят до ноги приёмника МК с помощью осциллографа. Цитата Посмотрите, правильно ли у Вас настроен порт D: Должно быть так: PD0 - вход, PD1 - выход. Специально ноги приёмника и передатчика на ввод(вывод) выставлять нет необходимости - параллельный порт отключается от ног МК при установке RXEN и TXEN
|
|
|
|
|
Aug 5 2008, 08:28
|

Местный
  
Группа: Участник
Сообщений: 355
Регистрация: 27-03-07
Из: Україна, Чуднів
Пользователь №: 26 530

|
Цитата(Freeze Anti @ Aug 5 2008, 10:59)  На ПК ипользую COM Port ToolKit 0.171. А как настроить правильно? попробуйте это
Прикрепленные файлы
Term2x.rar ( 245.49 килобайт )
Кол-во скачиваний: 35
--------------------
нельзя недооценивать предсказуемость глупости
|
|
|
|
|
Aug 5 2008, 09:11
|

Познающий...
     
Группа: Свой
Сообщений: 2 963
Регистрация: 1-09-05
Из: г. Иркутск
Пользователь №: 8 125

|
Цитата(=GM= @ Aug 5 2008, 17:44)  Покажите, как у вас настроены порты B и D? Может быть они настроены на ввод? Настройка портов не влияет на функциональность UART. В архиве приложил свою библиотечку. 100% рабочая! Код не комментирован. С помощью макросов есть возможность выбрать работу с программным FIFO буфером, прерываниями, а также выбрать платформу - AVR или ARM (не до конца портирован). Код работы с UART содержится в архиве serial.zip, код буфера - в fifobuf.zip
--------------------
Выбор.
|
|
|
|
|
Aug 5 2008, 09:13
|

Чайник, 1 литр
   
Группа: Свой
Сообщений: 655
Регистрация: 17-05-06
Из: Moscow
Пользователь №: 17 168

|
Цитата(haker_fox @ Aug 5 2008, 13:07)  Настройка портов не влияет на функциональность UART. А на этих портах предположительно светодиоды висят, речь не об USART.. -- В UCSRC пишете не правильно вроде, надо бы URSEL ставить в 1.
|
|
|
|
|
Aug 5 2008, 09:14
|
Частый гость
 
Группа: Свой
Сообщений: 148
Регистрация: 26-05-05
Пользователь №: 5 416

|
Freeze Anti, во-первых регистры UBRR и UCSRС находятся по одному адресу, посему существует некая последовательность действий, а именно - сначала записывать в регистр UBRR (что в данном случае верно), а вторая - перед записью в регистр UCSRС нужно сначала установить флаг URSEL, т.о. вот так: Код UBRRH = 0; UBRRL = 103; UCSRC = (1 << URSEL|1 << UCSZ1|1 << UCSZ0); А в твоём случае скорость устанавливалась скорость непойми какая (самая маленькая) и 5 бит посылка (по умолчанию). Теперь что касается конфигурации портов - их вообще не нужно трогать, т.к. внутренний мультиплексор при конфигурировании сам законтачивает их на регистр приёмо-передатчика. Всё. При сконфигурированном УСАРТЕ мк уже не важно что находится в соответсвующих регистрах DDRx и PORTx. Теперь что касается записи: Код UCSRB = 0x18; /* Устанавливаем разряды TXEN и RXEN для активизации USART в режиме ввода/вывода через выводы 0 и 1 порта D */ Здесь как раз и происходит то, о чём я говорил выше...
Сообщение отредактировал UniBomb - Aug 5 2008, 09:16
|
|
|
|
|
Aug 5 2008, 09:19
|
Частый гость
 
Группа: Участник
Сообщений: 92
Регистрация: 23-07-08
Из: Екатеринбург
Пользователь №: 39 153

|
я делал на меге32 8МГц Код #include "bn-185_usart.h"
/****************************************************************************** Инициализация ******************************************************************************/ void USART_Init(void) { UCSRB = 0x98; // (1<<RXCIE)|(1<<RXEN)|(1<<TXEN); UCSRC = 0x86; // 1000 0110 UBRRH = 0x00; UBRRL = 12; } void USART_InitDBG(void) { } /****************************************************************************** Передача байта ******************************************************************************/ void USART_Transmit(u08 D) { while(bit_is_clear(UCSRA,UDRE)); UDR = D; } /****************************************************************************** Прием байта ******************************************************************************/ u08 USART_Receive(void) { u08 D=0; while(bit_is_clear(UCSRA,RXC)); D = UDR; return D; } /****************************************************************************** Передача строки ******************************************************************************/ void USART_TransmitStr(char s[]) { u08 i; for(i=0;i<64;i++) { if(s[i]=='\0') break; USART_Transmit(s[i]); } } /****************************************************************************** Передача строки из флеш памяти ******************************************************************************/ void USART_TransmitStrFLASH(const char *pFlashStr) { u08 i; for(i=0;pgm_read_byte(&pFlashStr[i]) && i<60; i++) { USART_Transmit(pgm_read_byte(&pFlashStr[i])); } } /****************************************************************************** ОБРАБОТЧИК ПРЕРЫВАНИЯ - ОКОНЧАНИЕ приема символа USART ******************************************************************************/ SIGNAL(SIG_USART_RECV) { UART_cmd = UDR; RxTimOvf = 0; if(UART_cmd==FirstRx) { // первый принятый байт = 0x5A? // если верен читаем дальше RxTimOvf--; TCCR0 = 0x00; // Timer0 stop TCNT0 = 0xEC; // переполнение 0.0026 sec sbi(TIMSK,TOIE0); // enable interrupt TCCR0 = 0x05; // F=Fclk/1024 cbi(UCSRB,RXCIE); // запрет прерываний по приему } } /****************************************************************************** ОБРАБОТЧИК ПРЕРЫВАНИЯ - очистка бита UDRE ******************************************************************************/ SIGNAL(SIG_USART_DATA ) { } /****************************************************************************** ОБРАБОТЧИК ПРЕРЫВАНИЯ - ОКОНЧАНИЕ передачи символа USART ******************************************************************************/ SIGNAL(SIG_USART_TRANS) { } /****************************************************************************** bn-185_usart.h ******************************************************************************/ #define FirstRx 0x5A // Первый байт КОМАНДЫ #define cmdUnk 0x50 // КОМАНДА - неизвестна
#define cmdRS 0x20 // КОМАНДА - тест RS232 #define cmdAx 0x21 // КОМАНДА - передать данные Ax #define cmdAy 0x22 // КОМАНДА - передать данные Ay #define cmdAz 0x23 // КОМАНДА - передать данные Az #define cmdWx 0x24 // КОМАНДА - передать данные Wx #define cmdWy 0x25 // КОМАНДА - передать данные Wy #define cmdWz 0x26 // КОМАНДА - передать данные Wz #define cmdAxT 0x27 // КОМАНДА - передать данные AxT #define cmdAyT 0x28 // КОМАНДА - передать данные AyT #define cmdAzT 0x29 // КОМАНДА - передать данные AzT #define cmdWxT 0x2A // КОМАНДА - передать данные WxT #define cmdWyT 0x2B // КОМАНДА - передать данные WyT #define cmdWzT 0x2C // КОМАНДА - передать данные WzT #define cmdReadEEPROM 0x2D #define cmdWriteEEPROM 0x2E
#define cmdAxAxT 0x30 // КОМАНДА - передать данные Ax AxT #define cmdAyAyT 0x31 // КОМАНДА - передать данные Ay AyT #define cmdAzAzT 0x32 // КОМАНДА - передать данные Az AzT #define cmdWxWxT 0x33 // КОМАНДА - передать данные Wx WxT #define cmdWyWyT 0x34 // КОМАНДА - передать данные Wy WyT #define cmdWzWzT 0x35 // КОМАНДА - передать данные Wz WzT
#define cmdReadIDF 0x40 #define cmdWritIDF 0x41 /******************************************************************************
******************************************************************************/
/******************************************************************************
******************************************************************************/ #define erError 0xE0 // ОШИБКА - глобальная #define erUnkCmd 0xE1 // ОШИБКА - команда неизвестна Ну и использование Код USART_Init(); RxTimOvf = 0x00; cmd_RS = 0x00; TIMSK = 0x00; sei(); USART_TransmitStrFLASH(SOME_STRING); // USART_TransmitStrFLASH(ENABLE_INT); // for(;;) { if(RxTimOvf!=0) { code_CMD = USART_Receive(); // if(code_CMD<cmdRS) // код меньше 0x20 { USART_TransmitStrFLASH(BAD_COMMAND); // } else if(code_CMD>=cmdUnk) // код больше 0x50 { USART_TransmitStrFLASH(UNKNOW_COMMAND); // } if(cmdRS<code_CMD<cmdUnk) { ExeCommand(); } } }
|
|
|
|
|
Aug 5 2008, 09:40
|

Познающий...
     
Группа: Свой
Сообщений: 2 963
Регистрация: 1-09-05
Из: г. Иркутск
Пользователь №: 8 125

|
Цитата(SysRq @ Aug 5 2008, 18:13)  В UCSRC пишете не правильно вроде, надо бы URSEL ставить в 1. Как я верно понял, это Вы не мне?) Цитата(smac @ Aug 5 2008, 16:34)  Лучше инициализировать не числами (хотя может быть это компилятор виноват, не силен я в С) а записями типа UCSRB = (1<<RXEN)|(1<<TXEN), В этом случае упрощается поиск ошибки. +1!
--------------------
Выбор.
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|