El PIC16F88 que tenias soporta hasta 20Mhz. Estas son las especificaciones que el fabricante da y que garantiza que funciona.
Podes ponerle un cristal de 40Mhz ? ( primero que es dificil encontrar uno de ese valor )
Si podes ponerle, pero no te puedo asegurar que fuera a andar. Primero por que no se si va a oscilar con el oscilador que tenga el PIC.
Ahora supongamos que tenes un reloj externo de 40Mhz en ves de un cristal por el tema del oscilador, ahora tenes otro problema, todas la electronica adentro necesita de un tiempo para llevarse a cabo, si vos lo alimentas con una frecuencia mucho mayor que lo que pueden responder estos circuitos ahi vas a tener problemas. ya que como puede haber mal funcionamientos, como puede funcionar bien , como tambien puede no andar para nada.
Un aumento en la frecuencia tambien implica un aumento de consumo. Y de disipacion de potencia.
En fin... hacele caso al fabricante, ellos te dan los limites de operacion, respetalos y no vas a quemar nada. No ganas nada haciendo eso cuando por 0.10 centavos de dolar mas tenes uno funcionando a esa otra frecuencia.
Con respecto a
#use delay(clock=40M) //cristal a 40 megas de velocidad
Vos ahi no le definis la velocidad del micro, no es que si pones 90Mhz va a funcionar a 90Mhz, eso es solo para que el compilador sepa a que velocidad iria el micro y poder calcular cuantos ciclos le toma para hacer un delay.
Un ejemplo simple
Suponete que usas tu PIC a 8Mhz
En tu programa tenes asi:
#use delay(clock=8M)
while(1){
led = 1;
delay_ms(1000);
led = 0;
}
Es decir enciende y apaga el led cada 1 segundo, perfecto, si ahora vos cambias el valor del #use delay por 4M y compilas el mismo codigo, pero NO le cambias la frecuencia del PIC ( es decir sigue a 8Mhz )
Tu codigo va a encender y apagar cada 0.5 segundos.
Por que el compilador calculo el retardo como si tuvieras un cristal de 4Mhz.
Asi que vuelvo a repetir, esa no es para elegir la frecuencia del micro sino que es para indicarle al compilador a que velocidad lo estas haciendo andar y asi el puede calcular para que los delays funcionen correctamente.