sábado, 4 de mayo de 2013

Proyecto - Recuperar valor configuración OSCCAL en PIC´s

----- 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 frecuencimetro (o frecuencimetro). 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:



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



----- 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".


----- 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.




Placa lista para bañarse en percloruro xD:



Vista de los componentes:


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

- Al terminar de grabar el micro, ahora deja la configuracion con el pin MCLR como MCLR en vez de un pin I/O y la configuracion del oscilador como XT, evitando asi 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.


Version 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 -

23 comentarios:

  1. Impresionante !! Muchas gracias por el esfuerzo y la solución inteligente

    ResponderEliminar
  2. Muy buen trabajo, gracias a personas como usted los que no sabemos aprendemos.

    Pero me a surgido un problemita, al enchufarlo a una fuente (12v 2000ma) el led rojo se queda encendido, y no doy con la solucion.

    muchas gracia de antemano

    ResponderEliminar
    Respuestas
    1. Hola, Jose.

      Si para el circuito impreso has usado mi diseño, abajo esta la disposición de cada elemento (También esta incluido en el archivo comprimido en uno de los enlaces). Revisa que los transistores estén colocados correctamente y que no hayas equivocado la posición de ninguno. Hay 2 PNP (BC327), y un NPN (BC337).

      Por otro lado revisa, por las dudas, que el circuito impreso no te halla quedado al revés ya que mi diseño (PDF para imprimir) esta pensado para usar el método de la plancha o similares. Si usas una transferencia por transparencia te quedara todo al revés.

      Sin ningún micro colocado revisa que el LED rojo quede apagado. Sin ningún micro colocado no debería prender ninguno de los dos LEDs.

      Saludos.

      Eliminar
    2. Hola, me llamo luis, antes que nada, exelente tu trabajo, realmente es una herramienta exelente para los novatos, especialmente para los que todavia no manejamos la programación serial como para realizar este tipo de proyectos.
      He realizado el circuito y en muchos casos me queda encendido el led rojo. que significa esto?
      podrias decirme también cual seria la última version con las correcciones realizadas al hex?
      muchisimas gracias! este proyecto es de muchisima ayuda, y has dejado sin palabras a los otros metodos que si bien pueden funcionar, son poco practicos para este mismo fin.

      Eliminar
    3. Hola, Luis... La ultima versión es la 0.6: http://www.mediafire.com/view/1nqa07ua3geq9ef/OSCCAL_V0.6.HEX

      El led rojo no debería quedar prendido (solo hacerlo por breves instantes), revisa que no hayas equivocado la posición de los transistores.

      Saludos.

      Eliminar
    4. hola switch! muchas gracias x respnder! te comento que logre hacerlo funcionar, es una herramienta espectacular, ya he salvado como 8 pics.
      Seria posible hacerte una consulta puntual sobre el codigo fuente? te doy mi correo asi te consulto x otro medio si no te molesta (microchipluis@hotmail.com) desde ya muchisimas gracias por tu aporte.

      Eliminar
  3. Hola Switch, perdon x la insistencia, me pasarías el codigo fuente? aunque sea de la primera versión? es para uso personal solamente.

    ResponderEliminar
  4. Hola, tartode recuperar usando un 675 como master pero no me deja,ya descargue el hex numero 2 pero igual.que puede ser? como puedo hacer ára evitar borrar los datos del osccal ? espero su ayuda, gracias. muy buen blog les dejo mi correo si me pueden enviar ayuda. lean120892@hotmail.com saludos

    ResponderEliminar
    Respuestas
    1. HACE UMA LEITURA ANTES DE GRABAR EL PIC, ANOTE EL VALOR DEL OSCCAL E PONGA EM TU .HEX
      SOLO ESTO...

      Eliminar
  5. hi great tutorial. can you post the code that is configured for pic12f675 as the master

    ResponderEliminar
  6. LINDO LABORO... SIGA CON ESTO. FELIZ NAVIDAD E ANO NUEVO 2017

    ResponderEliminar
  7. HELLO SIR
    HOW BREAK CP IN PIC12F675 WITHOUT LOSS DATA
    THANK YOU

    ResponderEliminar
  8. Hola Javier:
    Antes que na da me llamo Fernando, mi consulta es por dicho calibrador que ya lo he armado de todas formas y no he tenido suerte de que funcione. Cuando presiono el boton de arranque no pasa nada con los led y en el pin 3 del master no hay cambios, siempre tengo 5 volts.
    He grabado en varios pic virgenes sin resultado. Tengo varios 629 inútiles y me gustaría recuperarlos.
    Agradezco si pudieras darme una mano.

    ResponderEliminar
    Respuestas
    1. Hola, Fernando. Sin ver el circuito solo puedo darte alguna que otra guía.

      Para empezar el circuito que adjunte esta en espejo ya que lo hice para usar el método de transferencia por calor. Si usaste otro método te va a quedar al revés.

      El pic maestro debe ser programado con el HEX que adjunte de otra forma no funcionara. El esclavo es el pic con el OSCCAL perdido a recuperar.

      El pic maestro debe tener si o si el valor OSCCAL original, de otra forma no recuperar el valor correcto del pic esclavo.

      Revisa que en el pin 1 del micro maestro haya 5V y el pin 8 este a GND. En el pin 4 deberías medir 5V y 0v si presionas el pulsador. Si no mides esto es que el circuito impreso esta mal echo, hay alguna conexión mal, pista cortada, etc.

      Haz todas las pruebas sin ningún micro conectado.

      Un pic con el valor osccal erróneo no se vuelve inútil solo pierde la calibración del oscilador interno. Si llamas inútil a un micro que no puede ser programado por mala conexión, exceso de voltaje u otro problema que lo haya "quemado" de nada te servirá este circuito.

      Esa es toda la ayuda por ahora que puedo darte hasta que midas y tenga mas información.

      Saludos.

      Eliminar
  9. Hola Javier soy Alfredo hice todos los pasos que vos hiciste en la construccion del circuito pero cuando lo alimento con 14,5 volts me queda prendido el led verde y estimo que para que ello ocurra la pata 3 del pic maestro debe quedar a 0 volt cuando segun lo que vi en el video por vos publicado los leds inicialmente estan apagados. Yo grabe el pic maestro con el IcProg podra ser que no grabo bien? Aunque cuando termino me dice Verificacion correcta

    ResponderEliminar
    Respuestas
    1. Hola Alfredo, efectivamente, si el pin esta a cero volts el led permanecerá encendido. No creo que el error venga por haberlo grabado con el IcProg a menos que cambie la configuración del micro (Fuses).

      Proba grabando la ultima versión: http://www.mediafire.com/view/1nqa07ua3geq9ef/OSCCAL_V0.6.HEX

      Acabo de probar el IcProg, al menos abriendo el archivo y queda todo configurado correctamente, igual revisa que en la parte de configuración quede:

      Oscillator: "Int OSC GP4" (quizas aca este el error ya que es el pin que maneja el led verde).

      Bandgap: Para el caso da lo mismo, igual selecciona "default".

      Y en los fuses: Que solo quede chequeado "BODEN"

      Ojala solo sea eso suponiendo que el circuito este correcto, sin pistas tocándose y el micro maestro insertado correctamente.

      Saludos.

      Eliminar
  10. Hola, me llamo MIguel, y para comunicarte lo util que ha sido todo lo expuesto, tenia varios 12F629 con valor osscal borrado y el problema es que no se encuentran por las tiendas de electronica de aqui, asi que tuve que pedir por Ebay, y despues de leer todo lo expuesto, aunque no soy electronico, tengo algo de experiencia en montar circuitos y decidir probar
    Resultado: UN EXITO, TODOS RECUPERADOS.
    GRACIAS POR COMPARTIR

    ResponderEliminar
  11. Hola me llamo Domingo y antes de nada agradecerte tu aportación, a mi me ha funcionado perfectamentey he rescatado varias lecturas de unos pic que habia borrado por desconocimiento, pero he tratado de ver lo de los 5 voltios que debe dar la patilla 6 del integrado del slave y no noto ninguna lectura, el hex que estoy usando es el ultimo o sea la versión 0,6 ¿podria ser otra versión la que hay que aplicarle al pic master, le lo podrias aclarar.
    gracias por todo

    ResponderEliminar
    Respuestas
    1. Hola Diego.

      Supongo que te refieres a la parte que debería indicar que el proceso terminó. Debido a los diodos de protección que poseen las entradas, si le saco la alimentación al micro esclavo y pongo cualquier pin a positivo, a través de los diodos anteriormente mencionados este termina alimentándose.
      Por eso no lo implemente nunca salvo en una primea instancia que descarte luego por lo mencionado...

      Saludos.

      Eliminar
  12. Hola Swicht, si me referia a la parte que indica que el proceso terminó,pensé que era menos complicado, pero lo importante es que el circuito va de maravilla, te animo a que no abandones las mejoras que creas oportunas ya que estaremos siguiendo tu blogspot.
    Saludos y que tengas un buen año.
    muchas gracias.

    ResponderEliminar
  13. Hola, sabrán si es compatible para recuperar el OSCAL del 12F508?? GRACIAS

    ResponderEliminar
    Respuestas
    1. Hola, Felipe. Lamentablemente no es compatible con el 12F508.

      Eliminar