• Domingo 22 de Diciembre de 2024, 02:31

Autor Tema:  Read/write Flash De Código (16f87x)  (Leído 2630 veces)

© Jonathan ©

  • Moderador
  • ******
  • Mensajes: 1671
  • Nacionalidad: ar
    • Ver Perfil
    • http://www.einstec.com.ar
Read/write Flash De Código (16f87x)
« en: Viernes 5 de Diciembre de 2003, 14:13 »
0
Descripción: Las siguientes rutinas nos permitirán leer y grabar la memoria de programa o código del pic de los pic16F87X  desde el propio código de programa, esto quiere decir que el propio software se puede reprogramar a si mismo según variables externas o condiciones especificas, también se puede usar para hacer un programa tipo bootloader o simplemente para usarlo como memoria de datos y de esta manera no usar una eeprom externa al pic.

Funcionamiento: El modo de uso es similar a la lectura/escritura de una la eeprom interna del pic aunque no es necesario en este caso hacer la espera de grabación de la misma con lo que grabar la flash es mas rápido que hacer lo mismo en la eeprom.

La memoria FLASH de un pic16F87X dependiendo del modelo puede alcanzar 8K palabras de 14 bits cada una con lo que el direccionamiento será de 13 bits y el dato de 14 bits. Para direccionar tal cantidad de bits es necesario usar dos registros de 8 bits concatenados con los registros que se usaban en la eeprom (EEADR,EEDATA) para el direccionamiento y otros tantos para el dato, los registros son los siguientes y están ubicados en el banco 2.

  dato 14 bits:           Parte baja   Parte alta  
  Direccionamiento:   EEADR         EEADRH  
  Dato:                     EEDATA       EEDATAH

Los registros para configurar y inicializar  los procesos de grabación / lectura son EECON1 y EECON2, ambos ubicados en el banco 3.

 LECTURA:  Para usar la rutina de lectura de la FLASH habrá que definir las siguientes 4 variables en la memoria de datos (cuidado con el direccionamiento de banco):

ADDRL Parte baja del direccionamiento.
ADDRH Parte alta del direccionamiento.
DATAL Parte baja del dato leído.
DATAH Parte alta del dato leído.

La rutina es la siguiente:

Código: Text
  1. Read_Flash  bsf  STATUS,RP1      bcf  STATUS,RP0 &#59;Selecciona el Banco 2     movf  ADDRL,W &#59;Contenido d la variable a EEADR,     movwf  EEADR &#59;parte baja de la direccion.     movf  ADDRH,W &#59;Contenido d la variable a EEADRH,     movwf  EEADRH &#59;parte alta de la direccion.     bsf  STATUS,RP0 &#59;Selecciona Banco 3     bsf  EECON1,EEPGD &#59;habilita acceso a la flash.     bsf  EECON1,RD &#59;Inicio operacion de lectura.     nop  &#59;se esperan dos ciclos     nop   tal como especifica el datasheet     bcf  STATUS,RP0 &#59;Selecciona Banco 2     movf  EEDATA,W &#59;DATAL = parte baja del dato leido     movwf  DATAL      movf  EEDATAH,W &#59;DATAH = parte alta del dato leido     movwf  DATAH      return  &#59;retorna de la subrutina.
  2.  

y para usarla, una vez definidas las variables, habrá que seguir estos pasos...:

    *      Poner dato equivalente a posición de memoria a leer en las variables, ADDRL:ADDRH
    *      hacer la llamada a la subrutina con...  call  Read_Flash
    *      Una vez devuelto el control al programa principal ya tenemos las variables DATAL:DATAH llenas con el contenido de la posición de memoria leída.
EINSTEC Tecnología «La única fuente del conocimiento es la experiencia.»

«Lo importante es no dejar de hacerse preguntas.»

© Jonathan ©

  • Moderador
  • ******
  • Mensajes: 1671
  • Nacionalidad: ar
    • Ver Perfil
    • http://www.einstec.com.ar
Re: Read/write Flash De Código (16f87x)
« Respuesta #1 en: Viernes 5 de Diciembre de 2003, 14:14 »
0
Aqui les dejo la continuacion. Saludos  :hola:

ESCRITURA:  Para escribir en la memoria FLASH de programa usaremos exactamente las mismas variables que hemos usado en la lectura

ADDRL Parte baja del direccionamiento.
ADDRH Parte alta del direccionamiento.
DATAL Parte baja del dato leído.
DATAH Parte alta del dato leído.

La rutina es la siguiente:

Código: Text
  1. Write_Flash  bsf  STATUS,RP1      bcf  STATUS,RP0 &#59;Selecciona el Banco 2     movf  ADDRL,W &#59;Contenido d la variable a EEADR,     movwf  EEADR &#59;parte baja de la direccion.     movf  ADDRH,W &#59;Contenido d la variable a EEADRH,     movwf  EEADRH &#59;parte alta de la direccion.     movf  DATAL,W &#59;Se mueve la parte baja del dato     mowf  EEDATA &#59;a escribir en EEDATA.     movf  DATAH,W &#59;Se mueve la parte alta del dato     mowf  EEDATAH &#59;a escribir en EEDATAH.     bsf  STATUS,RP0 &#59;Selecciona Banco 3     bsf  EECON1,EEPGD &#59;habilita acceso a la flash.     bsf  EECON1,WREN &#59;Habilita escritura en la FLASH     bcf  INTCON,GIE &#59;Deshabilita todas las interrupciones.     movlw  0x55 &#59;Secuencia especial de 5 pasos     movwf  EECON2 &#59;para escribir en la flash     movlw  0xAA &#59;     movwf  EECON2 &#59;     bsf  EECON1,WR &#59;Inicia la operacion de escritura.     nop  &#59;se esperan dos ciclos     nop   tal como especifica el datasheet     bsf  INTCON,GIE &#59;Habilita todas interrupciones generales     bcf  EECON1,WREN &#59;Deshabilita escritura en la FLASH     return  &#59;retorna de la interupcción
  2.  

Como puede verse en el código fuente, para la secuencia de escritura se deshabilitan las interrupciones generales ya que esto podría cortar el proceso de escritura si saltase alguna interrupción es ese momento, también puede verse la secuencia especial de escritura compuesta por 5 instrucciones.

Para usar esta subrutina seguir estos pasos:

    *      Poner dato equivalente a posición de memoria a escribir en las variables, ADDRL:ADDRH
    *      Poner dato a escribir en las variables, DATAL:DATAH
    *      hacer la llamada a la subrutina con...  call  Write_Flash
EINSTEC Tecnología «La única fuente del conocimiento es la experiencia.»

«Lo importante es no dejar de hacerse preguntas.»

jgpeiro

  • Miembro activo
  • **
  • Mensajes: 67
    • Ver Perfil
Re: Read/write Flash De Código (16f87x)
« Respuesta #2 en: Sábado 27 de Diciembre de 2003, 16:36 »
0
recuerdo pensar esto alguna vez para ahorrarme codigo en algunos algorithmos para un 16f84, y pensar que era imposible xq el fabricante restringia de alguna manera la lectura/escritura de la EEPROM al el banco de la eeprom... no lo he mirado desde hace tiempo y el 16f87x lo desconozco, pero esto no se puede realizr en un 16f84, verdad?
¿que falta despues de morir que hubiese anter de nacer?, ¿es posible la reencarnacion?

© Jonathan ©

  • Moderador
  • ******
  • Mensajes: 1671
  • Nacionalidad: ar
    • Ver Perfil
    • http://www.einstec.com.ar
Re: Read/write Flash De Código (16f87x)
« Respuesta #3 en: Lunes 29 de Diciembre de 2003, 13:19 »
0
Se puede leer o escribir en la eeprom de un pic16f84 sin problemas, la eeprom del mismo es de 64 Bytes. En google encontraras codigos para trabajar sobre los mismos. Saludos  :hola:
EINSTEC Tecnología «La única fuente del conocimiento es la experiencia.»

«Lo importante es no dejar de hacerse preguntas.»