Freeze 0 5 августа, 2008 Опубликовано 5 августа, 2008 · Жалоба Собственно, сабж. Инициализировал 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 выходом. делал. не помогло. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Палыч 10 5 августа, 2008 Опубликовано 5 августа, 2008 · Жалоба По-моему: UCSRC = 0x06; // Разряды UCSZx установлены для передачи 8 бит данных P.S. Для наглядности и защиты от ошибок лучше записывать так: UCSRC = (1 < < UCSZ1) | (1 < < UCSZ0); // Разряды UCSZx установлены для передачи 8 бит данных Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
smac 0 5 августа, 2008 Опубликовано 5 августа, 2008 · Жалоба Собственно, сабж. Инициализировал USART. сигнал с контроллера передается номально. По компорту ловлю на компьютере. А вот если с компьютера передавать - нет реакции. Вот кусок кода моей программы ... просто пытаюсь поморгать светодиодами в зависимости от пришедших данных. ноль реакции. где может быть ошибка? использую WinAVR зы. видел тут в одной из соседних тем советовали указать при инициализации порта RxD выходом. делал. не помогло. Лучше инициализировать не числами (хотя может быть это компилятор виноват, не силен я в С) а записями типа UCSRB = (1<<RXEN)|(1<<TXEN), В этом случае упрощается поиск ошибки. а если по теме, то может быть вы забыли порты Д и Б как выходы настроить ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Палыч 10 5 августа, 2008 Опубликовано 5 августа, 2008 · Жалоба Хотя у Вас и ошибка инициализации USART, но МК должен был принимать данные, даже неправильные... ИМХО, Вы передаёте с ПК, но СОМ-порт настроен на аппаратное управление потоком, поэтому данные с ПК - не уходят... Чем (какой программой) передаёте? Какие настройки СОМ-порта? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Freeze 0 5 августа, 2008 Опубликовано 5 августа, 2008 · Жалоба Ошибку в инициализации уже исправил. Не помогает. Светодиодами уже моргал без усарта. Здесь ошибки нет. На ПК ипользую COM Port ToolKit 0.171. А как настроить правильно? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sysel 0 5 августа, 2008 Опубликовано 5 августа, 2008 · Жалоба Попробуйте исключить компьютер из ваших экспериментов - закоротите выход USART на вход прямо на микроконтроллере и подолжить эксперименты. Посмотрите, правильно ли у Вас настроен порт D: Должно быть так: PD0 - вход, PD1 - выход. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Палыч 10 5 августа, 2008 Опубликовано 5 августа, 2008 · Жалоба На ПК ипользую COM Port ToolKit 0.171. А как настроить правильно? С этой программой - не работал... В настройках СОМ-порта этой программы попробуйте найти "Управление потоком" (или как-то так), и убирите всякое (аппаратное и программное) управление. Для проверки правильности работы программы на ПК необходимо отключить кабель от МК и замкнуть контакты приёмника и передатчика между собой на отключённой стороне кабеля, и попробовать что-то передать: переданные данные должны тут же вернуться обратно (приняться). После чего всё вернуть на место и, зациклив передачу какого либо байта (удобно - символ U), убедиться, что данные доходят до ноги приёмника МК с помощью осциллографа. Посмотрите, правильно ли у Вас настроен порт D: Должно быть так: PD0 - вход, PD1 - выход. Специально ноги приёмника и передатчика на ввод(вывод) выставлять нет необходимости - параллельный порт отключается от ног МК при установке RXEN и TXEN Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sKWO 0 5 августа, 2008 Опубликовано 5 августа, 2008 · Жалоба На ПК ипользую COM Port ToolKit 0.171. А как настроить правильно? попробуйте это Term2x.rar Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
=GM= 0 5 августа, 2008 Опубликовано 5 августа, 2008 · Жалоба Просто пытаюсь поморгать светодиодами в зависимости от пришедших данных. ноль реакции. Где может быть ошибка? Покажите, как у вас настроены порты B и D? Может быть они настроены на ввод? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
haker_fox 61 5 августа, 2008 Опубликовано 5 августа, 2008 · Жалоба Покажите, как у вас настроены порты B и D? Может быть они настроены на ввод? Настройка портов не влияет на функциональность UART. В архиве приложил свою библиотечку. 100% рабочая! Код не комментирован. С помощью макросов есть возможность выбрать работу с программным FIFO буфером, прерываниями, а также выбрать платформу - AVR или ARM (не до конца портирован). Код работы с UART содержится в архиве serial.zip, код буфера - в fifobuf.zip serial.zip fifobuff.zip Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
NullPointer 0 5 августа, 2008 Опубликовано 5 августа, 2008 · Жалоба Настройка портов не влияет на функциональность UART. А на этих портах предположительно светодиоды висят, речь не об USART.. -- В UCSRC пишете не правильно вроде, надо бы URSEL ставить в 1. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
UniBomb 0 5 августа, 2008 Опубликовано 5 августа, 2008 (изменено) · Жалоба 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 */ Здесь как раз и происходит то, о чём я говорил выше... Изменено 5 августа, 2008 пользователем UniBomb Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Хомяк 0 5 августа, 2008 Опубликовано 5 августа, 2008 · Жалоба я делал на меге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(); } } } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
haker_fox 61 5 августа, 2008 Опубликовано 5 августа, 2008 · Жалоба В UCSRC пишете не правильно вроде, надо бы URSEL ставить в 1. Как я верно понял, это Вы не мне?) Лучше инициализировать не числами (хотя может быть это компилятор виноват, не силен я в С) а записями типа UCSRB = (1<<RXEN)|(1<<TXEN), В этом случае упрощается поиск ошибки. +1! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Freeze 0 5 августа, 2008 Опубликовано 5 августа, 2008 · Жалоба спасибо за подсказку про URSEL. сейчас попробую. и еще спасибо за подсказку про настройки компьютера. я почему-то упустил из виду, что раньше использовал эту программу под Win98, а теперь - под WinXP... действительно, проверил сигналы на входе MAX232. уходит нормальный сигнал, а вот приходит один всплеск очень короткий... я почему-то думаю, что именно здесь собака и порылась... программа, которая была в одном из аттачей не помогает... сейчас посмотрю, что выложил hacker_fox... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться