Página 54 de la Hoja de datos :
Enlanota3especificaquetodalamemoriadelprograma,incluidoelvalorOSCCAL,seborradurantelaprogramación.Debodecirquepareceuncomportamientomuyextraño,peroMicrochiptendrásusrazones,estoyseguro.
Enlanota1dicequedebeleerelvaloractualyguardarloenalgúnlugarantesdeborrarelchiplistoparareprogramarlo.Porextensión,aunquenoseespecifiquelocontrario,debevolveraescribirelvalordespuésdeborrarelchip.
Estasnotastambiénserepitenenlapágina56,Sección9.2.5.1:
También da un ejemplo de cómo calibrar el oscilador, aunque no está del todo claro. Por lo que sé, todo lo que está haciendo el código es cargar algún valor almacenado en el programa y luego guardarlo en el registro OSCCAL. El equivalente de C será algo así como la primera línea en main()
:
OSCCAL = <some value>;
Por supuesto, el valor será el valor de calibración que haga que el oscilador interno del reloj tenga la velocidad correcta. Sin embargo, si ha borrado este valor, deberá ver si está escrito en algún lugar o intentar experimentar con diferentes valores hasta encontrar el correcto.
Si la frecuencia del reloj no es crítica (es decir, no necesita una sincronización precisa), seleccione cualquier valor, digamos 0x80, ya que es el valor medio.
Si necesita una sincronización precisa, deberá probar diferentes valores y medir la frecuencia del reloj. La forma más sencilla de obtener una cifra aproximada es tener un código que espere exactamente 1 millón de ciclos de reloj de instrucción, luego encienda un LED. Luego, puede medir el tiempo que tarda el LED en parpadear (debería estar 1s encendido, 1s apagado) y luego probar diferentes valores OSCCAL de manera sistemática hasta que esté parpadeando a la velocidad correcta.