Autor Tema: Problema con el PIC12F629 y el OSCCAL  (Leído 180 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado ledfacil

  • PIC10
  • *
  • Mensajes: 3
Problema con el PIC12F629 y el OSCCAL
« en: 01 de Noviembre de 2018, 18:01:17 »
Hola, diseño algunos de mis programas con NIPLE, y en particular con el PIC12F629 tengo el problema del condenado OSCCAL.

Según entiendo, el OSCCAL es un registro que posee un valor que define la frecuencia de calibración de fábrica del oscilador interno del PIC. Incluso se lo puede ver como OSCCAL entre los registros predefinidos del PIC en Niple.

Cuando hago mi programa en Niple, compilo etc. todo bien, el problema es que de vez en cuando me pasa con algunos micros que grabo, que el programa que le meto pisa este registro OSCCAL por no tener yo dentro de mi código ninguna instrucción predefinida que proteja a este registro y de este modo al ser pisado por el programa pierde el valor de calibración de fábrica.

Entonces, por ejemplo trabajando con comunicaciones USART que son delicadas en cuanto a frecuencia, quiero comunicar el PIC12F629 por ejemplo con un PIC16F628A, y el último a veces no escucha al PIC12F629 o sea; por tener el 12f629 su OSCCAL tocado, la velocidad de frecuencia USART que utiliza para transmitir ya no es la estandarizada por lo tanto el otro pic, el 16f628a no sabe interpretar esa cola de bits porque llega a una velocidad distinta a la que espera. Y me termina perjudicando, siempre me pasa con el 12f629 y cuando dependo de altas frecuencias.

He visto en google por ahí que hay formas de restaurar ese valor de osccal de forma "hardwariana" levantando ese valor de un segundo pic con su valor de fábrica o incluso en el soft. pickit2 está la opción de ingresar el osccal de forma manual (algo que no me ha funcionado tal vez por usar un hardware pickit clon) y pensaba que tal vez exista alguna forma o código que podamos predefinir para proteger a este registro de ser pisado.. Si tienen algo en mente, bienvenido sea!

Gracias por leer, un saludo! Damián de www.LEDFACIL.com.ar

Desconectado elreypic2

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 908
Re:Problema con el PIC12F629 y el OSCCAL
« Respuesta #1 en: 02 de Noviembre de 2018, 00:03:24 »
Que tal ledfacil,

No tengo experiencia para nada con NIPLE. Pero sí la tengo con ese microcontrolador (PIC12F629). Si bieen mencionas el OSCCAL es un registro, pero este no contiene el valo de calibración de fábrica del oscilador interno. Voy a tratar de explicarlo.
El registro OSCCAL es un registro de función especial dentro de RAM del microcncontrolador, el cual sirve para cargar el valor de calibración del oscilador interno. Ahora bien, ese valor de calibración para el oscilador interno, está grabado en la última dirección de la memoria de programa del microcontrolador, que en este caso para el microcontrolador PIC12F629 es la dirección: 0x3FF.
En esa dirección de la memoria de programa se encuentra grabada la instrucción "RETLW XX" donde XX es el valor de calibración para el oscilador interno, y ese valor 'XX' es diferente para cada PIC12F629. Lo que hace NIPLE u otro compilador es realizar una llamada a subrutina a la dirección 0x3FF y entonces se encuentra con la la instrucción del RETLW XX, entonces ese valor de XX se asigna al registro de trabajo W, luego lo que hace es cargar o mover ese valor al registro de función especial OSCCAL. Si miras la hoja de datos, esto se especifíca claramente en la página 54 usando ensamblador.

Código: [Seleccionar]
bsf STATUS, RP0 ;Cambia al banco 1 de la memoria RAM
call 3FFh ;Obtén el valor de calibración del oscilador interno de la última dirección de la memoria de programa
movwf OSCCAL ;Asigna ese valor al registro OSCCAL
bcf STATUS, RP0 ;Cambia al banco 0 de la memoria RAM

Eso es lo que realmente hacen los compiladores o bien es lo que necesitas hacer manualmente para configurar correctamente el valor de calibración del oscilador interno.

Ahora bien, lo que te puede estar pasando es que si no cambias correctamente de banco al hacer alguna asignación en algún registro de función especial, podrías estar cambiando el valor del OSCCAL. Me explico, la dirección del registro OSCCAL en la memoria RAM es el 0x90 , pero para accesar a dicha dirección o registro necesitas cambiar al banco 1, ya que si no lo haces en realidad estarías modificando el registro del T1CON y viceversa, es decir para modificar el registro OSCCAL tienes que cambiarte al banco 1 de la memoria RAM y ya modificado te regresas al banco 0, tal como se muestra en el segmento de códio antes mencionado, de otro modo estaría trabajando en el banco equivocado y si en tu código estás intentando configurar el T1CON en realidad estarías modificando el registro OSCCAL.

Ahora bien, el pickit 2 tiene la protección automática de no tocar la última dirección de la memoria de programa cuando le aplicas el comando de borrar dispositivo (Erase). Muchos clones u otros programadores no poseen dicha característica y al aplicar el comando de borrar dispositivo borran TODO el contenido de TODA la memoria y ahí es que pierdes esa instrucción del RETLW XX, teniendo que recurrir a diferentes métodos para recuperar dicho valor de calibración. Entre ellos el de autoregeneración.

Por lo anterior no existe ninguna forma de protección externa por código para que esa dirección sea "bloqueada" o protegida contra borrado accidental. Todo depende de la persona que está programando y del cuidado y la atención que tiene a la hora de realizar el código, y del tipo de programador que sea capaz de proteger esa dirección manteniéndola intacta.

Espero no haberte confundido y haberte ayudado a entender mejor el funcionamiento del oscilador interno de este microcontrolador.

saludos,

elreypic.

Desconectado Fer_TACA

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3231
Re:Problema con el PIC12F629 y el OSCCAL
« Respuesta #2 en: 02 de Noviembre de 2018, 08:35:30 »
Niple te recomienda que antes de borrar o realizar un grabado de pic(con borrado previo) que leas las  ultimas posiciones de memoria,  apuntes los valores,  edites  el programa cargado en el grabador,  vayas  a las ultimas posiciones y cambies los valores por  los  anteriores anotados.
Luego  ya puedes proceder a grabar el pic
« Última modificación: 02 de Noviembre de 2018, 08:38:08 por Fer_TACA »

Desconectado ledfacil

  • PIC10
  • *
  • Mensajes: 3
Re:Problema con el PIC12F629 y el OSCCAL
« Respuesta #3 en: 02 de Noviembre de 2018, 13:48:00 »
Que tal ledfacil,

No tengo experiencia para nada con NIPLE. Pero sí la tengo con ese microcontrolador (PIC12F629). Si bieen mencionas el OSCCAL es un registro, pero este no contiene el valo de calibración de fábrica del oscilador interno. Voy a tratar de explicarlo.
El registro OSCCAL es un registro de función especial dentro de RAM del microcncontrolador, el cual sirve para cargar el valor de calibración del oscilador interno. Ahora bien, ese valor de calibración para el oscilador interno, está grabado en la última dirección de la memoria de programa del microcontrolador, que en este caso para el microcontrolador PIC12F629 es la dirección: 0x3FF.
En esa dirección de la memoria de programa se encuentra grabada la instrucción "RETLW XX" donde XX es el valor de calibración para el oscilador interno, y ese valor 'XX' es diferente para cada PIC12F629. Lo que hace NIPLE u otro compilador es realizar una llamada a subrutina a la dirección 0x3FF y entonces se encuentra con la la instrucción del RETLW XX, entonces ese valor de XX se asigna al registro de trabajo W, luego lo que hace es cargar o mover ese valor al registro de función especial OSCCAL. Si miras la hoja de datos, esto se especifíca claramente en la página 54 usando ensamblador.

Código: [Seleccionar]
bsf STATUS, RP0 ;Cambia al banco 1 de la memoria RAM
call 3FFh ;Obtén el valor de calibración del oscilador interno de la última dirección de la memoria de programa
movwf OSCCAL ;Asigna ese valor al registro OSCCAL
bcf STATUS, RP0 ;Cambia al banco 0 de la memoria RAM

Eso es lo que realmente hacen los compiladores o bien es lo que necesitas hacer manualmente para configurar correctamente el valor de calibración del oscilador interno.

Ahora bien, lo que te puede estar pasando es que si no cambias correctamente de banco al hacer alguna asignación en algún registro de función especial, podrías estar cambiando el valor del OSCCAL. Me explico, la dirección del registro OSCCAL en la memoria RAM es el 0x90 , pero para accesar a dicha dirección o registro necesitas cambiar al banco 1, ya que si no lo haces en realidad estarías modificando el registro del T1CON y viceversa, es decir para modificar el registro OSCCAL tienes que cambiarte al banco 1 de la memoria RAM y ya modificado te regresas al banco 0, tal como se muestra en el segmento de códio antes mencionado, de otro modo estaría trabajando en el banco equivocado y si en tu código estás intentando configurar el T1CON en realidad estarías modificando el registro OSCCAL.

Ahora bien, el pickit 2 tiene la protección automática de no tocar la última dirección de la memoria de programa cuando le aplicas el comando de borrar dispositivo (Erase). Muchos clones u otros programadores no poseen dicha característica y al aplicar el comando de borrar dispositivo borran TODO el contenido de TODA la memoria y ahí es que pierdes esa instrucción del RETLW XX, teniendo que recurrir a diferentes métodos para recuperar dicho valor de calibración. Entre ellos el de autoregeneración.

Por lo anterior no existe ninguna forma de protección externa por código para que esa dirección sea "bloqueada" o protegida contra borrado accidental. Todo depende de la persona que está programando y del cuidado y la atención que tiene a la hora de realizar el código, y del tipo de programador que sea capaz de proteger esa dirección manteniéndola intacta.

Espero no haberte confundido y haberte ayudado a entender mejor el funcionamiento del oscilador interno de este microcontrolador.

saludos,

elreypic.

Niple te recomienda que antes de borrar o realizar un grabado de pic(con borrado previo) que leas las  ultimas posiciones de memoria,  apuntes los valores,  edites  el programa cargado en el grabador,  vayas  a las ultimas posiciones y cambies los valores por  los  anteriores anotados.
Luego  ya puedes proceder a grabar el pic

Excelentes aportes, muy claro muchísimas gracias. Me comprometo a comunicar los resultados cuando ponga en práctica ambas soluciones al encontrarme nuevamente con el problema, un cordial saludo a todos, ojalá existieran más personas con vocación como ustedes!!! saludo! Damián de www.LEDFACIL.com.ar

Desconectado Fer_TACA

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3231
Re:Problema con el PIC12F629 y el OSCCAL
« Respuesta #4 en: 02 de Noviembre de 2018, 14:05:54 »
De todas formas dentro del manual de usuario, que puedes conseguir en su web, tienes en las 2-3 ultimas paginas el procedimiento de como realizar el proceso.

Desconectado Fer_TACA

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3231


 

anything