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