Поклонники продукции Microchip Technology Inc тусуются тут.
Ответить

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

Пн июл 23, 2018 12:48:51

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

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

Пн июл 23, 2018 13:52:48

Оценить скорость можно с помощью калькулятора.
С данным кварцем можно установить скорость 111709 , ка наиболее близкую к 115200.
Максимально 1,2 мегабита можно поставить.
Тогда будет 30720 float/c

Проблема надуманная.
Более вопрос не контроллеру а к принимающей стороне и остальной прошивке , которая генерирует поток данных. И еще в float.
Запустите симулятор и StopWatch и все станет ясно.

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

Вт июл 24, 2018 06:08:01

Как-то понадобилось подбирать скорость UART с минимум ошибок - написал программу CalcUART, может пригодиться...

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

Вт июл 24, 2018 08:46:46

Auratos, Если не предполагается работа во всём диапазоне рабочих температур - переключите, в CONFIG1H/OSCCON, задающий на HFINTOSC (16MHz) +PLL. Проще будет работать на максимальных скоростях USART...
Ответить