Перейти к содержанию

    

PIC18F25K22. Максимальная скорость передачи по USART

Добрый день. Попала ко мне в руки платка с контроллером 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? На сколько упадет частота с учетом задержек при передаче между байтами/внутри байта? Каким-нибудь ПО можно оценить скорость передачи?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
Подскажите, пожалуйста, способен ли данный контроллер работать на 115200?

Способен.

Тактовую частоту лучше скорректировать.

Например, взять кварц на 18.432 МГц и включить без PLL.

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
Подскажите, пожалуйста, способен ли данный контроллер работать на 115200? На сколько упадет частота с учетом задержек при передаче между байтами/внутри байта? Каким-нибудь ПО можно оценить скорость передачи?

1. 115200 бод - это скорость передачи ОДНОГО БИТА и именно эта скорость является декларируемой в интерфейсах применяющих УАРТ.

2. При вашем кварце получить точно 115200 невозможно - получаемая сетка частот УАРТа допускает ближайшую частоту 111709. Это ошибка -3%. С такой ошибкой УАРТ будет работать с другим устройством, где выставлена скорость 115200 БЕЗ ВСЯКИХ ПРОБЛЕМ.

3. Совершенно непонятно о какой иной "скорости с учетом задержек" Вы пытаетесь рассуждать. Время передачи одного байта (режим 8 бит) равна 10*время передачи бита=86,8 мкс.

Задержки между байтами определяются возможностями КОДА обрабатывать входящий и исходящий поток. Причем возможностями кода С ОБЕИХ СТОРОН. Нет и не может быть никаких нормативов по этому поводу. Если с обеих сторон на прием и на передачу работает ДМА, то брутто скорость будет почти не отличима от нетто. Если через прерывания, то зависит от упаковки данных в МК и латентности обработчика прерываний. Если в программном режиме - значит от латентности кода суперлупа (главного цикла).

4. Определить скорость обмена на уровне данных можно с помощью осциллографа и свободного пина, который инвертируется всякий раз, когда завершается прием блока данных. Смотрим осциллографом длительность импульса на этом пине и получаем брутто-скорость обмена.

5. Протокол обмена должен содержать элементы СИХРОНИЗАЦИИ данных, то есть нужно помимо самих данных передавать метки начала блока данных (при фиксированной длине блока), а так же слово верификации этих данных (CRC8, например). Кроме того, интерфейс RS485 может быть как дуплексным, так и полудуплексным. Сиречь, обмен может быть как одновременно в обе стороны, так и поочередно. Во втором случае появляются так же управляющие байты мастера к слейву с целью обозначить направление передачи.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
Кроме того, интерфейс RS485 может быть как дуплексным, так и полудуплексным. Сиречь, обмен может быть как одновременно в обе стороны, так и поочередно. Во втором случае появляются так же управляющие байты мастера к слейву с целью обозначить направление передачи.

Ремарка: RS485 - полудуплексный и никак иначе. Сигнал направления передачи обязан присутствовать. По этому интерфейсу можно передавать в разных направлениях только поочередно. Полнодуплексные интерфейсы с одновременной передачей в обе стороны - это к примеру RS422 или RS232.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
Ремарка:

Ремарка ошибочна.

RS485 - это многоадресный (в т.ч. мультимастерный) дуплекс или полудуплекс С ВОЗМОЖНОСТЬЮ ВЕТВЛЕНИЯ линии

RS422 - это дуплекс Р2Р

Читаем: https://ru.wikipedia.org/wiki/RS-485

https://ru.wikipedia.org/wiki/EIA-422

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
Ремарка ошибочна.

RS485 - это многоадресный (в т.ч. мультимастерный) дуплекс или полудуплекс С ВОЗМОЖНОСТЬЮ ВЕТВЛЕНИЯ линии

RS422 - это дуплекс Р2Р

Читаем: https://ru.wikipedia.org/wiki/RS-485

https://ru.wikipedia.org/wiki/EIA-422

Я применяю эти интерфейсы на практике.

Прежде чем давать ссылки на статьи, прочитайте что в них написано.

Или покажите, как организовать дуплексную связь на одном интерфейсе RS485, который представляет собой физически одну дифференциальную линию.

А RS422 - это по сути объединение двух интерфейсов RS485, где один канал передает данные в одну сторону, а другой - в другую.

А совместно эти два канала способны обеспечить дуплексную связь между двумя точками.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
Я применяю эти интерфейсы на практике.

И я применяю. Но ни Ваши применения, ни мои ничего не доказывают.

Прежде чем давать ссылки на статьи, прочитайте что в них написано.

Вы полагаете, что я не читал?))))

Можете ограничиться правой главной рамкой из статьи. Внизу этой рамки ПРЯМО указано на наличие и полнодуплексного и полудуплексного режимов, а так же обозначения сигналов для обоих этих случаев.

Или покажите, как организовать дуплексную связь на одном интерфейсе RS485, который представляет собой физически одну дифференциальную линию.

Это Ваша фантазия. RS485 может иметь как одну, так и две витых пары. И даже в даташитах Аналог девайса на ДУПЛЕКСНУЮ ADM488/489 прямо так и указано про RS485:

http://www.analog.com/media/en/technical-d.../ADM488_489.pdf

А RS422 - это по сути объединение двух интерфейсов RS485

Это так же Ваша фантазия. Мало того, я так же как и Вы долгое время был в аналогичном заблуждении.

ЗЫ. В догон:

https://www.maximintegrated.com/en/app-note...ndex.mvp/id/736

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
Это так же Ваша фантазия. Мало того, я так же как и Вы долгое время был в аналогичном заблуждении.

Может Вы сейчас снова находитесь в заблуждении, только уже в другом?

Меня статья по первой ссылке ни в чём не убеждает. Она написана такими же людьми, как и мы. И табличка справа противоречит основному тексту.

Строка 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 невозможна, поэтому для этого интерфейса можно говорить только о полудуплексном режиме применения.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
В стандарте RS-485 для передачи и приёма данных используется одна витая пара проводов, иногда сопровождаемая экранирующей оплеткой или общим проводом.

Мне начинает надоедать хождение по кругу:

https://www.maximintegrated.com/en/app-note...ndex.mvp/id/736

http://ftp1.digi.com/support/documentation/90000848-88.pdf

https://www.moxa.com/doc/manual/OPT8I/OPT8I_HIG_v1.pdf

https://www.mikrocontroller.net/attachment/39674/digione.pdf

http://dinorte.com.ar/pdf/RS485_RS422_Basics.pdf

Нужно еще? Или все они ошибаются?

Вот еще Аналог девайс с ЯВНЫМ указанием в заголовке на full duplex RS485

http://www.analog.com/media/en/technical-d...5_4856_4857.pdf

Вот у Техаса

https://www.ti.com/lit/ds/symlink/iso35.pdf

http://www.farnell.com/datasheets/1856006.pdf

Вот еще:

https://www.surveillance-video.com/media/la...mport/D1315.pdf

http://www.8051projects.net/files/public/1...s458_on_avr.pdf

Можете сами поискать в интернете по ключевой фразе full duplex RS485

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
Можете сами поискать в интернете по ключевой фразе 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. По крайней мере в реальных устройствах такого способа организации связи встречать не приходилось. Может не везло просто. Или наоборот, повезло не встретить...

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
Я допускаю...

Но отношу...

Милейший, как Вы сами понимаете, мне совершенно безразлично что Вы допускаете и куда Вы это допущенное относите.

Я, как и Вы, пользуюсь лишь общепринятой терминологией. А эта терминология ДОПУСКАЕТ использование четырехпроводной RS485. Гомерически смешно доказывать это или иное "по очкам".

На основании чего я делаю окончательный вывод об ошибочности Вашего начального комментария. Тем более, что он не имел никакого отношения к поставленному ТС вопросу.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
Милейший, как Вы сами понимаете, мне совершенно безразлично что Вы допускаете и куда Вы это допущенное относите.

Я, как и Вы, пользуюсь лишь общепринятой терминологией. А эта терминология ДОПУСКАЕТ использование четырехпроводной 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 - полудуплексный интерфейс, на что я и обратил внимание ТС. А любые допущения к делу не относятся.

 

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
Эту фразу можно увидеть много где, в том числе и в переводе на русский язык.

дадада... Все участники альянса выработавшего стандарт ошибаются, а наш упрямый товарисч - нет.

Пешы исчо.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти
Авторизация