Debido a que he visto un montón de gente que ha preguntado qué es el OSCCAL, qué significa, si se puede recuperar et cétera, he decidido escribir esta pequeña explicación técnica.
¿Qué es OSCCAL?
Cuando se fabrican los PICs, al igual que sucede con muchos otros dispositivos electrónicos, no todas las unidades de un mismo modelo terminan siendo idénticas. No obstante, todos sus osciladores internos deben ser totalmente exactos, ya que de ellos dependen todas las operaciones que requieran algún cronometraje. Para asegurar su correcto funcionamiento, el propio fabricante calcula e introduce un valor de calibración que se programa luego en todos y cada uno de los PICs, de manera que se puede garantizar una gran precisión en la frecuencia resultante del oscilador (e.g. el 12F629 tiene una precisión del 1%). Dicho valor es (como probablemente ya hayas imaginado) el OSCCAL, y en el caso del 12F629 se encuentra en la dirección 0x3FF.
¿Por qué es importante?
Como ya he mencionado, su importancia es vital para las operaciones que requieren alguna estimación de tiempo. Por ejemplo, imaginemos el lector de la Wii que requiere un tiempo de espera entre dos comandos consecutivos, de manera que la unidad termine de procesar el primero antes de recibir el segundo. Supongamos ahora que ese tiempo es de 5 ms y que nuestro oscilador está mal calibrado y funciona a una frecuencia de 3.8 MHz en vez de los 4 MHz a los que debería funcionar.
Calibración correcta: 5 ms / 4 MHZ = 0.000000001250000
Calibración incorrecta: 0.000000001250000 * 3.8 MHz = 0.00475 = 4.75 ms
Como se puede observar, el espacio de tiempo entre ambos comandos sería menor al necesario y el segundo comando fallaría.
¿Qué significa?
El valor de OSCCAL consta de 2 bytes, de los cuales el primero siempre es 0x34 y el segundo es realmente el valor de calibración (realmente se trata de una instrucción con una parámetro, pero esa explicación queda fuera de ámbito de este documento). Los valores que puede tomar van desde 0x00 hasta 0xFF; no obstante, sólo se tienen en cuenta los 6 primeros bits de este octeto. Por ejemplo, los valores 0x10 y 0x11 calibrarían el oscilador a la misma frencuencia, mientras que 0x14 le daría una frencuencia distinta.
¿Se puede recuperar?
Sí, pero el proceso idóneo es complicado. La forma más precisa de hacerlo es conectando un medidor de frecuencias a una de las salidas del PIC, pero no todo el mundo dispone de uno. Una forma un poco chapucera de recalibrarlo es ir probando valores de otros PICs y luego comprobar si funciona una vez instalado en la consola.
Disclaimer: Empecé a programar para PICs hace una semana, todo esto podría ser sólo un montón de BS.