Hola amigos, para poder utilizar el PIC12F629/675 usando el oscilador interno 4Mhz,
hay que tener en cuenta que puede tener un error de +/-200Khz, esto es un error muy
elevado para utilizar rutinas que necesitan medir el tiempo con una cierta precisión como
le pasa a la función que simula el protocolo de la capa de bajo nivel del RS232. Para poder
calibrar este oscilador interno microchip nos proporciona un registro interno “OSCCAL” ,
de este registro solo son útiles los 6 bit de mayor peso. Para facilitar este trabajo microchip
escribe el valor de calibración distinto para cada chip que fabrica en la ultima posición de
memoria flash 3FFh (para el PIC12F675 que tiene 1Kword, el valor que nos interesa esta en
el Byte bajo 34xx), este valor lo borramos fácilmente si no tenemos cuidado y es irrecuperable
por eso es recomendable leer primero el pic y guardar este valor. Según tengo entendido
hay algunos programadores a los que se le puede indicar que no borren nunca este valor.
También Microchip nos indica en el datasheet mediante una rutinita en Assembler como cargar
este valor en el registro OSCCAL durante el arranque de forma automática. Es misión del
programador ya sea de una forma u otra la de cargar el registro OSCCAL con el valor adecuado,
en ningún caso lo hace el propio micro por su cuenta. Usando el valor que graba el fabricante en
cada micro se consigue una calibración <2% de error para ser mas exacto tenemos una media
de 1.5% de error y si este valor lo calculamos nosotros, hay varios métodos, podemos llegar
fácilmente a 0.15% de error de media. Y no sigo mas porque estoy escribiendo un articulo
que saldrá publicado precisamente sobre este tema...
PD: En la direccion de la flash 3FFh se encuentra el valor escrito por el fabricante 34xx, siendo
34 la instruccion codigo maquina cuyo nemonico es RETLW y xx el dato osccal, RETLW xx que
traducido seria carga xx en el registro W y retorna despues del Call, despues de esto solo
queda pasar el valor que contiene W al registro OSCCAL como indica el compañero mas abajo.