Si el oscilador toma unos cuantos pasos mas.. En realidad lo que se complica es el PLL, ya que posee mas pasos para llegar a la frecuencia final.
En si lo unico que te importa de como calcularlo es esta imagen:
En ella no solo vas a ver los divisores, sino que ademas tenes que cumplir de forma exacta con los limites ( los valores de los limites en la imagen son incorrectos, referite a la seccion "oscillator" ) que te impone cada etapa.
Otro cambio es que usualmente comenzabas calculando desde el cristal hacia el PLL. Ahora simplemente calculas lo externo al PLL tratando de cumplir las condiciones del mismo, para luego finalizar con el valor del PLL.
En el PDF explica como calcularlo, ejemplo, si queres tener 120Mhz a la salida del PLL. Comenzas calculando primero PLLPOST.
Segun la imagen tenes que cumplir que antes del PLLPOST la frecuencia tiene que ser de : 120Mhz <= Fvco <=340 Mhz
Los valores de PLLPOST son dividido 2/4/8/16 etc.. Si uso dividido 4 quiere decir que antes tenia 480Mhz lo cual es imposible, entonces tengo que usar dividido 2, lo cual me deja a Fvco en 240Mhz y esta en el rango permitido.
Ahora me voy al comienzo. con PLLPRE y me dice que a la salida debo tener si o si entre 0.8MHz y 8MHz, si poseo un cristal de 20Mhz y los valores de PLLPRE pueden ser 1/2/3/4/5/6/10/12
Debo elegir un valor tal que me caiga en esos limites, ademas lo ideal seria elegir un valor aproximado que sea al dividir 240MHz ( lo anterior) sea lo mas entero posible.
Si elegimos PLLPRE en la relacion 1:4, a la salida tendremos 5Mhz
Ahora solo resta calcular el PLLDIV ( o de feedback, que es el que compone realmente el PLL, los demas son divisores solamente ), Y lo calculamos como:
240MHz / 5MHz = 48
O para que se entienda... Realmente el PLL es la parte central, la cual debe ingresar una frecuencia entre 0.8 y 8MHz y posee una salida de entre 120 y 340MHz, se deben cumplir estos valores para que el PLL se enganche y funcione.
Los codigos te los da el mismos datasheet:
// Oscilador interno al inicio y deshabilita el cambio automatico al oscilador principal, FUSES
_FOSCSEL(FNOSC_FRC & IESO_OFF);
// Habilita el cambio de clock y configura el oscilador principal POSC en modo XT
_FOSC(FCKSM_CSECMD & OSCIOFNC_OFF & POSCMD_XT);
int main()
{
// Configure PLL prescaler, PLL postscaler, PLL divisor
PLLFBD=46; // M=48
CLKDIVbits.PLLPOST=0; // N2=2
CLKDIVbits.PLLPRE=2; // N1=4
// Inicio cambio de clock Al oscilador Primario con POLL (NOSC=0b011)
__builtin_write_OSCCONH(0x03);
__builtin_write_OSCCONL(OSCCON | 0x01);
// Espera hasta el cambio de clock
while (OSCCONbits.COSC!= 0b011);
// Espera hasta que el PLL enganche
while (OSCCONbits.LOCK!= 1);
Una cosa mas, vas a ver que posee una funcion __builtin, esto es porque ese registro ademas de escribirse simplemente uno debe realizar una secuencia, es un modo de proteccion contra un cambio involuntario. Por eso mismo se usan estas funciones.