Autor Tema: OSCILADOR INTERNO - PIC16F676  (Leído 4347 veces)

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

Desconectado afta

  • PIC16
  • ***
  • Mensajes: 123
OSCILADOR INTERNO - PIC16F676
« en: 18 de Agosto de 2021, 02:03:00 »
Hola a todos espero me puedan ayudar:

Estoy usando el PIC16F676, el cual tiene un oscilador interno de 4MHz. Según la hoja de datos en la última posición de la memoria de programa hay un valor que viene de fábrica para configurar la frecuencia mediante el registro OSCCAL. Lo que se menciona es que en el código del programa debo hacer un llamado a la última posición de memoria, la cual está cargada con una instrucción RETLW XX donde XX es el valor que guardaría en el registro OSCCAL.

Lo que pasa es que al usar el PICKIT2 para revisar el PIC, en la última posición de memoria no hay ningún valor. Sin embargo en la parte superior de la ventana del PICKIT2 aparece la etiqueta OSCCAL y si tiene asignado un valor.

Si uso las instrucciones recomendadas en la hoja de datos tendría que llamar a la última posición de memoria; pero, si no hay ningún valor no podría poner nada en el registro OSCCAL.

He probado con varios PIC16F676 y en todos observo lo mismo. Todos los PIC son nuevos y aún no grabé nada en ellos ni borré nada. Solo quise ver el valor del OSCCAL para anotarlo por si se borra accidentalmente.

En otros PIC que también tienen oscilador interno he visto en videos que cuando conectan el PICKIT2 y les reconoce el PIC, se muestra el valor del OSCCAL tanto en la etiqueta de la ventana como en la última posición de memoria; en mi caso la última posición de memoria no muestra nada.

Gracias por su tiempo.

Desconectado DominusDRR

  • PIC24H
  • ******
  • Mensajes: 1982
    • Sicoy
Re:OSCILADOR INTERNO - PIC16F676
« Respuesta #1 en: 18 de Agosto de 2021, 10:23:19 »
Hola.

Son varios años que no trabajo con lo microcontroladores de 8 bits, pero con respecto a los registros para cambiar la frecuencia del oscilador interno y similares, en cierta manera es igual a casi todos.

El valor del registro que ajusta la frecuencia está protegido contra el posible problema de alteración. Es decir que para escribir sobre el no es tan sencillo como escribir a cualquier otro registro.

Se necesita una "clave" que es en realidad escribir varios números a un registro especial. Por ejemplo en el PIC32,  se debe escribir la siguiente secuencia para acceder al registro:

Código: [Seleccionar]
SYSKEY = 0x00000000;
SYSKEY = 0xAA996655;
SYSKEY = 0x556699AA;

Entonces ahí modificas al registro especial y para confirmar esa modificación nuevamente debes escribir la "clave". La segunda vez que escribes la clave es para confirmar los cambio y para volver a proteger los registros especiales contra escritura.

De esa manera se evita que por "error" se altere algo tan sensible.

Tengo una idea algo difusa sobre MPLAB Harmony, XC32 con PIC32

Desconectado afta

  • PIC16
  • ***
  • Mensajes: 123
Re:OSCILADOR INTERNO - PIC16F676
« Respuesta #2 en: 18 de Agosto de 2021, 17:52:39 »
Hola.

Lo que pasa es que la hoja de datos indica llamar a la última posición de memoria y esta devuelve un valor ya que tiene programada una instrucción return.

Solo que dicha posición me muestra como si no hubiese nada.

Desconectado DominusDRR

  • PIC24H
  • ******
  • Mensajes: 1982
    • Sicoy
Re:OSCILADOR INTERNO - PIC16F676
« Respuesta #3 en: 18 de Agosto de 2021, 18:02:44 »
Hola.

Lo que pasa es que la hoja de datos indica llamar a la última posición de memoria y esta devuelve un valor ya que tiene programada una instrucción return.

Solo que dicha posición me muestra como si no hubiese nada.

He leído las hojas de datos del MCU y creo que comprendo más o menos tu duda

¿Has intentado leer la memoria flash y guardar la información como una archivo hex?

Si hay un valor en la última localidad de la memoria flash debería estar en un "record" del archivo
Tengo una idea algo difusa sobre MPLAB Harmony, XC32 con PIC32

Desconectado DominusDRR

  • PIC24H
  • ******
  • Mensajes: 1982
    • Sicoy
Re:OSCILADOR INTERNO - PIC16F676
« Respuesta #4 en: 18 de Agosto de 2021, 18:09:20 »
Hola.

Lo que pasa es que la hoja de datos indica llamar a la última posición de memoria y esta devuelve un valor ya que tiene programada una instrucción return.

Solo que dicha posición me muestra como si no hubiese nada.

Hay mejor información de tus dudas en los foros de MCHP

https://www.microchip.com/forums/m885618.aspx

https://www.microchip.com/forums/m853670.aspx

Tengo una idea algo difusa sobre MPLAB Harmony, XC32 con PIC32

Desconectado afta

  • PIC16
  • ***
  • Mensajes: 123
Re:OSCILADOR INTERNO - PIC16F676
« Respuesta #5 en: 18 de Agosto de 2021, 19:06:55 »
Gracias por la ayuda.

Aún no intenté programar el PIC porque al hacer alguna operación en él el valor se puede borrar. Como no veo ningún valor en la posición no sé que valor obtendría.

Sin embargo, El PICKIT2 muestra que El registro OSCCAL sí tiene asignado un valor sólo que no aparece en la ubicación de memoria donde se debería poder visualizar.

Desconectado elreypic2

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1297
Re:OSCILADOR INTERNO - PIC16F676
« Respuesta #6 en: 18 de Agosto de 2021, 20:34:04 »
Que tal afta,

Podrías subir una captura de imagen del contenido que te muestra el PICKIT2. (La memoria de programa y el valor en el campo de OSCCAL). Si pudieras subir imágenes de diferentes PICs, con eso tendría una mejor idea.
Yo he usado PICKIT2 por años y simpre me ha mostrado el valor de calibración del oscilador para aquellos PIC que lo contienen.

Saludos,

elreypic

Desconectado afta

  • PIC16
  • ***
  • Mensajes: 123
Re:OSCILADOR INTERNO - PIC16F676
« Respuesta #7 en: 19 de Agosto de 2021, 04:52:07 »
Hola reyPic aquí muestro algunas imágenes.

Hay 3 imágenes con 3 PIC's.

En el caso del PIC con OSCCAL 34D4 cuando le doy nuevamente check communication cambia el valor del OSCCAL a 34FF pero si cierro la aplicación del PICCKIT2 al abrirla nuevamente me muestra de nuevo el valor 34D4. No hice esta prueba para los otros PIC para no arriesgarme a que se borren sus códigos para el OSCCAL.

En ninguna imágen se vé un valor en la última posición de memoria.

Desconectado afta

  • PIC16
  • ***
  • Mensajes: 123
Re:OSCILADOR INTERNO - PIC16F676
« Respuesta #8 en: 19 de Agosto de 2021, 04:54:06 »
Aquí envío las otra imágenes.
« Última modificación: 19 de Agosto de 2021, 04:56:50 por afta »

Desconectado elreypic2

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1297
Re:OSCILADOR INTERNO - PIC16F676
« Respuesta #9 en: 19 de Agosto de 2021, 06:02:24 »
Que tal afta,

Por lo que veo en las imágenes estás usando autodetección del PIC. Lo que te recomiendo es intentar leerlo con selección del PIC manualmente. Pero casi estoy seguro que los valores que has obtenido en la sección OSCCAL son correctos: 34D4, 3428, 3430.
1)  Programmer--->Manual Device Select
Luego vas a:
2) Device Family---->Midrange---->Standard

3) Y seleccionas el PIC16F676 del menu "-Select Part-"

 

* Pickit2_1.jpg
(87.44 kB, 538x660 - visto 407 veces)

4) Una vez que ya has hecho eso, presiona el boton de "Read"

 

* Pickit2_2.jpg
(122.63 kB, 545x670 - visto 335 veces)


Espero eso te sirva.

Desconectado DominusDRR

  • PIC24H
  • ******
  • Mensajes: 1982
    • Sicoy
Re:OSCILADOR INTERNO - PIC16F676
« Respuesta #10 en: 19 de Agosto de 2021, 10:56:41 »
Que tal afta,

Por lo que veo en las imágenes estás usando autodetección del PIC. Lo que te recomiendo es intentar leerlo con selección del PIC manualmente. Pero casi estoy seguro que los valores que has obtenido en la sección OSCCAL son correctos: 34D4, 3428, 3430.
1)  Programmer--->Manual Device Select
Luego vas a:
2) Device Family---->Midrange---->Standard

3) Y seleccionas el PIC16F676 del menu "-Select Part-"

  - Tienes que ingresar para ver archivos adjuntos -  
4) Una vez que ya has hecho eso, presiona el boton de "Read"

  - Tienes que ingresar para ver archivos adjuntos -  

Espero eso te sirva.

Una pregunta. Es decir que de fábrica no viene un valor fijo, sino aproximadamente es 0x34XX ¿Verdad?

Si es así, ¿Por qué hay tanta preocupación al borrarlo? Cuando descargue un programa y se ejecute por el CPU del micro, al inicio debería leerse esa localidad y si es un valor diferente a 0x34xx (if (valorLeido > 0x34FF && valorLeido < 0x3400)) debería escribir un valor cualquiera dentro de ese rango.

El oscilador interno no es preciso y puede variar, sobre todo en función de la temperatura ambiente, así que creo que no es tan crítico si el valor no es exacto. Y si de verdad necesito precisión, debería recurrir a un cristal o oscilador externo y olvidarme del oscilador interno.

Tengo una idea algo difusa sobre MPLAB Harmony, XC32 con PIC32

Desconectado elreypic2

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1297
Re:OSCILADOR INTERNO - PIC16F676
« Respuesta #11 en: 19 de Agosto de 2021, 15:35:04 »
Que tal DominusDRR,

En realidad es un valor fijo. en realidad es una instrucción la que se coloca en la última dirección de la memoria de programa.
Esa instrucción es un RETLW XX, en donde RETLW es el valor 34H y los dos últimos dígitos con el valor de la calibración para ese microcontrolador en específico. Puedes ver la hoja de datos para una mejor comprensión de lo que digo.
Es importante ese valor de los contrario, cuando el micro arranca, su oscilador interno tomará el valor del RESET para el registro OSCCAL y eso provocará que no sepas cual es la frecuncia de operación del microcontrolador, y si tienes un código basado en el tiempo del oscilador interno, entonces tendrás problemas. De ahí la razón de que debasrealizar la siguiente rutina al mero inicio de tu código:

Código: [Seleccionar]
BSF STATUS, RP0 ;Bank 1
CALL 3FFh ;Get the cal value
MOVWF OSCCAL ;Calibrate
BCF STATUS, RP0 ;Bank 0

Esto está claramente definido en la página 58 del datasheet.

Si bien el oscilador no es preciso, pero al menos en temperatura ambiente sabrías que está operando con una tolerancia del 1%.

elreypic.

Desconectado DominusDRR

  • PIC24H
  • ******
  • Mensajes: 1982
    • Sicoy
Re:OSCILADOR INTERNO - PIC16F676
« Respuesta #12 en: 19 de Agosto de 2021, 15:43:50 »
Que tal DominusDRR,

En realidad es un valor fijo. en realidad es una instrucción la que se coloca en la última dirección de la memoria de programa.
Esa instrucción es un RETLW XX, en donde RETLW es el valor 34H y los dos últimos dígitos con el valor de la calibración para ese microcontrolador en específico. Puedes ver la hoja de datos para una mejor comprensión de lo que digo.
Es importante ese valor de los contrario, cuando el micro arranca, su oscilador interno tomará el valor del RESET para el registro OSCCAL y eso provocará que no sepas cual es la frecuncia de operación del microcontrolador, y si tienes un código basado en el tiempo del oscilador interno, entonces tendrás problemas. De ahí la razón de que debasrealizar la siguiente rutina al mero inicio de tu código:

Código: [Seleccionar]
BSF STATUS, RP0 ;Bank 1
CALL 3FFh ;Get the cal value
MOVWF OSCCAL ;Calibrate
BCF STATUS, RP0 ;Bank 0

Esto está claramente definido en la página 58 del datasheet.

Si bien el oscilador no es preciso, pero al menos en temperatura ambiente sabrías que está operando con una tolerancia del 1%.

elreypic.

Hola. Gracias por l'aclaración.

Con tu explicación entiendo que si no programas tu código con el valor correcto arrancará como tu dices con una frecuencia desconocida.

¿Pero no hay manera que antes de continuar en código, leer dicha instrucción y si si está diferente al valor necesario modificarla?

Tengo una idea algo difusa sobre MPLAB Harmony, XC32 con PIC32

Desconectado elreypic2

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1297
Re:OSCILADOR INTERNO - PIC16F676
« Respuesta #13 en: 20 de Agosto de 2021, 00:24:20 »
Lo que hace la rutina que he colocado es precisamente leer ese valor necesario para colocarlo en el registro OSCCAL. Pero no puedes saber cuál es ese valor necesario, porque cada microcontrolador por fabricación no va a tener el mismo valor, es decir, cada microcontrolador necesitará un valor diferente, obviamente las opciones son de 00h a FFh, pero no es posible saber cuál es la que necesitas para ese microcontrolador en específico.
Ahora claro está que puedes realizar un código de calibración en caso de accidentalmente borres el contenido de esa ultima dirección del programa. Obviamente para esto necesitas una frecuencia de referencia para entonces así basado en comparación puedas obtener ese valor de calibración y una vez obtenido lo grabas en esa última dirección para después ser usada en tu programam principal.

elreypic.

Desconectado DominusDRR

  • PIC24H
  • ******
  • Mensajes: 1982
    • Sicoy
Re:OSCILADOR INTERNO - PIC16F676
« Respuesta #14 en: 20 de Agosto de 2021, 10:27:10 »
Lo que hace la rutina que he colocado es precisamente leer ese valor necesario para colocarlo en el registro OSCCAL. Pero no puedes saber cuál es ese valor necesario, porque cada microcontrolador por fabricación no va a tener el mismo valor, es decir, cada microcontrolador necesitará un valor diferente, obviamente las opciones son de 00h a FFh, pero no es posible saber cuál es la que necesitas para ese microcontrolador en específico.
Ahora claro está que puedes realizar un código de calibración en caso de accidentalmente borres el contenido de esa ultima dirección del programa. Obviamente para esto necesitas una frecuencia de referencia para entonces así basado en comparación puedas obtener ese valor de calibración y una vez obtenido lo grabas en esa última dirección para después ser usada en tu programam principal.

elreypic.

Hola. Estaba leyendo las hojas de datos del MCU y el rango de frecuencia podría variar desde 3.9 MHz a 4.08MHz (temperatura ambiente). Y como tu dices, si  lo calibran a 4MHz y cada microcontrolador debería tener un valor diferente. (Aunque no he encontrado información de que el fabricante garantice que está calibrado a 4MHz)

Personalmente si la frecuencia es algo importante, escogería un cristal o oscilador antes que el oscilador interno. Me imagino que no solamente la temperatura externa pueda afectarlo o la imprecisión del regulador de voltaje que lo alimenta, también el componente RC se podría ir degradando con el tiempo. Tal vez necesita los terminales o pines donde estaría un oscilador externo, el costo, o no considero eso cuando construyo el hardware.
Tengo una idea algo difusa sobre MPLAB Harmony, XC32 con PIC32