Proyecto - Recuperar valor configuración OSCCAL en PIC´s 12F629/75

----- Introducción ----------------

Hace tiempo me llamó la atención la cantidad de personas preguntando como recuperar el valor de calibración que viene grabado en ciertos PIC.

Grabado en la última posición del área de programa, este valor permite calibrar el oscilador interno a 4Mhz con una precisión de +-1%.
El problema viene, en estos micros, que si por error se borra todo el micro y no se guardo ese valor -si bien el micro seguirá funcionando normalmente- al requerir cálculos de tiempo ya no se sabrá la base a la que el oscilador interno esta trabajando.

Generalmente este valor permite variar el oscilador entre unos 780khz a 1300Khz (no todos tienen los mismos limites, aun si son del mismo modelo).

Los programadores generalmente avisan al intentar sobrescribir el valor que viene de fábrica, pero si no lo hace o se hace caso omiso a la advertencia y se sobrescribe habrá que buscar algún método para volver a recuperar dicho valor.


----- Aproximaciones --------------

Viendo por internet hay varios métodos pero todos tienen el problema de que son complicados.

Por ejemplo, Microchip presenta este método de calibración: http://www.microchip.com/stellent/idcpl ... e=en012094
El problema es que se necesita un osciloscopio, un generador de funciones, un tester con frecuencímetro (o frecuencímetro). Instrumentales que no siempre tiene cualquier aficionado a la electrónica.

Otro método es: http://picprojects.org.uk/projects/reca ... struction_
Requiere un transformador (hay que destacar el método empleado para obtener un generador de frecuencias) pero ademas de eso una PC.
Primero hay que grabar un programa dentro del micro, colocarlo en el circuito, hacerlo funcionar. Leer el valor de calibración que, una vez se halla encontrado, estará guardado en la EEPROM. Pasar ese valor a la última posición del programa, grabar el micro y recién ahí esta todo listo.

Demasiado complicado para un hombre vago como yo.


----- Circuito --------------------

Así que mas que por necesidad (ya que hasta ahora nunca perdí el valor de calibración) sino mas bien por curiosidad me puse a crear mi propio circuito para restaurar el valor.
En realidad solo tenia curiosidad de como se programan los micros... pero... ya que estaba... de paso...

El circuito que use es el siguiente:

Circuito.jpg

Esta realizado en Switch-CAD(TM) para poder colocarle anotaciones.

El HEX para grabar el micro Maestro, el PDF con la placa lista para transferencia (método de la plancha) y la guía de los componentes: OSSCAL.zip (Archivo adjunto).


----- Funcionamiento -------------

Básicamente lo que hace es: grabar un programa en el micro esclavo, enviarle ordenes para que cargue diversos valores en el registro OSCCAL para variar la frecuencia. Mide esta frecuencia hasta que la misma este dentro del rango de 1Mhz +-1%. Cuando encuentra que la frecuencia es correcta borra todo el micro y graba en la última posición el valor hallado dejándolo como viene de fábrica.

Hay que tener en cuenta lo siguiente:

- El circuito borra todo el micro, así que si hay algo dentro que no debe borrarse habrá que hacerle un BackUp primero.
- El circuito salva los Band Gap bits.
- Solo funciona con los PIC 12F629 y 12F675
- El micro Maestro deberá tener el valor de calibración correcto (el que viene de fábrica) ya que el calculo de la frecuencia depende de ello.


----- Pruebas --------------------

En las pruebas que hice ha tenido un éxito de 100%. He probado con 3 12F629 y con 2 12F675, nuevos sin uso y con el valor original que viene de fábrica, al saber el valor que debería tener según Microchip puede comparar con el valor que recupera el circuito y de los 5 micros que probé, los 5 fueron idénticos al valor que traen de fabrica.

Como se observa no hace falta complicados métodos ni instrumentales que no siempre están en el taller, ni siquiera una PC. Solo colocar el micro en el zócalo, presionar el botón. Las luces verdes y rojas parpadearan, luego la luz verde quedara prendida un tiempo -En ese momento esta buscando la frecuencia- y al apagarse las luces verdes y rojas parpadearan nuevamente ya que están grabando el valor encontrado. Una vez esto el micro quedara limpio y con el valor salvado en la última posición.


----- A resolver/Agregar ---------

- Falta una parte que comprueba que micro esta insertado. Si se coloca otro micro que no sea los especificados puede llegar a dañarlos.
Tampoco comprueba si hay un micro o no colocado.

- Como se ve en el diagrama, hay un LED que debería indicar cuando el proceso terminó. Al ponerlo en el circuito encontré que de alguna forma la tensión presente en el pin 6 del micro esclavo pasa a VCC alimentando el micro y haciéndolo funcionar.Tengo que investigar que esta pasando ahí y porque hace eso.
Esa parte no esta implementada en el software.

- Agregar una comprobación de que el programa primero y el código luego fue correctamente grabado, en caso contrario hacer parpadear el LED de "Done".

- Algún día lo implementare en algún microcontrolador con mas pines para añadirle algunas características mas pero, por ahora, quiero evitar la fatiga... :LOL:

----- Aclaraciones ---------------

En el diagrama que puse se ve que las tensión VPP dice 13V pero si se observa detalladamente el regulador entrega 12v. En un principio había puesto 13v (se coloca 2 diodos en serie y en directa entre el pin GND del 7812 y GND misma con lo que en la salida habrá 12v + 0.7v + 0.7v ~= 13.4V) pero en las pruebas use 12v y no hubo problemas. De echo en las hojas de datos se señala que solo hace falta una tensión mínima de 8.5v para VPP.

Ademas, en el diagrama me falto poner un capacitor de 100nf que iría lo mas cerca posible al micro esclavo entre el pin 1 y el 8, osea entre la alimentación del mismo. El error vino de dibujar los dos en paralelo luego del 7805 cuando la alimentación del PIC esclavo esta comandada por el transistor superior. Corregido en el esquema.


----- Vídeo demostración -----

Warning - Achtung - Precaución: El vídeo que sigue no es apto para personas sensibles, puede contener lenguaje incomprensible, errores y/u omisiones.


Vista de los componentes:

Componentes.jpg

Versión 0.6: http://www.mediafire.com/view/1nqa07ua3 ... L_V0.6.HEX (Archivo adjunto).

- Al terminar de grabar el micro, ahora deja la configuración con el pin MCLR como MCLR en vez de un pin I/O y la configuración del oscilador como XT, evitando así que el micro no pueda ser regrabado con un programador ICSP.

Versión 0.5: http://www.mediafire.com/view/xa4v3k745 ... L_V0.5.HEX

- Corrección de algunos errores menores.

Versión 0.4: http://www.mediafire.com/view/wj5go0840 ... L_v0.4.HEX

- Añadida la comprobación del programa grabado.
- Si no hay micro a comprobar o el programa no esta bien grabado el LED verde destellara 3 veces.
- En caso de que por algún error no haya podido recuperar el valor de la calibración el LED verde destellara 2 veces.

Versión 0.2: http://www.mediafire.com/view/cu32nt17c ... AL_0.2.HEX

- Ahora el micro maestro puede ser tanto el 12f629 o el 12F675.
- De no hallar el valor del oscilador ahora borra el programa usado para la calibración.

Saludos
- Javier -
 

Adjuntos

  • OSCCAL V0.6.HEX.zip
    1 KB · Visitas: 8
  • Osccal.zip
    539.8 KB · Visitas: 13
Ese circuito lo habia hecho hace años andaba por la red , me quedaba dañado el 629 al usar un programador casero jajajja hay lo encontre en uno de los cajones jaja este muchacho deber ser el creador de ese circuito muy agradecido ...
16353870453561640176406.jpg
 
Última edición:

D@rkbytes

Moderador
Saludos. Como ya existe este tema, dejo por aquí mis aportes que tratan sobre lo mismo.

El primero es sencillo, recupera el valor de OSCCAL en los PIC: 12F629 y 12F675
Estos PIC son los que comúnmente dan problemas con el valor de OSCCAL.
Como ya se ha explicado dentro del Foro, este valor es imprescindible para el correcto funcionamiento de estos PIC.
Ya que si se pierde completamente, el microcontrolador no funcionará con oscilador interno, simplemente no hará nada, y si su valor es incorrecto, obviamente no tendrá precisión.

El funcionamiento es sencillo de explicar, pero complejo de realizar, ya que se requiere programación directa usando el protocolo ICSP de Microchip.

El programa verifica la existencia de un dispositivo válido de los mencionados anteriormente, si lo identifica, se procede a borrarlo para poder grabar en él un programa base.
El programa base grabado consiste en generar una frecuencia de 1 KHz e ir modificando el valor del registro OSCCAL
Con cada cambio guarda el valor LSB en la EEPROM (Es el que importa, porque el valor MSB 0x34 es un retlw que obviamente no cambia.)
La frecuencia generada es leída por el PIC maestro y cuando encuentra la frecuencia esperada, procede a leer la memoria EEPROM del PIC esclavo para leer el valor actual que la generó y entonces borra el PIC completamente (Bulk Erase) y establece un valor correcto para OSCCAL

No creo que sea conveniente decir que se tiene que realizar una copia de los datos del PIC a procesar, pues obviamente, si perdió el valor de OSCCAL, fue por un mal uso del mismo.
Y es de suponerse que fue uno mismo quien lo hizo.
La verdad es que, esto a mí nunca me preocupó, hasta lo llegué a hacer a propósito para aprender a recuperarlo, ya que por suerte existe información en la red, eso sí, más compleja y usando equipos que un novato no tiene.
Unos dicen que PICkit2 lo hace, y bueno, no tengo PICkit2 y no lo pude comprobar, el PICkit3 no lo hace, y el software que tiene UART Tool y Logic Analizer, simplemente te deja establecerlo, pero si no lo sabes, pues ya ni modo.

Información sobre el primer Recuperador de OSCCAL:
Colocar el PIC a procesar y presionar el botón "RUN"
Si el PIC es válido, se obtendrá un destello del LED STATUS por un segundo.
A continuación se procede a borrarlo completamente y se deben obtener tres destello de 250 mS.
Si todo va bien, deben obtenerse otros tres destellos de 250 mS. (Grabando el programa base)
Si el programa base se grabó correctamente, el LED STATUS quedará encendido durante el proceso de lectura de frecuencia.
Digamos que unos 10 segundos aproximadamente.
Encontrada la frecuencia con +- el 10% de precisión, se procede a borrar nuevamente el PIC esclavo y grabar el valor de OSCCAL
Si el proceso concluye correctamente, se obtendrán 10 destellos de 250 mS.
Aquí ya se puede retirar el PIC y leer el valor obtenido de OSCCAL en la dirección 0x3FF, o hasta el final de la memoria Flash. (1023 bytes)

Información de errores:
2 destellos de 1000 mS: Error al borrar el PIC.
3 destellos de 1000 mS: Error al grabar el programa base.
4 destellos de 1000 mS: Error de dispositivo o dispositivo no conectado.
5 destellos de 1000 mS: Error al tratar de recuperar el valor de OSCCAL.

El quinto error es crítico, ya que comúnmente no debería ocurrir.
Aquí se recomienda borrar el PIC completamente con un programador y volver a intentar.
Si vuelve a mostrarse el error 5, es muy seguro que el PIC tenga un daño.


Información sobre el segundo Recuperador de OSCCAL:
Este proyecto es más avanzado, pues ya se usa una interfaz de usuario vía RS-232
Es similar al anterior, pero no está limitado a la base DIL8 y puede usar los PIC16F630 y PIC16F676, con la ventaja de que una vez recuperado un posible valor para OSCCAL, este podrá ser modificado por el usuario, a fin de encontrar el valor correcto. (1000 Hz @ 2% de error)
Así que, si la frecuencia que obtenemos está entre 998 Hz y 1002 Hz, ya podremos dar concluido un valor correcto para OSCCAL.
Y esto es porque, más no le puede pedir a un oscilador interno RC.

AICSPOR.jpg

Con este proyecto se puede usar cualquier dispositivo RS-232 TTL para conectarnos al sistema.
La tarjeta base es para poder usarla con cualquier dispositivo RS-232 a TTL, pero también incluyo una tarjeta basada en el chip CH340G, ya que es bastante económico y fácil de implementar.

No explico más sobre este otro proyecto, ya que funciona similar al anterior, y toda la información sobre el proceso se irá mostrando en el programa interfaz.

Cualquier persona que se dedique a la programación, requiere de una PC para poder programar, así que, queda de más decir que la PC y una conexión serial, siempre será imprescindible.

Adjunto los dos proyectos que incluyen el firmware, el diagrama y los diseños de PCB.
Quedo atento ante cualquier duda y/o comentarios al respecto.

Como siempre, espero que estos aportes sean de utilidad.
 

Adjuntos

  • ICSP OSCCAL Recovery I.rar
    203.2 KB · Visitas: 21
  • ICSP OSCCAL Recovery II.rar
    436.2 KB · Visitas: 24
Así que, si la frecuencia que obtenemos está entre 998 Hz y 1002 Hz, ya podremos dar concluido un valor correcto para OSCCAL.
Y esto es porque, más no le puede pedir a un oscilador interno RC.

Agrego un par de puntos que me acorde ahora.

- Cuando había echo algunas pruebas comprobé que el oscilador interno es un poco sensible a la alimentación del microcontrolador, mas específicamente al filtrado. Dependiendo que fuente uso para alimentar mi circuito puede quedarse a 1 punto de calibración, osea en el valor anterior al correcto. De todas formas la frecuencia generada es muy cercana -creo que menos del 5% de tolerancia-.
La opción que da mejores resultados es alimentar el circuito a baterías.

- También, el fabricante, dice que la temperatura influye en la frecuencia del oscilador por lo que recomienda calibrar el valor aun si no se perdió el de fábrica. Sabiendo eso y que el error es mínimo no vale la pena hacerse mucho problema por esto y lo anterior. (Y como bien dice Dark, no se le puede pedir mucho).

- Añado, para el que le pueda interesar, que el valor guardado (posición de memoria 0x3FF) no es usado por el microcontrolador en su totalidad, ignora los 2 primeros bits osea usa solo los primeros 6 bits (123456XX por lo que, por ejemplo, 00000000, 00000001, 00000010 y 00000011 son todos iguales y calibran la misma frecuencia) (Siempre hablando de la parte del valor y no del 0x34 que es la codificación de la instrucción RETLW XX).

- Si se posee un osciloscopio o un frecuencímetro y se quiere comprobar la frecuencia a la que esta calibrado el microcontrolador se puede cargar el siguiente programa que no hace otra cosa mas que configurar al micro para que use el oscilador interno y por el pin 3 (GP4/CLKOUT) genere una frecuencia igual al oscilador interno dividido por 4 que, si esta bien calibrado, debería medir 1Mhz +-1%: (Para compilarlo hay que cambiar la parte donde se especifica el microcontrolador al que se va a usar aunque, en teoría, el hex que sigue, debería funcionar con los PIC12F629/675 y el 16F630/676 -que no son mas que la versión con mas pines del 629 y 675-).

Código:
;****************************************************************************************************
;
;****************************************************************************************************

    list    p=12F629
    radix    dec 
  
    include    "p12f629.inc"
  
    errorlevel    -302    ; Don't complain about BANK 1 Registers

    __CONFIG    _MCLRE_OFF & _CP_OFF & _WDT_OFF & _INTRC_OSC_CLKOUT  ;Internal osc.

rp0        equ    5                    ; bit 5 of the status register

;****************************************************************************************************
;    Vector de reset
;****************************************************************************************************

        org    0x00                ;program starts at location 000
;****************************************************************************************************
;    Configuracion del micro
;****************************************************************************************************
SetUp
        bsf        STATUS, rp0     ; Bank 1 

        call    3FFh
        movwf    OSCCAL            ; Calibra el oscilador

        movlw    b'10000000'        ; Turn off T0CKI, prescale for TMR0 = 1:2, pull-up off
        movwf    OPTION_REG

        movlw    b'00101111'        ; output 0 = Out; 1 = In
        movwf    TRISIO               ;

        bcf        STATUS, rp0        ; bank 0

        movlw   07h              ; Set up W to turn off Comparator ports
        movwf   CMCON           ; must be placed in bank 0

;****************************************************************************************************
;    Inicio
;****************************************************************************************************
Inicio
        goto    Inicio

    end
 

Adjuntos

  • Test.zip
    225 bytes · Visitas: 10
Arriba