Primero que nada, felicidades por haber logrado portar la libreria, parece algo simple, tal ves no lo es, pero esto te va a ayudar en cualquier otra libreria
Tu codigo original
#define _XTAL_FREQ 20000000
#define __delay_ms(x) __delay32((unsigned long)((x)*(_XTAL_FREQ/10000.0)))
#define __delay_us(x) __delay32((unsigned long)((x)*(_XTAL_FREQ/10000000.0)))
Bueno no voy a meterme demasiado con el tema del oscilador.
En el PLL debe entrar 4Mhz, asi que supongo que tenes un cristal de 20Mhz. Esto general 96Mhz los cuales tenes 48Mhz para el USB y como maximo 32Mhz en tu CPU
Esos 32 es por hay hay un postscaler fijo de 1:3 ( divido 3 )
http://ww1.microchip.com/downloads/en/DeviceDoc/39700c.pdfEntonces por un lado el USB tiene 48Mhz, por el otro tu CPU tiene 32Mhz (suponiendo que no lo dividas aun mas, y que es el maximo), esto quiere decir que la frecuencia que entra a la CPU es:
#define _XTAL_FREQ 32000000
Y solo eso deberias cambiar (entonces cuando cambias de frecuencia en tu programa solo tocas eso). Microchip provee las funcion __delay_ms() y __delay_us().
Lo primero que haria es comentar esos 2 macros y probarlo. Si aun asi no funciona. Vamos a crear los macros para estos PICs
Una instruccion en un PIC16/18 tarda 4/Fosc , en ejecutarse, mientras que en un PIC24/dsPIC lo hace en 2/Fosc.
Entonces para 32Mhz, 1us en ciclos seria:
1us / ( 2/Fosc) = 16 ciclos
3us = 16 ciclos * 3 =48 ciclos
Podriamos modificar un poco mas nuestra formula, ya que 1us y 2 son constantes, y nuestra unica "variable" seria Fosc
1us / (2/Fosc) = 1*10^-6 / ( 2/Fosc ) = Fosc / 2*1*10^6 = Fosc / 2000000
Eso por cada microsegundos
#define __delay_us(x) __delay32((unsigned long)((x)*(_XTAL_FREQ/2000000.0)))
Si usamos la formula y quiero 3 microsegundos quedaria: 3 *( 32000000 / 2000000.0) = 3 * ( 16 ) = 48, que es exactamente lo que necesitabamos y decirle con __delay32() que espere 48 ciclos.
De la misma forma podemos hacer la otra para los milisegundos, en ese caso lo unico que cambia es nuestra formula que tenemos 1ms ( 1*10^-3 ) en ves de 1us, la relacion entre 1ms/1us = 1000
Por lo tanto lo unico que cambia es que no vamos a tener 2.000.000 sino 2.000 en el denominador
#define __delay_us(x) __delay32((unsigned long)((x)*(_XTAL_FREQ/2000.0)))
Felicidades si es que Microchip no te dio las funciones, ( que creo que te las da por que __delay32 es una de ellas) entonces podes crear tus propias.
Solo recordar que _delay32 no acepta menos de 12 ciclos.
--------------------------------
Si por alguna razon decidis dividir la frecuencia que entra a la CPU o por ejemplo utilizas un cristal de 20Mhz directo por que no te importa el USB, lo unico que debes cambiar es
#define _XTAL_FREQ 20000000
Por la frecuencia que entra en la CPU.