Цитата(ZEbr @ May 12 2014, 19:03)

Есть кварц 16MHz. ...
Смотрим
конфигурацию осцилятора (стр.3).
Видим, что для того, что бы на входе PLL была частота 4 .. 5MHz, нужно сначала разделить эти 16 на 4. Так что должна быть директива в прагме:
FPLLIDIV = DIV_4. Потом эти 4 (которые получаем на входе PLL) нужно умножить на 20, значить FPLLMUL = MUL_20. Дальше, эту частоту без изменений нужно подавать дальше, т.е. FPLLODIV = DIV_1:
Код
#pragma config FPLLODIV = DIV_1, FPLLMUL = MUL_20, FPLLIDIV = DIV_4, POSCMOD = HS, FPBDIV = DIV_1, FNOSC = PRIPLL
А потом, что бы "выжать" максимальную частоту, нужно пользоваться не "PORTX =", а "PORTXINV =":
Код
while(1){
PORTDINV = 1;
}
При такой конфигурации, частота на выводе получается около 16МГц. Это из-за того, что цикл, организованный С инструкцией while, тоже занимает несколько машинных циклов. На самом деле самую высокую частоту можно увидеть вот таким кодом:
Код
while(1){
PORTDINV = 1;
PORTDINV = 1;
PORTDINV = 1;
PORTDINV = 1;
PORTDINV = 1;
PORTDINV = 1;
PORTDINV = 1;
PORTDINV = 1;
PORTDINV = 1;
PORTDINV = 1;
PORTDINV = 1;
PORTDINV = 1;
PORTDINV = 1;
PORTDINV = 1;
PORTDINV = 1;
PORTDINV = 1;
PORTDINV = 1;
PORTDINV = 1;
PORTDINV = 1;
PORTDINV = 1;
PORTDINV = 1;
PORTDINV = 1;
PORTDINV = 1;
PORTDINV = 1;
PORTDINV = 1;
....
}
конечно, только во время исполнения тела цикла.
ПП Некоторые образцы 32-го допускают небольшой (без экстремизма, конечно) "оверклокинг"... но это отдельная тема.