Hola _LAB._:
Te aclaro que nunca usé un micro como el tuyo y puede que no sea correcto lo que te informo pero viendo el datasheet debería ser así.
En la gama de los pic 18f que soportan usb podés generar dos velocidades de trabajo una para el módulo usb y otra para la CPU del micro.
Es decir, podés alimentar con una misma frecuencia de cristal tanto el pll (para que este genere los 48mhz que necesita el USB) como también hacer trabajar la cpu del micro con una velocidad diferente a la del módulo usb.
Fijate en la página 36 del
datasheet el diagrama de configuración.
Las 3 directivas que más abajo te transcribo hacen la selección de las frecuencias:
#pragma config OSC = HSPLL // HS crystal
selecciona el modo de oscilador: en tu caso: cristal externo de alta velocidad y haciendo funcionar al pll.
#pragma config PLLDIV = 4 //divide x4 frec input 16Mhz
divide por 4 la frecuencia del cristal de entrada para que al pll le lleguen los 4mhz que necesita para funcionar y generar así los 96mhz que luego son divididos por 2 para llegar a los 48mhz del módulo usb.
#pragma config CPUDIV = OSC1 //no Fosc divisor
Este es un postcaler que permite dividir la frecuencia que viene directamente del cristal o que viene del pll, dependiendo si el pll está activo o no.
En tu caso como viene del Pll (96mhz/2=48mhz) los 48 mhz no son divididos por lo que el CPU del micro debería estar trabajando a 48mhz.
Mirá en el
datasheet en la página 41 el cuadro que muestra las distintas configuraciones y las velocidades de trabajo del cpu. Y en tu caso podés ver la del cristal de 16mhz. En la cual dice que el CPU trabaja a 48mhz.
Contá un poco más el tema de los cálculos que has hecho para ver si están bien. Podés usar también el stopwatch del mplab para verificar el tiempo transcurrido en un retardo para corroborarlo.
Saludos.
Jukinch