Autor Tema: Self-write flash??  (Leído 13528 veces)

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

Desconectado amandapardo

  • PIC10
  • *
  • Mensajes: 10
Self-write flash??
« en: 25 de Agosto de 2013, 15:31:00 »
Hola a todos,

he comenzado hace poco con la programación de pics y estoy haciendo pruebas con el pic16f1503.

Este pic tiene "Flash Program Memory with self read/write capability", según lo que he entendido es un sustitutivo de las EEPROM a la hora de poder guardar información y que si el chip sufre algún corte en la alimentación, cuando se vuelva a alimentar se pueden recuperar los datos grabados antes de sufrir el corte.

He estado leyendo el datasheet pero no me entero muy bien de como funciona la programación de las funciones de lectura/escritura de la memoria flash.

Llevo un par de semanas buscando por todos lados algún ejemplo sencillo con el que poder experimentar y enseñarme a utilizar esta capacidad, pero no he encontrado nada.

También he buscado por este foro pero tampoco he visto nada.

Si alguien sabe de algún ejemplo, si es posible XC8 o en ensamblador, se lo agradecería mucho.

Saludos. Amanda Pardo.

Desconectado MerLiNz

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2463
Re: Self-write flash??
« Respuesta #1 en: 26 de Agosto de 2013, 01:23:17 »
Creo que todos los pics tienen esa funcion en la actualidad por lo cual puedes buscar ejemplos de cualquier pic de esa familia 16f, seguro que del 16f877a hay muchos ejemplos por ahi.

No es que sea un sustituto a las eeprom, se utiliza una eeprom cuando se requiere mucha capacidad, osea cuando la memoria del pic se queda corta.

Buscate ejemplos de pics mas utilizados, si no encuentras nada ya te explico yo por aqui porque es algo complejo.

Desconectado amandapardo

  • PIC10
  • *
  • Mensajes: 10
Re: Self-write flash??
« Respuesta #2 en: 26 de Agosto de 2013, 17:37:52 »
Creo que todos los pics tienen esa funcion en la actualidad por lo cual puedes buscar ejemplos de cualquier pic de esa familia 16f, seguro que del 16f877a hay muchos ejemplos por ahi.

No es que sea un sustituto a las eeprom, se utiliza una eeprom cuando se requiere mucha capacidad, osea cuando la memoria del pic se queda corta.

Buscate ejemplos de pics mas utilizados, si no encuentras nada ya te explico yo por aqui porque es algo complejo.


Hola, he buscado bastante y no he encontrado nada .... de la familia 18f algo encontré en "PIC18 Peripheral Library" pero para pic de la familia 16f no he visto nada.

Si me puedes ayudarme te lo agradeceria.

Desconectado sander

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 624
Re: Self-write flash??
« Respuesta #3 en: 26 de Agosto de 2013, 18:45:57 »
En XC8 Para los PIC16F y PIC16F1, tengo entendido que se deben escribir las funciones que realizan la lectura o escritura de la FLASH, los algoritmos para realizarlo se encuentra en la hoja de datos del microcontrolador, en el caso de su microcontrolador se encuentra en la seccion FLASH PROGRAM MEMORY CONTROL, ahi puede ver los pasos a seguir para leer borrar y grabar en la memoria.

Saludos
La electrónica es el arte de manipular señales eléctricas que transportan información
Jan Davidse

Visita mi blog
Visita mi canal de youtube

Desconectado apricot

  • PIC10
  • *
  • Mensajes: 1
Re: Self-write flash??
« Respuesta #4 en: 27 de Agosto de 2013, 05:55:23 »
A Bootloader is where the Pic is programmed with a small 'bootloader' program which then allows the PC to send a users program to the Pic for the bootloader to place into memory .Focke-Wulf Fw 190. so there is no need to use a hardware programmer like the Pickit2. :-/

Desconectado planeta9999

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3520
    • Pinballsp
Re: Self-write flash??
« Respuesta #5 en: 27 de Agosto de 2013, 07:28:36 »
Este pic tiene "Flash Program Memory with self read/write capability", según lo que he entendido es un sustitutivo de las EEPROM a la hora de poder guardar información y que si el chip sufre algún corte en la alimentación, cuando se vuelva a alimentar se pueden recuperar los datos grabados antes de sufrir el corte.

No deberías de usar la flash para esos menesteres, ten en cuenta que tiene un ciclo de vida muy corto, tan solo 1000 ciclos de  borrado/escritura, luego el chip se queda inservible. Si necesitas un PIC con eeprom, tienes muchos para elegir de 8 bits. Los que trabajamos con PIC32, no tenemos esa suerte, ninguno tiene eeprom, aún así no debe de usarse nunca la flash para simular una eeprom, salvo que el programa grabe datos muy de vez en cuando, como puede ocurrir en un bootloader cuando se utiliza para facilitar actualizaciones de firmware en un producto comercial.


Citar
He estado leyendo el datasheet pero no me entero muy bien de como funciona la programación de las funciones de lectura/escritura de la memoria flash.
Llevo un par de semanas buscando por todos lados algún ejemplo sencillo con el que poder experimentar y enseñarme a utilizar esta capacidad, pero no he encontrado nada.
También he buscado por este foro pero tampoco he visto nada.
Si alguien sabe de algún ejemplo, si es posible XC8 o en ensamblador, se lo agradecería mucho.

Ejemplos en C, será dificil que encuentres, porque hasta la aparición de la serie XC de compiladores, Microchip no ofrecía ningún compilador en C para micros de 8 bits, puede que localices algo de Mikroe pero con sus librerias y compilador.

En ensamblador si que hay cosas, bájate las notas aplicativas AN851 y AN1310 y sus correspondientes fuentes, ahí tienes unos bootloader para PIC16 y PIC18, el fuente está en ensamblador, pero puedes ver como se borra y graba la flash.

El proceso consiste básicamente, en borrar la flash antes de grabarla, imprescindible para poder grabar, el borrado se tiene que hacer por páginas, no puedes borrar una sola direccion, en PIC32 el tamaño de una página es de 4096 bytes, supongo que con los 8 bits será de 1K o menos. Luego ya puedes grabar en la flash. Las rutinas en los fuentes de las notas AN851 y AN1310 están muy bien documentadas, no te costará nada extraer las rutinas de programa que borran y graban la flash.

Yo no perdería el tiempo con esto, salvo que quieras hacer un bootloader, si quieres eeprom para almacenar datos de manera permanente, elige otro PIC, tienes un montón con eeprom desde 64 hasta 256 bytes, y si necesitas más almacenamiento usa una eeprom externa por I2C o una tarjeta SD por SPI.







« Última modificación: 27 de Agosto de 2013, 07:33:11 por planeta9999 »

Desconectado MerLiNz

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2463
Re: Self-write flash??
« Respuesta #6 en: 27 de Agosto de 2013, 12:04:32 »
Creo que todos los pics tienen esa funcion en la actualidad por lo cual puedes buscar ejemplos de cualquier pic de esa familia 16f, seguro que del 16f877a hay muchos ejemplos por ahi.

No es que sea un sustituto a las eeprom, se utiliza una eeprom cuando se requiere mucha capacidad, osea cuando la memoria del pic se queda corta.

Buscate ejemplos de pics mas utilizados, si no encuentras nada ya te explico yo por aqui porque es algo complejo.


Hola, he buscado bastante y no he encontrado nada .... de la familia 18f algo encontré en "PIC18 Peripheral Library" pero para pic de la familia 16f no he visto nada.

Si me puedes ayudarme te lo agradeceria.

En cualquier bootloader para pic16 encontraras el codigo. De todas formas en el datasheet viene como hacerlo, te viene el proceso que viene a ser este:

-Leer el bloque completo
-Modificar lo que quieras escribir
-Pasar el bloque a la RAM
-Escribir de la RAM al bloque

Aun asi, te aviso que este proceso es largo y la escritura tarda unos ms, si se te va la alimentacion puede que no le de tiempo a escribir antes de que se quede sin alimentacion completamente.

Desconectado planeta9999

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3520
    • Pinballsp
Re: Self-write flash??
« Respuesta #7 en: 27 de Agosto de 2013, 12:15:54 »
En cualquier bootloader para pic16 encontraras el codigo. De todas formas en el datasheet viene como hacerlo, te viene el proceso que viene a ser este:

-Leer el bloque completo
-Modificar lo que quieras escribir
-Pasar el bloque a la RAM
-Escribir de la RAM al bloque



Te falta borrar la flash antes de escribir, salvo la primera vez si la página está toda a FF.




Desconectado amandapardo

  • PIC10
  • *
  • Mensajes: 10
Re: Self-write flash??
« Respuesta #8 en: 27 de Agosto de 2013, 17:14:30 »
Gracias a todos, estoy viendo todas las indicaciones que me estáis haciendo a ver si consigo hacer una programación sencilla que funcione.

Por lo que deduzco de lo que me comentáis es que en ensamblador no tiene que haber problemas en programarlo, pero en cambio en C dependiendo del compilador, puede ser que tenga librerías que lo contemplen o no.

Me ha surgido una duda con lo que alguno habéis comentado, ¿se puede iniciar el bloque con una información primera durante la programación?

Voy a investigar todo lo que me comentáis y espero aclarame.

Un saludo a todos.


Desconectado MerLiNz

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2463
Re: Self-write flash??
« Respuesta #9 en: 27 de Agosto de 2013, 18:21:49 »
No es necesario librerias, para escribir en la flash solo necesitas modificar registros y poco mas, cualquier funcion que necesites la puedes implementar desde C con la correspondiente funcion en ASM

Desconectado planeta9999

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3520
    • Pinballsp
Re: Self-write flash??
« Respuesta #10 en: 27 de Agosto de 2013, 22:20:21 »
Por lo que deduzco de lo que me comentáis es que en ensamblador no tiene que haber problemas en programarlo, pero en cambio en C dependiendo del compilador, puede ser que tenga librerías que lo contemplen o no.

Busca por Google algún bootloader para XC8, alguno hay, así trabajas en C que es mucho más cómodo que el ensamblador.


Citar
Me ha surgido una duda con lo que alguno habéis comentado, ¿se puede iniciar el bloque con una información primera durante la programación?

Si claro, tendrás que asignar direcciones de flash concretas para las variables que vayas a almacenar, yo te puedo poner un ejemplo en C32, para los 8 bits debe de haber algo parecido. Estas son algunas de las instrucciones que yo pongo en mi bootloader pare reservar determinadas direcciones de la flash a ciertas variables, que leo con punteros y actualizo con las librerias NVMem, en este ejemplo las incializo todas a 0xFFFFFFFF en el momento de compilar el programa:

unsigned int __attribute__ ((space(prog), address(0x9D005104))) Reservada_62 = 0xFFFFFFFF; // Direccion reservada para usos varios
unsigned int __attribute__ ((space(prog), address(0x9D005108))) Reservada_63 = 0xFFFFFFFF; // Direccion reservada para usos varios
unsigned int __attribute__ ((space(prog), address(0x9D00510C))) Reservada_64 = 0xFFFFFFFF; // Direccion reservada para usos varios
unsigned int __attribute__ ((space(prog), address(0x9D005110))) Reservada_65 = 0xFFFFFFFF; // Direccion reservada para usos varios
unsigned int __attribute__ ((space(prog), address(0x9D005114))) Reservada_66 = 0xFFFFFFFF; // Direccion reservada para usos varios




En C32, el procedimiento completo para leer, modificar y regrabar la flash, sería así, algo parecido habrá para XC8, pero la librería NVMem es solo para PIC32:

// Leo página, FFF bytes, guardo en matriz
     unsigned int pageBuff[1024]; // matriz 1024 elementos para guardar pagina (1024*4=4096 bytes)
     unsigned int *userFlashPage;
     userFlashPage = PAGINA_FLASH_VARIABLES; // Inicio pagina a copiar
     memcpy((void *)pageBuff, (void *)userFlashPage, 4096);

// Reemplazo Numero serie de producto y Codigo producto
      pageBuff[0] = Num_dispositivo;
      pageBuff[1] = Codigo_producto;

// Borro pagina, total 4096 bytes
       NVMemErasePage((void *)PAGINA_FLASH_VARIABLES); 

// Grabo página con matriz temporal modificada, 4096 bytes
      unsigned int ix;
      for(ix = 0; ix < 1024; ix++)
          {
            NVMWriteWord((void *)(userFlashPage + ix), pageBuff[ix]);
          }




Desconectado amandapardo

  • PIC10
  • *
  • Mensajes: 10
Re: Self-write flash??
« Respuesta #11 en: 29 de Agosto de 2013, 08:46:33 »
No es necesario librerias, para escribir en la flash solo necesitas modificar registros y poco mas, cualquier funcion que necesites la puedes implementar desde C con la correspondiente funcion en ASM

Perdona no se si te comprendo bien,... me quieres decir que programando en C se pueden poner cosas escritas en ensamblador??

Desconectado MerLiNz

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2463
Re: Self-write flash??
« Respuesta #12 en: 29 de Agosto de 2013, 08:52:49 »
Asi es, en XC18 se usa asi:

_asm _endasm

por ejemplo:

_asm NOP _endasm

con eso incluyes un NOP en la linea correspondiente

Otra forma es creando un archivo .s e incluyendolo en el proyecto, creas tus respectivas funciones en asm y luego las puedes llamar desde C.

Desconectado MGLSOFT

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 7912
Re: Self-write flash??
« Respuesta #13 en: 29 de Agosto de 2013, 09:08:09 »
No es necesario librerias, para escribir en la flash solo necesitas modificar registros y poco mas, cualquier funcion que necesites la puedes implementar desde C con la correspondiente funcion en ASM

Perdona no se si te comprendo bien,... me quieres decir que programando en C se pueden poner cosas escritas en ensamblador??

En todos los lenguajes (C,Basic,etc) se pueden hacer partes en assembler, normalmente las partes que deben tener control muy rapido son escritas en assembler. :mrgreen: :mrgreen:
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.

Desconectado amandapardo

  • PIC10
  • *
  • Mensajes: 10
Re: Self-write flash??
« Respuesta #14 en: 01 de Septiembre de 2013, 14:08:14 »
Gracias a todos, parece que Mikroe C, tiene librerías que lo soportan, lo probaré a ver si consigo hacer algo.

www.mikroe.com/download/eng/documents/compilers/mikroc/pro/pic/help/flash_memory_library.htm?TB_iframe=true&height=740&width=970

Saludos. Amanda