ur5cuj 0 4 апреля, 2012 Опубликовано 4 апреля, 2012 (изменено) · Жалоба Тупик, прошу помощи, это мой первый опыт с фриртосой. Значит так, всё крутится в мега1284. Делаю пересылку между юсартами, с первого принимаю, на второй передаю, со второго принима, н апервый передаю. RS485 на втором. Пока было без драйверов 485 (ADM485) две FT232 на два порта юсба в комп, всё бегало без проблем, а вот с драйвером - беда, беда, печалька... Симптом: по юсарт1 принимаю байты, на юсарт2 выдаю, ну и запущено две терминальные проги на компе, теряются байты, передаю 20, принимаю 17...20. вот мои обработчики прерываний: ISR( USART1_UDRE_vect ) { uint8_t cChar; signed portBASE_TYPE cTaskWoken; if( xQueueReceiveFromISR( xCharsForTx[1], &cChar, &cTaskWoken ) == pdTRUE ) { RS485_tx; UDR1 = cChar; } else { vInterruptOff(1); // запрещение прерывания UDRE1 } } ISR( USART1_TX_vect ) { RS485_rx; } где косяк? подскажите плиз... Изменено 5 апреля, 2012 пользователем Volldemar Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ur5cuj 0 5 апреля, 2012 Опубликовано 5 апреля, 2012 · Жалоба inline portBASE_TYPE xSerialPutChar485( uint8_t uiUSARTport_num, unsigned portBASE_TYPE cOutChar, portTickType xBlockTime ) { uint8_t uiReturn; if( xQueueSendToBack( xCharsForTx[ uiUSARTport_num ], &cOutChar, xBlockTime ) == pdTRUE ) { uiReturn = pdTRUE; vInterruptOn(uiUSARTport_num); //разрешение прерывания UDRE1 return uiReturn; } else { uiReturn = pdFAIL; return uiReturn; } } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ur5cuj 0 9 апреля, 2012 Опубликовано 9 апреля, 2012 · Жалоба Может я что то не так делаю? поздскажите, кто имел опыт с RS485 в фриртосе? Задача, делающая перенаправление вот: static void prvUSARTEchoTask1( void *pvParameters ) { uint8_t cChar; ( void ) pvParameters; for(;; ) { if (xSerialGetChar( mainUSART1, &cChar, portMAX_DELAY ) == pdTRUE) xSerialPutChar( mainUSART0, cChar, xNoBlock ); } } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
juvf 10 13 апреля, 2012 Опубликовано 13 апреля, 2012 · Жалоба Симптом: по юсарт1 принимаю байты, на юсарт2 выдаю, ну и запущено две терминальные проги на компе, теряются байты, передаю 20, принимаю 17...20. Не совсем понятно как комп отправляет/получает в/из RS485? Наверно есть преобразователь типа USB<->RS485? Проверьте, чтоб был отключен ..... программный контроль (follow control чтоли), иначе некоторые байты будут приняты за управляющие, например 0х11. Не понятно, что за команда RS485_tx; Это макрос какой-то? Не понятно, а где управление ADM-кой? Ей на ноги надо выставлять RE и DE. Как минимум ногой DE дёргать. А чтоб эха не было ещё и RE нужно управлять. ps При использовании в компе преобразователя USB<->COM некоторые проги на компе глючат с виртуальными компортами. У меня было подобное, терялись байты. (с чипами ftdi проблем не было, а вот с др были). Я для отладки таких вещей использую вместо говнотерминалок COM Port Toolkit pps Да и программа как-то написана..... в таск1 вызов xSerialPutChar(), а ниже определение xSerialPutChar485(). Наверно это одно и тоже. код функции xSerialPutChar485() - жесть. наверно это не вся функция и лишнее выкинуто. Но если это вся, то я бы определил её так inline portBASE_TYPE xSerialPutChar485( uint8_t uiUSARTport_num, unsigned portBASE_TYPE cOutChar, portTickType xBlockTime ) { if( xQueueSendToBack( xCharsForTx[ uiUSARTport_num ], &cOutChar, xBlockTime ) == pdTRUE ) { vInterruptOn(uiUSARTport_num); //разрешение прерывания UDRE1 return pdTRUE; } else return pdFAIL; } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ur5cuj 0 13 апреля, 2012 Опубликовано 13 апреля, 2012 · Жалоба В компе, на двух юсбах висят FT232, на одной из них ADM485, вторая подключена к RXD/TXD меги. Макросы: RS485_tx; RS485_rx; как раз управляют адм-кой (выводы RE и DE содинены вместе и подключены к свободному выводу меги), которая установлена на моей плате. Пользуюсь терминалкой - QT_comport, так как указанная вами "COM Port Toolkit" почему то выдаёт ошибку при запуске, когда запущено два толкита. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
juvf 10 13 апреля, 2012 Опубликовано 13 апреля, 2012 · Жалоба В компе, на двух юсбах висят FT232, на одной из них ADM485, вторая подключена к RXD/TXD меги. эээ...... тоже не совсем понятно.... получается путь такой: РС - FT232R(USB-UART) -(три провода, TTL уровни)- ADM485 -(2 провода, уровни rs485)- ADM485 -(TTL уровни)- ATMega - -(TTL уровни)- FT232R(UART-USB) - РС Если так, то адм-кой возле атмеги управление макросами RS485_tx и RS485_rx. А кто управляет адм-кой возле компа? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ur5cuj 0 13 апреля, 2012 Опубликовано 13 апреля, 2012 · Жалоба эээ...... тоже не совсем понятно.... получается путь такой: РС - FT232R(USB-UART) -(три провода, TTL уровни)- ADM485 -(2 провода, уровни rs485)- ADM485 -(TTL уровни)- ATMega - -(TTL уровни)- FT232R(UART-USB) - РС Если так, то адм-кой возле атмеги управление макросами RS485_tx и RS485_rx. А кто управляет адм-кой возле компа? Путь сигнала: РС USB1 - FT232R(USB-UART) - USART0 ATmega - USART1 ATmega ADM485 - ADM485 - FT232R - РС USB0 адм-кой возле компа рулит FT232R схема: http://bsvi.ru/perexodnik-usb-rs485/ Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
juvf 10 13 апреля, 2012 Опубликовано 13 апреля, 2012 · Жалоба FT232. Оказывается, у нее есть ножка которая переключается в момент фактической передачи. Работает это на отличноНе знал про это. *WRITE* Ну если без адм-ок, с атмегой и ртосом всё работает на ура, то может косяк не в ртос? а как будут работать терминалки по пути: РС USB1 - FT232R(USB-UART) - ADM485 - ADM485 - FT232R - РС USB0 Хотя в таком пути адм-кой, которой управляла атмега, некому управлять. можно у неё ноги DE и RE припаять к 0 или к 1. И проверить только в одну сторону. Может ртос с атмегой не причем, может косяк где-то в преобразователях? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ur5cuj 0 13 апреля, 2012 Опубликовано 13 апреля, 2012 (изменено) · Жалоба Не знал про это. *WRITE* Ну если без адм-ок, с атмегой и ртосом всё работает на ура, то может косяк не в ртос? а как будут работать терминалки по пути: РС USB1 - FT232R(USB-UART) - ADM485 - ADM485 - FT232R - РС USB0 Хотя в таком пути адм-кой, которой управляла атмега, некому управлять. можно у неё ноги DE и RE припаять к 0 или к 1. И проверить только в одну сторону. Может ртос с атмегой не причем, может косяк где-то в преобразователях? Уверен, что дело не в преобразователях, так как потери идут только по: -> USART1 ATmega ADM485 - ADM485 - FT232R - РС USB0 -> если: -> РС USB0 FT232R - ADM485 - ADM485 - USART1 ATmega -> то всё ходит без потерь... да и осцилографом глядел форму сигнала на управляющей ноге меги, которая дрвгает и переключает адм-ку, там явно видны "провалы", и количество провалов соответствует количеству потеряных байт. Значит где то в алгоритме баг... В варианте вот такого обработчика прерывания: ISR( USART1_TX_vect ) { // RS485_rx; } потери байтов нет. В этом случает драйвер rs485 всегда включен на передачу. Изменено 13 апреля, 2012 пользователем Volldemar Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
unkier 0 28 апреля, 2012 Опубликовано 28 апреля, 2012 · Жалоба а осцилом или логическим анализатором глянуть где именно пропадают байты ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ur5cuj 0 28 апреля, 2012 Опубликовано 28 апреля, 2012 · Жалоба а осцилом или логическим анализатором глянуть где именно пропадают байты ? Глядел осцилом, каждый раз, пропадает случайный байт (байты), повторяемости нет. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
unkier 0 28 апреля, 2012 Опубликовано 28 апреля, 2012 · Жалоба мигнуть светодиодом из обработчика прерывания ? и встать щупами на лампочки. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
lotor 0 28 апреля, 2012 Опубликовано 28 апреля, 2012 · Жалоба ISR( USART1_UDRE_vect ) { uint8_t cChar; signed portBASE_TYPE cTaskWoken; if( xQueueReceiveFromISR( xCharsForTx[1], &cChar, &cTaskWoken ) == pdTRUE ) { RS485_tx; UDR1 = cChar; } else { vInterruptOff(1); // запрещение прерывания UDRE1 } } ISR( USART1_TX_vect ) { RS485_rx; } где косяк? подскажите плиз... Я могу ошибаться, но смотрите, приоритет USART1_UDRE_vect выше чем USART1_TX_vect. И т.к. последнее разрешено всегда, то оно может вклиниться в неподходящий момент. Вот и потеря данных. Вообщем, самое простое - это переписать для начала код, чтобы использовалось одно прерывание USART1_TX_vect. Если потери исчезнут - то будете знать, где копать. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ur5cuj 0 4 мая, 2012 Опубликовано 4 мая, 2012 · Жалоба Я могу ошибаться, но смотрите, приоритет USART1_UDRE_vect выше чем USART1_TX_vect. И т.к. последнее разрешено всегда, то оно может вклиниться в неподходящий момент. Вот и потеря данных. Вообщем, самое простое - это переписать для начала код, чтобы использовалось одно прерывание USART1_TX_vect. Если потери исчезнут - то будете знать, где копать. Не особо понял на счёт применения только одного прерывания USART1_TX_vect. Проблема ещё актуальна, не победил :( Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
lotor 0 5 мая, 2012 Опубликовано 5 мая, 2012 · Жалоба Не особо понял на счёт применения только одного прерывания USART1_TX_vect. :( Я предлагаю вам для поиска проблемы для начала использовать только это прерывание - переводите rs485 на передачу, в самом прерывании выгребаете очередь, когда она будет пуста переводить rs485 на прием. Есть вероятность, что в такой реализации потери исчезнут. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться