reloj interno PIC10F200

Estoy tratando de calibrar el reloj interno para encender una salida una vez durante 3 segundos cada 7 días con una precisión de unos pocos minutos. Pude lograr esto usando el registro OSCCAL en el chip. El problema de esto funciona si configuro esto por chip. Estoy tratando de encontrar una manera de programarlo haciendo que verifique y calibre su interior durante la programación. ¿Quizás hay una función en el compilador que se calibrará automáticamente?

Estoy usando:

UCM: PIC10F200

Programador: PICkit3

Software: MPLAB X IDE v3.26

Compilador: XC8 v1.37

¿Ha considerado un IC de calendario de reloj en tiempo real RTCC dedicado? Hay muchas variantes que usan poca energía (¡visto hasta 15 nA!) y pueden activar una MCU en una fecha y hora determinadas.
Tal vez no. ¿Sabe que hay un valor de calibración de fábrica OSCCALen la memoria flash en la ubicación 0x00FF? Consulte la página 11 de la hoja de datos .
Para que pueda comprobar y calibrarse automáticamente, necesitaría acceso a un reloj de referencia con una precisión que crea que es lo suficientemente precisa. ¿De qué otra forma sabría el PIC que su propio reloj necesita ser calibrado?
Supongo que no puede lograr minutos repetibles de precisión durante una semana usando el oscilador interno PIC, incluso con calibración. Debido a la variación de parte a parte, el compilador no pudo corregir la diferencia de frecuencia entre diferentes chips. Incluso con la calibración, la precisión de frecuencia de ±1% del oscilador de 4MHz (Tabla 12-3, página 64) no funcionará a su favor.

Respuestas (1)

El compilador no puede 'calibrarse automáticamente' porque no tiene idea de a qué frecuencia se puede ejecutar un chip individual. El programador/depurador de chips podría hacerlo descargando y ejecutando un programa en el PIC que produce una frecuencia en un pin de salida. Luego, esta frecuencia podría medirse y el OSCCALvalor de calibración requerido se calcularía e insertaría en su código.

Normalmente no necesita hacer esto porque Microchip ya lo ha hecho en la fábrica. Un byte de calibración se almacena en la última ubicación de la ROM en una MOVLWinstrucción (MOVe Literal byte to Working register). Al encender o reiniciar, el PIC ejecuta esta instrucción, por lo que el registro W tiene el byte de calibración en el inicio. Su código de inicio solo tiene que guardar este valor (¡ antes que cualquier otro código que use el registro W!) y escribirlo en el OSCCALregistro.

La calibración de fábrica probablemente no sea tan precisa como podría ser porque se realiza rápidamente y no en el circuito exacto que tiene. Es posible que pueda obtener una precisión ligeramente mejor con un programa PIC que se establezca gradualmente OSCCALen diferentes valores hasta que se acerque lo más posible a la frecuencia requerida (quizás comparándola con una frecuencia de referencia en un pin de entrada) y luego le diga qué valor de calibración debe usar. Aquí hay un ejemplo:-

Utilidad de recalibración del oscilador interno

(Nota: el proyecto en ese enlace solo funciona con 12F629 y 675. El 10F200 no tiene EEPROM, por lo que tendría que usar algún otro método para extraer el valor de calibración, por ejemplo, enviarlo como datos en serie en un pin de salida).

Pero 7 días son 10080 minutos. El PIC10F200 tiene una tolerancia de oscilador interno de +-1 % a 3,5 V, lo que corresponde a +-100 minutos en 7 días. Por lo tanto, incluso con la mejor calibración, no puede garantizar obtener una precisión de 'unos pocos minutos'.

¿Y qué hará el voltaje de suministro y la variación de temperatura con el error? Se necesita usar un XO para mediciones de tiempo "cerradas"... un TCXO para un "buen" cronometraje... y rubidio para un tiempo "preciso". O eso, o sincronizar la hora con un receptor de señal horaria y corregir la hora periódicamente.
El oscilador RC interno obviamente no es lo suficientemente bueno. Necesita alrededor de +-0.02% de precisión, por lo que un cristal estándar debería estar bien. Eso ocupa 2 pines, dejando una entrada y una salida, que con suerte serán suficientes para hacer el trabajo...