Que tal ledfacil,
No tengo experiencia para nada con NIPLE. Pero sí la tengo con ese microcontrolador (PIC12F629). Si bieen mencionas el OSCCAL es un registro, pero este no contiene el valo de calibración de fábrica del oscilador interno. Voy a tratar de explicarlo.
El registro OSCCAL es un registro de función especial dentro de RAM del microcncontrolador, el cual sirve para cargar el valor de calibración del oscilador interno. Ahora bien, ese valor de calibración para el oscilador interno, está grabado en la última dirección de la memoria de programa del microcontrolador, que en este caso para el microcontrolador PIC12F629 es la dirección: 0x3FF.
En esa dirección de la memoria de programa se encuentra grabada la instrucción "RETLW XX" donde XX es el valor de calibración para el oscilador interno, y ese valor 'XX' es diferente para cada PIC12F629. Lo que hace NIPLE u otro compilador es realizar una llamada a subrutina a la dirección 0x3FF y entonces se encuentra con la la instrucción del RETLW XX, entonces ese valor de XX se asigna al registro de trabajo W, luego lo que hace es cargar o mover ese valor al registro de función especial OSCCAL. Si miras la hoja de datos, esto se especifíca claramente en la página 54 usando ensamblador.
bsf STATUS, RP0 ;Cambia al banco 1 de la memoria RAM
call 3FFh ;Obtén el valor de calibración del oscilador interno de la última dirección de la memoria de programa
movwf OSCCAL ;Asigna ese valor al registro OSCCAL
bcf STATUS, RP0 ;Cambia al banco 0 de la memoria RAM
Eso es lo que realmente hacen los compiladores o bien es lo que necesitas hacer manualmente para configurar correctamente el valor de calibración del oscilador interno.
Ahora bien, lo que te puede estar pasando es que si no cambias correctamente de banco al hacer alguna asignación en algún registro de función especial, podrías estar cambiando el valor del OSCCAL. Me explico, la dirección del registro OSCCAL en la memoria RAM es el 0x90 , pero para accesar a dicha dirección o registro necesitas cambiar al banco 1, ya que si no lo haces en realidad estarías modificando el registro del T1CON y viceversa, es decir para modificar el registro OSCCAL tienes que cambiarte al banco 1 de la memoria RAM y ya modificado te regresas al banco 0, tal como se muestra en el segmento de códio antes mencionado, de otro modo estaría trabajando en el banco equivocado y si en tu código estás intentando configurar el T1CON en realidad estarías modificando el registro OSCCAL.
Ahora bien, el pickit 2 tiene la protección automática de no tocar la última dirección de la memoria de programa cuando le aplicas el comando de borrar dispositivo (Erase). Muchos clones u otros programadores no poseen dicha característica y al aplicar el comando de borrar dispositivo borran TODO el contenido de TODA la memoria y ahí es que pierdes esa instrucción del RETLW XX, teniendo que recurrir a diferentes métodos para recuperar dicho valor de calibración. Entre ellos el de autoregeneración.
Por lo anterior no existe ninguna forma de protección externa por código para que esa dirección sea "bloqueada" o protegida contra borrado accidental. Todo depende de la persona que está programando y del cuidado y la atención que tiene a la hora de realizar el código, y del tipo de programador que sea capaz de proteger esa dirección manteniéndola intacta.
Espero no haberte confundido y haberte ayudado a entender mejor el funcionamiento del oscilador interno de este microcontrolador.
saludos,
elreypic.