Autor Tema: Guardando datos en la flash 16f877a  (Leído 7494 veces)

0 Usuarios y 2 Visitantes están viendo este tema.

Desconectado elmasvital

  • Administrador
  • PIC24H
  • *******
  • Mensajes: 1713
Guardando datos en la flash 16f877a
« en: 12 de Abril de 2008, 05:10:55 »
Estoy intentando leer y guardar datos en la flash del 16f877a para ello microchip proporciona unas rutinas de lectura y escritura tales que esta


Lectura

Código: ASM
  1. BSF STATUS, RP1 ;
  2. BCF STATUS, RP0 ;Bank 2
  3. MOVF ADDRL, W ;Write the
  4. MOVWF EEADR ;address bytes
  5. MOVF ADDRH,W ;for the desired
  6. MOVWF EEADRH ;address to read
  7. BSF STATUS, RP0 ;Bank 3
  8. BSF EECON1, EEPGD ;Point to Program memory
  9. BSF EECON1, RD ;Start read operation
  10. NOP ;Required two NOPs
  11. NOP ;
  12. BCF STATUS, RP0 ;Bank 2
  13. MOVF EEDATA, W ;DATAL = EEDATA
  14. MOVWF DATAL ;
  15. MOVF EEDATH,W ;DATAH = EEDATH
  16. MOVWF DATAH

Escritura

Código: ASM
  1. BSF STATUS, RP1 ;
  2. BCF STATUS, RP0 ;Bank 2
  3. MOVF ADDRL, W ;Write address
  4. MOVWF EEADR ;of desired
  5. MOVF ADDRH, W ;program memory
  6. MOVWF EEADRH ;location
  7. MOVF VALUEL, W ;Write value to
  8. MOVWF EEDATA ;program at
  9. MOVF VALUEH, W ;desired memory
  10. MOVWF EEDATH ;location
  11. BSF STATUS, RP0 ;Bank 3
  12. BSF EECON1, EEPGD ;Point to Program memory
  13. BSF EECON1, WREN ;Enable writes
  14. ;Only disable interrupts
  15. BCF INTCON, GIE ;if already enabled,
  16. ;otherwise discard
  17. MOVLW 0x55 ;Write 55h to
  18. MOVWF EECON2 ;EECON2
  19. MOVLW 0xAA ;Write AAh to
  20. MOVWF EECON2 ;EECON2
  21. BSF EECON1, WR ;Start write operation
  22. NOP ;Two NOPs to allow micro
  23. NOP ;to setup for write
  24. ;Only enable interrupts
  25. BSF INTCON, GIE ;if using interrupts,
  26. ;otherwise discard
  27. BCF EECON1, WREN ;Disable writes


Ahora bien si yo quisiera inicializar esos datos con algunos valores se podria hacer de alguna manera?

He pensado en poner por ejemplo un org 0x1800 para guardarlos/leerlos en la pagina 3 del micro... pero claro qué escribo ahí para guardar por ejemplo un 0x88 un RETLW 0x88?

Luego fisicamente el 88 estaría en la parte baja de esa posición de la memoria de programa?

Cada vez que se ejecuta el programa se sobreescribiran esas posiciones de memoria? no verdad?? solo cuando se reprograme.

1 saludo

Desconectado Leon Pic

  • Colaborador
  • DsPIC30
  • *****
  • Mensajes: 3610
    • Impresiones en 3D
Re: Guardando datos en la flash 16f877a
« Respuesta #1 en: 12 de Abril de 2008, 10:13:09 »
Hola Elmasvital. No logro entender con que valores quieres inicializar. Entiendo que lo que quieres grabar en la EEPROM son valores que tu necesitas, pero que estén desde que quemas el PIC.

Hay una manera de hacer, pero no he teido la oportunidad de hacerlo.

Pones al final del código y antes del end ORG  0x2100 y luego DATA  0xZZ dónde ZZ es el valor a grabar

Código: [Seleccionar]
       ORG        0x2100

       DATA       0xZZ
       DATA       0xZZ


Al menos el ICPROG lo debe tomar, no se si el mplab, lo hará.

Con respecto a lo demas, no lo entiendo.
Jesús dijo, yo soy el CAMINO, la VERDAD y la VIDA, nadie llega al PADRE si no es por mi.

Desconectado elmasvital

  • Administrador
  • PIC24H
  • *******
  • Mensajes: 1713
Re: Guardando datos en la flash 16f877a
« Respuesta #2 en: 12 de Abril de 2008, 11:13:55 »
No se trata de la eeprom leonpic... quiero guardarlos en la Flash o memoria de programa. De todas formas se confirma lo que he puesto en el anterior post... se pueden inicializar de la manera que expuse.

RETLW 0x88.

asi no da problemas el compilador. Date cuenta de que la memoria de programa consta de 14 bits por eso lo del retlw.

1 saludo

Desconectado flacoclau

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1692
    • El Micro Reactor
Re: Guardando datos en la flash 16f877a
« Respuesta #3 en: 12 de Abril de 2008, 14:01:43 »
 :shock:
No sabía que se podía modificar la memoria de programa de un 16f877 por programa.
esto lo he visto en los 18f, pero en uno de la línea 16f... es nuevo para mí.
Las personas con buena ortografía me atraen textualmente.

El Micro Reactor

Córdoba capital - Argentina.

Desconectado pikman

  • Moderadores
  • PIC24F
  • *****
  • Mensajes: 679
Re: Guardando datos en la flash 16f877a
« Respuesta #4 en: 12 de Abril de 2008, 14:46:10 »
aqui, te dejo un bootloader en asm para el 877, de ahi podes sacar la rutina que graba la flash, yo lo uso permanentemente, ya no en los 16f pero si en los 18f, y desde C, es muy comodo porque se puede guardar una gran cantidad de informacion y leerla a velocidades que es imposible hacerlo desde memorias externas, si usas CCS hay una funcion que solo le tenes que dar los datos de longitutd de la cadena de datos, la cadena y la direccion.

saludos
ARIEL
saludos
PikMan

Desconectado flacoclau

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1692
    • El Micro Reactor
Re: Guardando datos en la flash 16f877a
« Respuesta #5 en: 12 de Abril de 2008, 19:01:42 »
Gracias Ariel, cierto no me acordaba de los bootloaders, yo me refería a la función de tablatura de la línea 18f, saludos!!
Las personas con buena ortografía me atraen textualmente.

El Micro Reactor

Córdoba capital - Argentina.

Desconectado Cryn

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4169
Re: Guardando datos en la flash 16f877a
« Respuesta #6 en: 12 de Abril de 2008, 20:22:47 »
si usas CCS hay una funcion que solo le tenes que dar los datos de longitutd de la cadena de datos, la cadena y la direccion.

 :shock: que funcion es?? te lo agradeceria :mrgreen:
.

Desconectado Modulay

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 2651
Re: Guardando datos en la flash 16f877a
« Respuesta #7 en: 12 de Abril de 2008, 20:33:17 »
write_program_memory() creo recordar que era...aunque si no me equivoco,solo está implementada para PIC18 (y superiores,imagino)

Desconectado Cryn

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4169
Re: Guardando datos en la flash 16f877a
« Respuesta #8 en: 12 de Abril de 2008, 20:36:53 »
ok gracias :mrgreen: vere si se puede
.

Desconectado pikman

  • Moderadores
  • PIC24F
  • *****
  • Mensajes: 679
Re: Guardando datos en la flash 16f877a
« Respuesta #9 en: 12 de Abril de 2008, 20:45:19 »
Tal cual Modulay,write_program_memory() solo esta implementado solo en PIC18, en la linea 16F8x es write_program_eeprom(), y solo escribe una posicion de memoria, disculpas por la confusion de cualquier modo se puede construir una funcion que haga lo mismo, saludos.

ARIEL
saludos
PikMan

Desconectado Modulay

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 2651
Re: Guardando datos en la flash 16f877a
« Respuesta #10 en: 12 de Abril de 2008, 20:49:26 »
También se puede usar la directiva #org, siempre y cuando no sea para escribir durante la ejecución del programa

Desconectado Cryn

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4169
Re: Guardando datos en la flash 16f877a
« Respuesta #11 en: 12 de Abril de 2008, 20:51:47 »
Tal cual Modulay,write_program_memory() solo esta implementado solo en PIC18, en la linea 16F8x es write_program_eeprom(), y solo escribe una posicion de memoria, disculpas por la confusion de cualquier modo se puede construir una funcion que haga lo mismo, saludos.

no os preocupeis :mrgreen:

ahora si esta mas claro :mrgreen:
.

Desconectado Leon Pic

  • Colaborador
  • DsPIC30
  • *****
  • Mensajes: 3610
    • Impresiones en 3D
Re: Guardando datos en la flash 16f877a
« Respuesta #12 en: 13 de Abril de 2008, 08:38:05 »
No se trata de la eeprom leonpic... quiero guardarlos en la Flash o memoria de programa. De todas formas se confirma lo que he puesto en el anterior post... se pueden inicializar de la manera que expuse.

RETLW 0x88.

asi no da problemas el compilador. Date cuenta de que la memoria de programa consta de 14 bits por eso lo del retlw.

1 saludo

Hola elmasvital. Ahora entiendo tu duda. No me acordaba que el 16f877 se puede grabar en la flash (y eso que estoy utilizando ese micro  :mrgreen: :oops: )

Ten encuenta lo siguiente, si tu programa ocupa hasta su totalidad de la página 2 del dispositivo (por ejemplo) y te queda la página 3 y 4 para grabarla a tu gusto. No hay posibilidad de que se sobre-escriba el dato si NO utilizas el bootloader, ya que tu lo estás haciendo con instrucciones desde la página 1 y 2 y estos no serán modificados. Pero si modificas los valores por error o por medios externos, la página 1 o 2, entonces habrá la posibilidad de que si se sobre-escriba.

Por los valores, me refiero, a los que definen la pocición de memoria a escribir.
Jesús dijo, yo soy el CAMINO, la VERDAD y la VIDA, nadie llega al PADRE si no es por mi.

Desconectado elmasvital

  • Administrador
  • PIC24H
  • *******
  • Mensajes: 1713
Re: Guardando datos en la flash 16f877a
« Respuesta #13 en: 13 de Abril de 2008, 09:36:40 »
En verdad no lo utilizo para almacenar nada del programa si no datos como si se grabaran en la eeprom. La flash tiene una vida de escritura/lectura bastante más alta que la eeprom y es para unos datos que van a necesitarse grabar y leer con bastante frecuencia.

1 saludete.

Desconectado maunix

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4751
    • Mi Sitio Web Personal
Re: Guardando datos en la flash 16f877a
« Respuesta #14 en: 13 de Abril de 2008, 10:45:10 »
elmasvital, recién leo el hilo, pudiste avanzar con el tema de la escritura?

Para guardar datos en 'flash' como si de datos se tratase, yo no usaría el retlw .xx , te explico porqué, porque sencillamente pierdes los bits que ocupa el microcódigo de la instrucción retlw.

Otra cuestión a tener en cuenta es que grabaras datos de a 14 bits.  Es muy útil si guardas 2 caracteres ASCII estándar (que ocupan 7 bits cada uno) pero si quieres guardar datos binarios planos ya tendrás que o bien ingeniartelas para ir leyendo y corriendo bits o bien desperdiciar los 6 bits restantes de la instrucción.

Para inicializar tu código, recomiendo usar alguna directiva db o dt apuntando a la memoria flash, osea con el ORG que apunte a una dirección de memoria de programa.


La flash tiene una vida de escritura/lectura bastante más alta que la eeprom y es para unos datos que van a necesitarse grabar y leer con bastante frecuencia.

Cuidado con esto, la eeprom es la que se puede grabar 10 o 100 veces más seguido que la flash.  Es más, si mal no recuerdo en los 16F877 (sin la A) solo permiten 10 mil grabaciones con lo cual si tu aplicación hace un uso muy intensivo de la grabación de la flash en pocas horas/días te quedarás sin programa.

La flash es mas robusta en cuanto a las variaciones eléctricas de la alimentación , picos de voltaje, ruido , etc (la eeprom es más tendenciosa a borrarse) pero no son muy adecuadas para grabaciones constantes.

Espero lo tengas en cuenta.  Saludos

- La soberbia de un Einstein es entendible.. la de un salame es intolerable (A.Dolina)
- En teoría no hay diferencia entre la teoría y la práctica. En la práctica... si la hay.
- Lee, Lee, Lee y luego pregunta.(maunix)
- Las que conducen y arrastran al mundo no son las máquinas, sino las ideas (V. Hugo)
- Todos los hombres se parecen por sus palabras; solamente las obras evidencian que no son iguales.(Moliere)
- Todo debería ser hecho tan simple como sea posible pero no mas simple que eso.(A.Einstein)


 

anything