|
|
|
PIC18F25K22. Максимальная скорость передачи по USART |
|
|
|
Jul 23 2018, 10:21
|
Участник
Группа: Участник
Сообщений: 26
Регистрация: 6-10-14
Пользователь №: 83 032
|
Добрый день. Попала ко мне в руки платка с контроллером PIC18F25K22 и проект для нее. Стоит внешний генератор на 4,9152МГц и включен PLL: Код #pragma config FOSC = HSMP // частота тактового генератора #pragma config PLLCFG = ON #pragma config PRICLKEN = ON #pragma config FCMEN = OFF ... Стоит задача оценить, с какой максимальной частотой можно с помощью этого контроллера передавать через RS-485 на компьютер данные (число float, 4 байта), если не брать в расчет задержки на выполнение сторонних алгоритмов (чистый проект), а сконцентрироваться только на обмене по сети. В данный момент проект сконфигурирован на скорость 9600 бод: Код void usart_init(void) { UINT_32 tmp;
TRISCbits.TRISC6 = 0; // установить 0 вывод порта А как выход ANSELCbits.ANSC6 = 1; tmp = 4915200; // вычисление частоты USART по формуле SPBRG = Fosc/16 - 1 tmp /= 4; tmp /= 9600; tmp--; //не Fosc, а 4xFosc SPBRG1 = (BYTE)tmp; // устанавливаем частоту USART1 TXSTA1bits.SYNC = 0;// установка асинхронного режима TXSTA1bits.BRGH = 1; RCSTA1bits.SPEN = 1;// включить модуль USART1 PIR1bits.RCIF = 0; // очистить буфер приемника PIE1bits.RCIE = 1; // прерывание от приемника USART разрешено PIE1bits.TXIE = 0; // прерывание от передатчика USART запрещено IPR1bits.RCIP = 0; // приоритет прерывания от приемника USART - низкий IPR1bits.TXIP = 0; // приоритет прерывания от передатчика USART - низкий TXSTA1bits.TX9 = 0; // 8 разрядная передача RCSTA1bits.RX9 = 0; // 8 бит принятых данных RCSTA1bits.CREN = 1; // разрешить прием TXSTA1bits.TXEN = 1; // разрешить передачу } Нашел в даташите табличку со скоростями, настройками USART. Если вкратце, то на скорость влияют только 3 регистра: SYNC, BRGH и BRG16. В данном проект они сконфигурированы так: SYNC = 0, BRGH = 1, BRG16 = 0. Формально можно выставить максимальную скорость 115200 бод. Исходя из формулы V_bit = V_uart * d / (d + 1 + s + p) где: V_uart — скорость UART (например: 9600, 115200), бод; d — количество бит данных; s — количество стоповых бит; p — количество бит четности, p = 1 если бит четности присутствует, или p = 0 если бит четности отсутствует; единица в знаменателе отражает наличие стартового бита. Т.е. 1 бит на скорости 115200 бод будет передаваться в идеале со скоростью: 115200 * 8 / (8 + 1 +1 + 0) = 92160 бит/с = 11520 байт/с = 2880 float/c = 2,88 кГц. Подскажите, пожалуйста, способен ли данный контроллер работать на 115200? На сколько упадет частота с учетом задержек при передаче между байтами/внутри байта? Каким-нибудь ПО можно оценить скорость передачи?
|
|
|
|
|
Jul 23 2018, 18:17
|
Знающий
Группа: Участник
Сообщений: 688
Регистрация: 13-05-16
Пользователь №: 91 710
|
Цитата(Auratos @ Jul 23 2018, 13:21) Подскажите, пожалуйста, способен ли данный контроллер работать на 115200? Способен. Тактовую частоту лучше скорректировать. Например, взять кварц на 18.432 МГц и включить без PLL.
|
|
|
|
|
Jul 26 2018, 05:14
|
Частый гость
Группа: Свой
Сообщений: 178
Регистрация: 19-09-07
Из: М.О. г.Фрязино
Пользователь №: 30 656
|
Цитата(Auratos @ Jul 23 2018, 13:21) Подскажите, пожалуйста, способен ли данный контроллер работать на 115200? На сколько упадет частота с учетом задержек при передаче между байтами/внутри байта? Каким-нибудь ПО можно оценить скорость передачи? 1. 115200 бод - это скорость передачи ОДНОГО БИТА и именно эта скорость является декларируемой в интерфейсах применяющих УАРТ. 2. При вашем кварце получить точно 115200 невозможно - получаемая сетка частот УАРТа допускает ближайшую частоту 111709. Это ошибка -3%. С такой ошибкой УАРТ будет работать с другим устройством, где выставлена скорость 115200 БЕЗ ВСЯКИХ ПРОБЛЕМ. 3. Совершенно непонятно о какой иной "скорости с учетом задержек" Вы пытаетесь рассуждать. Время передачи одного байта (режим 8 бит) равна 10*время передачи бита=86,8 мкс. Задержки между байтами определяются возможностями КОДА обрабатывать входящий и исходящий поток. Причем возможностями кода С ОБЕИХ СТОРОН. Нет и не может быть никаких нормативов по этому поводу. Если с обеих сторон на прием и на передачу работает ДМА, то брутто скорость будет почти не отличима от нетто. Если через прерывания, то зависит от упаковки данных в МК и латентности обработчика прерываний. Если в программном режиме - значит от латентности кода суперлупа (главного цикла). 4. Определить скорость обмена на уровне данных можно с помощью осциллографа и свободного пина, который инвертируется всякий раз, когда завершается прием блока данных. Смотрим осциллографом длительность импульса на этом пине и получаем брутто-скорость обмена. 5. Протокол обмена должен содержать элементы СИХРОНИЗАЦИИ данных, то есть нужно помимо самих данных передавать метки начала блока данных (при фиксированной длине блока), а так же слово верификации этих данных (CRC8, например). Кроме того, интерфейс RS485 может быть как дуплексным, так и полудуплексным. Сиречь, обмен может быть как одновременно в обе стороны, так и поочередно. Во втором случае появляются так же управляющие байты мастера к слейву с целью обозначить направление передачи.
|
|
|
|
|
Jul 27 2018, 02:40
|
Частый гость
Группа: Участник
Сообщений: 176
Регистрация: 20-02-14
Из: Томск
Пользователь №: 80 612
|
Цитата(Марк_Я @ Jul 26 2018, 09:14) Кроме того, интерфейс RS485 может быть как дуплексным, так и полудуплексным. Сиречь, обмен может быть как одновременно в обе стороны, так и поочередно. Во втором случае появляются так же управляющие байты мастера к слейву с целью обозначить направление передачи. Ремарка: RS485 - полудуплексный и никак иначе. Сигнал направления передачи обязан присутствовать. По этому интерфейсу можно передавать в разных направлениях только поочередно. Полнодуплексные интерфейсы с одновременной передачей в обе стороны - это к примеру RS422 или RS232.
|
|
|
|
|
Jul 27 2018, 05:47
|
Частый гость
Группа: Свой
Сообщений: 178
Регистрация: 19-09-07
Из: М.О. г.Фрязино
Пользователь №: 30 656
|
Цитата(amiller @ Jul 27 2018, 05:40) Ремарка: Ремарка ошибочна. RS485 - это многоадресный (в т.ч. мультимастерный) дуплекс или полудуплекс С ВОЗМОЖНОСТЬЮ ВЕТВЛЕНИЯ линии RS422 - это дуплекс Р2Р Читаем: https://ru.wikipedia.org/wiki/RS-485https://ru.wikipedia.org/wiki/EIA-422
|
|
|
|
|
Jul 27 2018, 06:21
|
Частый гость
Группа: Участник
Сообщений: 176
Регистрация: 20-02-14
Из: Томск
Пользователь №: 80 612
|
Цитата(Марк_Я @ Jul 27 2018, 09:47) Ремарка ошибочна. RS485 - это многоадресный (в т.ч. мультимастерный) дуплекс или полудуплекс С ВОЗМОЖНОСТЬЮ ВЕТВЛЕНИЯ линии RS422 - это дуплекс Р2Р Читаем: https://ru.wikipedia.org/wiki/RS-485https://ru.wikipedia.org/wiki/EIA-422Я применяю эти интерфейсы на практике. Прежде чем давать ссылки на статьи, прочитайте что в них написано. Или покажите, как организовать дуплексную связь на одном интерфейсе RS485, который представляет собой физически одну дифференциальную линию. А RS422 - это по сути объединение двух интерфейсов RS485, где один канал передает данные в одну сторону, а другой - в другую. А совместно эти два канала способны обеспечить дуплексную связь между двумя точками.
|
|
|
|
|
Jul 27 2018, 06:38
|
Частый гость
Группа: Свой
Сообщений: 178
Регистрация: 19-09-07
Из: М.О. г.Фрязино
Пользователь №: 30 656
|
Цитата(amiller @ Jul 27 2018, 09:21) Я применяю эти интерфейсы на практике. И я применяю. Но ни Ваши применения, ни мои ничего не доказывают. Цитата(amiller @ Jul 27 2018, 09:21) Прежде чем давать ссылки на статьи, прочитайте что в них написано. Вы полагаете, что я не читал?)))) Можете ограничиться правой главной рамкой из статьи. Внизу этой рамки ПРЯМО указано на наличие и полнодуплексного и полудуплексного режимов, а так же обозначения сигналов для обоих этих случаев. Цитата(amiller @ Jul 27 2018, 09:21) Или покажите, как организовать дуплексную связь на одном интерфейсе RS485, который представляет собой физически одну дифференциальную линию. Это Ваша фантазия. RS485 может иметь как одну, так и две витых пары. И даже в даташитах Аналог девайса на ДУПЛЕКСНУЮ ADM488/489 прямо так и указано про RS485: http://www.analog.com/media/en/technical-d.../ADM488_489.pdfЦитата(amiller @ Jul 27 2018, 09:21) А RS422 - это по сути объединение двух интерфейсов RS485 Это так же Ваша фантазия. Мало того, я так же как и Вы долгое время был в аналогичном заблуждении. ЗЫ. В догон: https://www.maximintegrated.com/en/app-note...ndex.mvp/id/736
|
|
|
|
|
Jul 27 2018, 07:33
|
Частый гость
Группа: Участник
Сообщений: 176
Регистрация: 20-02-14
Из: Томск
Пользователь №: 80 612
|
Цитата(Марк_Я @ Jul 27 2018, 10:38) Это так же Ваша фантазия. Мало того, я так же как и Вы долгое время был в аналогичном заблуждении. Может Вы сейчас снова находитесь в заблуждении, только уже в другом? Меня статья по первой ссылке ни в чём не убеждает. Она написана такими же людьми, как и мы. И табличка справа противоречит основному тексту. Строка 2: Регламентирует электрические параметры полудуплексной многоточечной дифференциальной линии связи типа «общая шина». Строка примерно 9: В стандарте RS-485 для передачи и приёма данных используется одна витая пара проводов, иногда сопровождаемая экранирующей оплеткой или общим проводом. Для меня лично эти параметры несовместимы с режимом работы "дуплекс". А по этой Вашей ссылке: http://www.analog.com/media/en/technical-d.../ADM488_489.pdfПриведена документация на компонент, который может применяться как в режиме RS485, так и в режиме RS422. Так вот Full Duplex возможен именно в режиме RS422. Вот фрагмент с 14 страницы этого документа: The most significant difference between the RS-422 and RS-485 is that the RS-485 drivers can be disabled, thereby allowing up to 32 receivers to be connected to a single line. Only one driver should be enabled at a time, but the RS- 485 standard contains additional specifications to guarantee device safety in the event of line contention. Для меня это означает, что одновременная передача и прием данных в интерфейсе RS485 невозможна, поэтому для этого интерфейса можно говорить только о полудуплексном режиме применения.
|
|
|
|
|
Jul 28 2018, 08:20
|
Частый гость
Группа: Участник
Сообщений: 176
Регистрация: 20-02-14
Из: Томск
Пользователь №: 80 612
|
Цитата(Марк_Я @ Jul 27 2018, 13:12) Можете сами поискать в интернете по ключевой фразе full duplex RS485 Я попробовал поискать. Яндекс дает на ключевые слова "RS485 full duplex" - 45 миллионов результатов. А на слова "RS485 half duplex" - всего 30 миллионов результатов. Поэтому Вам присуждается победа по очкам. Хотя с точки зрения интернета full более модно, чем half, поэтому преимущество гарантировано. Однако для установления истины нужен первоисточник, а не вторичные материалы. Я попробовал поискать действующий стандарт TIA/EIA-485. Странно, но быстро найти не удалось, по крайней мере бесплатно. Если у кого то есть, прошу поделиться ссылкой. То что я находил, не может претендовать на абсолютную истину, например: http://www.interfacebus.com/Design_Connector_RS485.htmlВ этом источнике, а также в огромном количестве других материалов в сети в первых строчках описания RS485 явно указано, что это полудуплексный интерфейс. Я допускаю для организации дуплекса применение двух каналов RS485 и понимаю отличия такого варианта от RS422. Но отношу такой вариант скорее к нестандартному использованию RS485. По крайней мере в реальных устройствах такого способа организации связи встречать не приходилось. Может не везло просто. Или наоборот, повезло не встретить...
|
|
|
|
|
Jul 28 2018, 09:15
|
Частый гость
Группа: Свой
Сообщений: 178
Регистрация: 19-09-07
Из: М.О. г.Фрязино
Пользователь №: 30 656
|
Цитата(amiller @ Jul 28 2018, 11:20) Я допускаю... Но отношу... Милейший, как Вы сами понимаете, мне совершенно безразлично что Вы допускаете и куда Вы это допущенное относите. Я, как и Вы, пользуюсь лишь общепринятой терминологией. А эта терминология ДОПУСКАЕТ использование четырехпроводной RS485. Гомерически смешно доказывать это или иное "по очкам". На основании чего я делаю окончательный вывод об ошибочности Вашего начального комментария. Тем более, что он не имел никакого отношения к поставленному ТС вопросу.
|
|
|
|
|
Jul 28 2018, 10:36
|
Частый гость
Группа: Участник
Сообщений: 176
Регистрация: 20-02-14
Из: Томск
Пользователь №: 80 612
|
Цитата(Марк_Я @ Jul 28 2018, 13:15) Милейший, как Вы сами понимаете, мне совершенно безразлично что Вы допускаете и куда Вы это допущенное относите. Я, как и Вы, пользуюсь лишь общепринятой терминологией. А эта терминология ДОПУСКАЕТ использование четырехпроводной RS485. Гомерически смешно доказывать это или иное "по очкам". На основании чего я делаю окончательный вывод об ошибочности Вашего начального комментария. Тем более, что он не имел никакого отношения к поставленному ТС вопросу. Мне собственно тоже совершенно безразлично, что Вы пишете, если уж на то пошло. Единственное, что мне интересно, это оригинал стандарта. И не для того, чтобы Вас в чём то убедить, а в том, чтобы убедиться самому. Пока я этого не увидел, я считаю правильным такое утверждение: EIA-485 [TIA-485] Balanced (differential) interface; defines the Physical layer, signaling protocol is not defined. EIA485 is also called the RS485 standard, but the term RS485 is out-dated. EIA-485 specifies bidirectional, half-duplex data transmission. Эту фразу можно увидеть много где, в том числе и в переводе на русский язык. Одна из ссылок в моем предыдущем посте. А это означает, что RS485 - полудуплексный интерфейс, на что я и обратил внимание ТС. А любые допущения к делу не относятся.
|
|
|
|
|
Jul 28 2018, 13:45
|
Частый гость
Группа: Свой
Сообщений: 178
Регистрация: 19-09-07
Из: М.О. г.Фрязино
Пользователь №: 30 656
|
Цитата(amiller @ Jul 28 2018, 13:36) Эту фразу можно увидеть много где, в том числе и в переводе на русский язык. дадада... Все участники альянса выработавшего стандарт ошибаются, а наш упрямый товарисч - нет. Пешы исчо.
|
|
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|