Programación Específica > Microcontroladores
Read/write Flash De Código (16f87x)
(1/1)
© Jonathan ©:
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 ---Read_Flash bsf STATUS,RP1 bcf STATUS,RP0 ;Selecciona el Banco 2 movf ADDRL,W ;Contenido d la variable a EEADR, movwf EEADR ;parte baja de la direccion. movf ADDRH,W ;Contenido d la variable a EEADRH, movwf EEADRH ;parte alta de la direccion. bsf STATUS,RP0 ;Selecciona Banco 3 bsf EECON1,EEPGD ;habilita acceso a la flash. bsf EECON1,RD ;Inicio operacion de lectura. nop ;se esperan dos ciclos nop tal como especifica el datasheet bcf STATUS,RP0 ;Selecciona Banco 2 movf EEDATA,W ;DATAL = parte baja del dato leido movwf DATAL movf EEDATAH,W ;DATAH = parte alta del dato leido movwf DATAH return ;retorna de la subrutina.
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.
© Jonathan ©:
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 ---Write_Flash bsf STATUS,RP1 bcf STATUS,RP0 ;Selecciona el Banco 2 movf ADDRL,W ;Contenido d la variable a EEADR, movwf EEADR ;parte baja de la direccion. movf ADDRH,W ;Contenido d la variable a EEADRH, movwf EEADRH ;parte alta de la direccion. movf DATAL,W ;Se mueve la parte baja del dato mowf EEDATA ;a escribir en EEDATA. movf DATAH,W ;Se mueve la parte alta del dato mowf EEDATAH ;a escribir en EEDATAH. bsf STATUS,RP0 ;Selecciona Banco 3 bsf EECON1,EEPGD ;habilita acceso a la flash. bsf EECON1,WREN ;Habilita escritura en la FLASH bcf INTCON,GIE ;Deshabilita todas las interrupciones. movlw 0x55 ;Secuencia especial de 5 pasos movwf EECON2 ;para escribir en la flash movlw 0xAA ; movwf EECON2 ; bsf EECON1,WR ;Inicia la operacion de escritura. nop ;se esperan dos ciclos nop tal como especifica el datasheet bsf INTCON,GIE ;Habilita todas interrupciones generales bcf EECON1,WREN ;Deshabilita escritura en la FLASH return ;retorna de la interupcción
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
jgpeiro:
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?
© Jonathan ©:
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:
Navegación
Ir a la versión completa