Su pregunta relacionada dice que está usando un 12F629, así que me referiré a esta hoja de datos a lo largo.
Muchos microcontroladores modernos tienen osciladores incorporados. Estos son bastante precisos, pero la frecuencia exacta variará debido al proceso de fabricación. Debido a esto, la mayoría de estos microcontroladores tienen alguna forma de "afinar" o calibrar el oscilador mientras se está ejecutando.
Con el PIC 12F (y otras familias de PIC similares) hay un registro llamado OSCCAL
. Puede leer sobre esto en la sección 9.2.5.1 "Calibración del oscilador interno" en la página 56 de la hoja de datos que vinculé anteriormente.
La hoja de datos dice:
Se programa una instrucción de calibración en la última ubicación de la memoria del programa. Esta instrucción es un RETLW XX
, donde el literal es el valor de calibración. El literal se coloca en el registro OSCCAL
para establecer la calibración del oscilador interno.
Este valor puede ser calculado y establecido por los programadores PICKit2 y PICKit3 de Microchip y probablemente por algunas de las mejores herramientas compatibles.
El
Ejemplo 9-1 en la página 56 muestra cómo se carga esto en el registro OSCCAL
, que es volátil y, por lo tanto, debe configurarse en cada encendido.
BSF STATUS, RP0 ; Bank 1
CALL 3FFh ; Get the cal value
MOVWF OSCCAL ; Calibrate
BCF STATUS, RP0 ; Bank 0
Este es un simple fragmento de código que selecciona el banco correcto, llama a la última ubicación de memoria (0x3FF) y luego mueve el resultado al registro OSCCAL
. Esto explica por qué el último byte en un archivo hexadecimal se desmonta a RETLW XX
, simplemente devuelve el valor de calibración.
Si desea utilizar este valor que se almacena en el programa flash, debe incluir un código pequeño como el código anterior que se ejecuta cada vez que su dispositivo se reinicia. Algunos compiladores de PIC C lo incluirán automáticamente en los dispositivos relevantes.
Puedes leer más sobre OSCCAL en los siguientes enlaces: