TODOPIC

Microcontroladores PIC => Almacén del Assembler => Mensaje iniciado por: elmasvital en 12 de Abril de 2008, 05:10:55

Título: Guardando datos en la flash 16f877a
Publicado por: elmasvital 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
Título: Re: Guardando datos en la flash 16f877a
Publicado por: Leon Pic 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.
Título: Re: Guardando datos en la flash 16f877a
Publicado por: elmasvital 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
Título: Re: Guardando datos en la flash 16f877a
Publicado por: flacoclau 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í.
Título: Re: Guardando datos en la flash 16f877a
Publicado por: pikman 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
Título: Re: Guardando datos en la flash 16f877a
Publicado por: flacoclau 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!!
Título: Re: Guardando datos en la flash 16f877a
Publicado por: Cryn 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:
Título: Re: Guardando datos en la flash 16f877a
Publicado por: Modulay 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)
Título: Re: Guardando datos en la flash 16f877a
Publicado por: Cryn en 12 de Abril de 2008, 20:36:53
ok gracias :mrgreen: vere si se puede
Título: Re: Guardando datos en la flash 16f877a
Publicado por: pikman 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
Título: Re: Guardando datos en la flash 16f877a
Publicado por: Modulay 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
Título: Re: Guardando datos en la flash 16f877a
Publicado por: Cryn 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:
Título: Re: Guardando datos en la flash 16f877a
Publicado por: Leon Pic 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.
Título: Re: Guardando datos en la flash 16f877a
Publicado por: elmasvital 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.
Título: Re: Guardando datos en la flash 16f877a
Publicado por: maunix 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

Título: Re: Guardando datos en la flash 16f877a
Publicado por: elmasvital en 13 de Abril de 2008, 12:41:47
Hola manuix

Se que estoy desperdiciando algunos bits pero lo que guardo son bytes completos y tengo casi 2 bancos vacios de memoria de programa, por lo que no me importa perder unos bits. De todas formas probaré con DT, pero creo que DT no hace más que ponerte retlw seguido del caracter ascii.

Sobre la eeprom - flash parece que leí al revés... creia que la flash era más dura, gracias por el apunte. Veré si me compensa pasar a eeprom pq me parece que es casi casi igual de escribir.

1 saludo
Título: Re: Guardando datos en la flash 16f877a
Publicado por: maunix en 14 de Abril de 2008, 08:44:47
Al respecto de la directiva DT, es como tu dices, pero la db es la que hace lo que te menciono, llenar la memoria con bytes consecutivos. 

Realmente cuando respondí no me acordaba de memoria cual era cual, sabía que una de las 2 era  :mrgreen: :mrgreen:

Sobre la eeprom - flash parece que leí al revés... creia que la flash era más dura, gracias por el apunte. Veré si me compensa pasar a eeprom pq me parece que es casi casi igual de escribir.

Ojo, lee bien mi aclaración.  La flash es más dura, más inmune a las variaciones de tensión, etc.  Pero la eeprom es más adecuada para operaciones frecuentes de lectura/escritura.

La flash y la eeprom son en definitiva ambas memorias eeprom.   :) :)


/Edición: agregué comentario sobre DT