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

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

Desconectado amandapardo

  • PIC10
  • *
  • Mensajes: 10
Re: Self-write flash??
« Respuesta #15 en: 06 de Septiembre de 2013, 08:08:35 »
Hola a todos de nuevo,

tal y como os comenté estoy con Mikroe C intentando lo de escribir y leer la flash del pic16f1503.

Estoy haciendo un pequeño programilla basado en un ejemplo que provee Mikroe C pero para otro pic16 distinto, pero no consigo hacer que funcione.

Os lo dejo aqui para si alguien puede echarle un vistazo y decirme que esta pasando.

Saludos. Amanda

*********************************************************
char i = 0;
unsigned int addr, data_, dataAR[4][4] = {{0x3FAA+0, 0x3FAA+1, 0x3FAA+2, 0x3FAA+3},
 {0x3FAA+4, 0x3FAA+5, 0x3FAA+6, 0x3FAA+7},
 {0x3FAA+8, 0x3FAA+9, 0x3FAA+10, 0x3FAA+11},
 {0x3FAA+12, 0x3FAA+13, 0x3FAA+14, 0x3FAA+15}};
void main() {
 C1ON_bit = 0; // Disable comparators
 C2ON_bit = 0;

 PORTA = 0; // Todos los pines del puerto PORTA se ponen a cero
 TRISA = 0b11111100; // Todos los pines del puerto PORTA menos PORTA.RA0 se
 // configuran como salidas

 Delay_ms(500);

 addr =0x0700; // starting Flash address
 for (i = 0; i < 4; i++){ // Write some data to Flash
 Delay_ms(100);
 // FLASH_Erase(addr+i*4);
 FLASH_Write(addr+i*4, dataAR);
 }

 Delay_ms(500);

 addr = 0x0700;
 for (i = 0; i < 16; i++){
 data_ = FLASH_Read(addr++); // P16's FLASH is 14-bit wide, so

 Delay_us(20);

 if ((i==0) & (data_ == 16298)){ // 16298 == 0x3FAA
 PORTA=0b00000010; //ilumino en Proteus el led verde
 }else{
 PORTA=0b00000001; //ilumino en Proteus el led amarillo
 }

 Delay_ms(500);
 }
************************************************************************

Desconectado MerLiNz

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2463
Re: Self-write flash??
« Respuesta #16 en: 06 de Septiembre de 2013, 11:01:50 »
He estado mirando el datasheet de tu pic y he visto que el maximo de memoria que tiene es hasta 0x07FF y tu estas intentando escribir en 0x3FAA

http://ww1.microchip.com/downloads/en/DeviceDoc/41607A.pdf

En el apartado MEMORY ORGANIZATION
« Última modificación: 06 de Septiembre de 2013, 11:07:47 por MerLiNz »

Desconectado planeta9999

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3520
    • Pinballsp
Re: Self-write flash??
« Respuesta #17 en: 06 de Septiembre de 2013, 11:23:45 »
Estoy haciendo un pequeño programilla basado en un ejemplo que provee Mikroe C pero para otro pic16 distinto, pero no consigo hacer que funcione.


 addr =0x0700; // starting Flash address
 for (i = 0; i < 4; i++){ // Write some data to Flash
 Delay_ms(100);
 // FLASH_Erase(addr+i*4);
 FLASH_Write(addr+i*4, dataAR);
 }


Al margen de que puedan haber otros errores como el que comenta MerLiNz, no estás borrando la flash antes de grabarla, si no lo haces es imposible que funcione.

En cuanto a ese borrado comentado, dentro del FOR, tampoco funcionaría si lo utilizas. La flash se borra del tirón toda una página, no hay que borrarla dirección por dirección en bucle como has intentado probar (sin éxito supongo), de manera que de hacerlo tendría que estar ANTES y FUERA del bucle FOR y en una sola instrucción, a menos que quieras borrar más de una página.

No conozco el C de Mikroe, pero suponiendo que el resto del programa es correcto y no hay errores en el juego de instrucciones, podrías probar algo asi, date cuenta de que borramos la página completa de la flash, y luego entramos en bucle a grabar. Cerciórate también de que esa dirección que estás usando 0x700 existe en la flash de tu PIC, cógete el datasheet y mira el mapa de memoria.

addr =0x0700; // starting Flash address
FLASH_Erase(addr);

 for (i = 0; i < 4; i++)
{
      Delay_ms(100);
      FLASH_Write(addr+i*4, dataAR); // Write some data to Flash
 }


« Última modificación: 06 de Septiembre de 2013, 11:31:53 por planeta9999 »

Desconectado amandapardo

  • PIC10
  • *
  • Mensajes: 10
Re: Self-write flash??
« Respuesta #18 en: 06 de Septiembre de 2013, 11:50:52 »
Creo que 0x3FAA es uno de los datos de la tabla que se utiliza para grabar en la flash..... la dirección apartir de donde se graba es: addr =0x0700; .... si no me equivoco, no?

He estado mirando el datasheet de tu pic y he visto que el maximo de memoria que tiene es hasta 0x07FF y tu estas intentando escribir en 0x3FAA

http://ww1.microchip.com/downloads/en/DeviceDoc/41607A.pdf

En el apartado MEMORY ORGANIZATION

Desconectado MerLiNz

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2463
Re: Self-write flash??
« Respuesta #19 en: 06 de Septiembre de 2013, 11:52:02 »
Estoy haciendo un pequeño programilla basado en un ejemplo que provee Mikroe C pero para otro pic16 distinto, pero no consigo hacer que funcione.


 addr =0x0700; // starting Flash address
 for (i = 0; i < 4; i++){ // Write some data to Flash
 Delay_ms(100);
 // FLASH_Erase(addr+i*4);
 FLASH_Write(addr+i*4, dataAR);
 }


Al margen de que puedan haber otros errores como el que comenta MerLiNz, no estás borrando la flash antes de grabarla, si no lo haces es imposible que funcione.

En cuanto a ese borrado comentado, dentro del FOR, tampoco funcionaría si lo utilizas. La flash se borra del tirón toda una página, no hay que borrarla dirección por dirección en bucle como has intentado probar (sin éxito supongo), de manera que de hacerlo tendría que estar ANTES y FUERA del bucle FOR y en una sola instrucción, a menos que quieras borrar más de una página.

No conozco el C de Mikroe, pero suponiendo que el resto del programa es correcto y no hay errores en el juego de instrucciones, podrías probar algo asi, date cuenta de que borramos la página completa de la flash, y luego entramos en bucle a grabar. Cerciórate también de que esa dirección que estás usando 0x700 existe en la flash de tu PIC, cógete el datasheet y mira el mapa de memoria.

addr =0x0700; // starting Flash address
FLASH_Erase(addr);

 for (i = 0; i < 4; i++)
{
      Delay_ms(100);
      FLASH_Write(addr+i*4, dataAR); // Write some data to Flash
 }




de eso tambien me di cuenta, pero tambien pense que por defecto ya esta borrada, asi que como minimo le deberia escribir lo que pone, luego para modificar los valores ya si habria que borrar, pero para escribir por primera vez le vale el codigo.

Desconectado amandapardo

  • PIC10
  • *
  • Mensajes: 10
Re: Self-write flash??
« Respuesta #20 en: 06 de Septiembre de 2013, 11:58:20 »
Estoy haciendo un pequeño programilla basado en un ejemplo que provee Mikroe C pero para otro pic16 distinto, pero no consigo hacer que funcione.


 addr =0x0700; // starting Flash address
 for (i = 0; i < 4; i++){ // Write some data to Flash
 Delay_ms(100);
 // FLASH_Erase(addr+i*4);
 FLASH_Write(addr+i*4, dataAR);
 }


Al margen de que puedan haber otros errores como el que comenta MerLiNz, no estás borrando la flash antes de grabarla, si no lo haces es imposible que funcione.

En cuanto a ese borrado comentado, dentro del FOR, tampoco funcionaría si lo utilizas. La flash se borra del tirón toda una página, no hay que borrarla dirección por dirección en bucle como has intentado probar (sin éxito supongo), de manera que de hacerlo tendría que estar ANTES y FUERA del bucle FOR y en una sola instrucción, a menos que quieras borrar más de una página.

No conozco el C de Mikroe, pero suponiendo que el resto del programa es correcto y no hay errores en el juego de instrucciones, podrías probar algo asi, date cuenta de que borramos la página completa de la flash, y luego entramos en bucle a grabar. Cerciórate también de que esa dirección que estás usando 0x700 existe en la flash de tu PIC, cógete el datasheet y mira el mapa de memoria.

addr =0x0700; // starting Flash address
FLASH_Erase(addr);

 for (i = 0; i < 4; i++)
{
      Delay_ms(100);
      FLASH_Write(addr+i*4, dataAR); // Write some data to Flash
 }




Yo creo que si existe ... en el datasheet habla de un  maximo de memoria que tiene es hasta 0x07FF ... por lo que deduzco que la 0x0700 es viable, no?

Respecto a lo que comentas del borrado de la memoria seria como repetir el bucle for del write pero esta vez con el erase, y este bucle erase antes del bucle write, no?

Desconectado MerLiNz

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2463
Re: Self-write flash??
« Respuesta #21 en: 06 de Septiembre de 2013, 11:59:28 »
Creo que 0x3FAA es uno de los datos de la tabla que se utiliza para grabar en la flash..... la dirección apartir de donde se graba es: addr =0x0700; .... si no me equivoco, no?

He estado mirando el datasheet de tu pic y he visto que el maximo de memoria que tiene es hasta 0x07FF y tu estas intentando escribir en 0x3FAA

http://ww1.microchip.com/downloads/en/DeviceDoc/41607A.pdf

En el apartado MEMORY ORGANIZATION

si, no me di cuenta de eso, de todas formas para empezar a probar te recomiendo que hagas una simple escritura y una simple lectura ya que tanto dato sin haberlo escrito uno mismo es mas dificil de ver donde esta el fallo, osea lo que te digo es:

main() {
Flash_write(0x0700,0x00FA);
val=Flash_read(0x0700);
if(val=0x00FA) ilumino....
}

otra cosa que te falta es un while(1) en el final del codigo para que no se resetee constantemente

Desconectado planeta9999

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3520
    • Pinballsp
Re: Self-write flash??
« Respuesta #22 en: 06 de Septiembre de 2013, 14:58:59 »
Yo creo que si existe ... en el datasheet habla de un  maximo de memoria que tiene es hasta 0x07FF ... por lo que deduzco que la 0x0700 es viable, no?

Si, la última dirección de la flash sería la 0x07FF, que en decimal es 2047, el tamaño de flash para ese micro


Citar
Respecto a lo que comentas del borrado de la memoria seria como repetir el bucle for del write pero esta vez con el erase, y este bucle erase antes del bucle write, no?

No.
La flash no se borra dirección a dirección, se borra por páginas. Cuando lanzas la función de borrado, se está borrando una página completa
¿ cuanto es una página ?, yo solo trabajo con PIC32, en ese caso una página son 4096 bytes, supongo que en un PIC de 8 bit, una página serán 1024 bytes o incluso 512 bytes.

Es decir que cada que vez que llamas a la función de borrado, en realidad se están borrando 1024 bytes o 512 bytes, del tirón, teniendo en cuenta que ese pic tiene 2048 bytes de Flash, suponiendo que el tamaño de página fuera de 1024 bytes (que no lo se, solo lo sospecho), con solo dos llamadas a la función de borrado, tendrías TODA la flash limpia, si el tamaño de página fuera de 512 bytes, pues con 4 llamadas a la función de borrado, toda la flahs borrada. Para eso no hace falta meter la llamada en un bucle.

¡ Ojo ¡, que si borras la flash en la que en ese momento se está ejecutando el programa, el PIC se colgará.  :mrgreen: :mrgreen:

« Última modificación: 06 de Septiembre de 2013, 15:01:03 por planeta9999 »

Desconectado MerLiNz

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2463
Re: Self-write flash??
« Respuesta #23 en: 06 de Septiembre de 2013, 15:44:58 »
En este caso, este pic16 hace los borrados por row, es decir, borra de 14 en 14bits por cada funcion de erase asi que tal como lo tienes esta bien, sin embargo ya te digo, un pic sin escribir ninguna vez no necesitas borrarla puesto que por defecto esta borrada.

Desconectado amandapardo

  • PIC10
  • *
  • Mensajes: 10
Re: Self-write flash??
« Respuesta #24 en: 10 de Septiembre de 2013, 05:04:58 »
Creo que 0x3FAA es uno de los datos de la tabla que se utiliza para grabar en la flash..... la dirección apartir de donde se graba es: addr =0x0700; .... si no me equivoco, no?

He estado mirando el datasheet de tu pic y he visto que el maximo de memoria que tiene es hasta 0x07FF y tu estas intentando escribir en 0x3FAA

http://ww1.microchip.com/downloads/en/DeviceDoc/41607A.pdf

En el apartado MEMORY ORGANIZATION

si, no me di cuenta de eso, de todas formas para empezar a probar te recomiendo que hagas una simple escritura y una simple lectura ya que tanto dato sin haberlo escrito uno mismo es mas dificil de ver donde esta el fallo, osea lo que te digo es:

main() {
Flash_write(0x0700,0x00FA);
val=Flash_read(0x0700);
if(val=0x00FA) ilumino....
}

otra cosa que te falta es un while(1) en el final del codigo para que no se resetee constantemente

Hola, al parecer esto que me comentas no se puede hacer ya que según dicen aquí siempre hay que hacerlo todo por bloques, en mi caso 16 words para el 16f1503.

Aquí es donde viene el ejemplo que cogí para intentar adaptarlo a mi pic, http://www.mikroe.com/download/eng/documents/compilers/mikroc/pro/pic/help/flash_memory_library.htm

El caso es que no paro de repasar todo, una y otra vez... y no consigo averiguar porque no me funciona.

Saludos de la que va a perder la cabeza. ;)

Desconectado BBMNet

  • PIC12
  • **
  • Mensajes: 91
Re: Self-write flash??
« Respuesta #25 en: 10 de Septiembre de 2013, 05:49:28 »
Perdón por la intromisión.

Tal vez malentiendo pero ¿es el programa (o algún procedimiento de él) lo que se pretende modificar durante la ejecución del mismo? ¿Alguien conoce de algún caso donde se tenga que alterar o cambiar un programa en ejecución?

Ciertamente se puede y se me hace lógico llegar a cambiar la información del área de datos incluyendo el área eeprom durante la ejecución de un programa (por ejemplo en la actualización de parámetros de operación) pero no me imagino hacer cambios en el programa mismo. Sobre todo que no se me ocurre de donde se leería el nuevo procedimiento.

Recuerdo el uso de overlays cuando las computadoras tenían 64KB o menos donde según la función reemplazaban procedimientos en la memoria de acuerdo a las necesidades (sistema operativo CP/M y similares) pero no se me ocurre hacer lo mismo en un controlador ya que se pueden seleccionar chips con más memoria de programa o en algunos incluso añadir chips de memoria adicionales.

Puedo equivocarme pero por más que le pienso no se me ocurre tal situación.

Si alguien conoce tal caso por favor ilústrenme. Bien valdría la pena conocer el caso para desarrollar la técnica correspondiente.

Un saludo y estaré muy al pendiente de este hilo.

Desconectado planeta9999

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3520
    • Pinballsp
Re: Self-write flash??
« Respuesta #26 en: 10 de Septiembre de 2013, 06:09:50 »
Tal vez malentiendo pero ¿es el programa (o algún procedimiento de él) lo que se pretende modificar durante la ejecución del mismo? ¿Alguien conoce de algún caso donde se tenga que alterar o cambiar un programa en ejecución?

Esa es sencillita, un Bootloader.


Citar
Ciertamente se puede y se me hace lógico llegar a cambiar la información del área de datos incluyendo el área eeprom durante la ejecución de un programa (por ejemplo en la actualización de parámetros de operación) pero no me imagino hacer cambios en el programa mismo. Sobre todo que no se me ocurre de donde se leería el nuevo procedimiento.

En un bootloader, se cambia todo o parte del programa, para actualizar el firmware del chisme en cuestión, seguro que en tu casa estás rodeado de aparatos a los que les puedes actualizar el firmware (móvil, consola, televisor, etc...).

El firmware puede ser necesario cambiarlo para corregir bugs detectados, mejorar las prestaciones o añadir nuevas, cualquier producto electrónico que sale al mercado hoy en día, se puede actualizar gracias al bootloader que llevan cargado.

Yo lo primero que me planteé al hacer mis primeros diseños comerciales, fué programar un Bootloader, incluso antes de diseñar los circuitos, me puse a crear mi propio bootloader encriptado, para poder facilitar actualizaciones a mis futuros clientes, es algo imprescindible. Imagínate que pones un producto en la calle, y resulta que tiene errores de programa, a ver como corriges el problema con cientos o miles de unidades vendidas y dispersas por el "mundo".



Desconectado MerLiNz

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2463
Re: Self-write flash??
« Respuesta #27 en: 10 de Septiembre de 2013, 06:42:04 »
Lo estabas haciendo en proteus no?? Porque no miras que valor contiene la rom en la direccion que escribiste? A ver si el problema es que no escribe, o que no lee.

Desconectado BBMNet

  • PIC12
  • **
  • Mensajes: 91
Re: Self-write flash??
« Respuesta #28 en: 10 de Septiembre de 2013, 13:12:24 »
Gracias por tu respuesta amigo planeta9999, pero sigo con la duda.

Cuando corres un bootloader para modificar o actualizar el firmware de un dispositivo como yo lo entiendo es que en sí el bootloader no corre en la memoria que se va a modificar sino en otra. Hasta donde sé es lo que se llama(ba) shadow ram o memoria sombra.

Como lo entiendo es por ejemplo en el BIOS de una PC donde al arrancar todo el contenido del eprom es copiado a la zona ram correspondiente. De esa manera es que es posible actualizar el BIOS. El procedimiento ya no corre desde la eprom sino desde su imágen en ram. Entre otras cosas por eso es muy importante no interrumpir el proceso de actualización cuando se está ejecutando. Si se interrumpe, el contenido de la eprom quedaría dañado o incompleto.

De lo anterior he visto procedimientos de "emergencia" donde se permite "regresar" la información de la imágen en ram al eprom. Por supuesto si es que no se ha apagado el equipo.

Quiero entender algo. De acuerdo a lo que leí en el hilo permíteme unas preguntas.

1. ¿Es posible borrar el área de la memoria de programa en forma zonificada?
2. En tu idea del bootloader, en sí el bootloader no puede ser cambiado ¿o sí?
3. Para la modificación del área de programa el origen de la información ¿es siempre externo?

De hecho mi duda general parte de la última pregunta ya que es en sí lo que no me puedo imaginar. Que un programa en ejecución se pueda modificar a sí mismo partiéndo de las propias condiciones que encuentre.

Lo he visto en técnicas de AI (inteligencia artificial). El caso más clásico es en los algoritmos genéticos y evolutivos, pero no se me ocurre en un microcontrolador sobre todo porque dichas técnicas corren en ram y memoria secundaria (disco duros, etc.).

Gracias por tu atención.

Desconectado planeta9999

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3520
    • Pinballsp
Re: Self-write flash??
« Respuesta #29 en: 10 de Septiembre de 2013, 13:37:37 »
Gracias por tu respuesta amigo planeta9999, pero sigo con la duda.

Cuando corres un bootloader para modificar o actualizar el firmware de un dispositivo como yo lo entiendo es que en sí el bootloader no corre en la memoria que se va a modificar sino en otra. Hasta donde sé es lo que se llama(ba) shadow ram o memoria sombra.

Claro el bootloader, tiene que estar en una parte de la flash que no vamos a borrar, si no la liaríamos parda, y se bloquearía todo.
Todo el programa se almacena en la flash, normalmente el bootloader a partir de la primera dirección de la flash. Ese término de "shadow ram", no creo que sea aplicable a los microcontroladores, en todo caso a un PC y similares, para que los programas se ejecuten desde RAM más rápido, en un microcontrolador estamos muy limitados, TODO se ejecuta desde la flash, la RAM es solo para almacenar variables de trabajo.


Citar
Como lo entiendo es por ejemplo en el BIOS de una PC donde al arrancar todo el contenido del eprom es copiado a la zona ram correspondiente. De esa manera es que es posible actualizar el BIOS. El procedimiento ya no corre desde la eprom sino desde su imágen en ram. Entre otras cosas por eso es muy importante no interrumpir el proceso de actualización cuando se está ejecutando. Si se interrumpe, el contenido de la eprom quedaría dañado o incompleto.

Si eso en un PC, pero no es aplicable a los microcontroladores, date cuenta de que trabajamos con tamaños de flash y RAM muy pequeños en comparación con un PC.


Citar
1. ¿Es posible borrar el área de la memoria de programa en forma zonificada?

No es que sea posible, es que es obligatorio, por páginas, en los PIC32 son páginas de 4096 bytes, en otros micros más pequeños supongo que serán páginas de 1K o menos, yo hace muchos años que solo trabajo con PIC32, en cualquier caso la flash no se puede borrar por dirección, hay que borrar obligatoriamente un bloque de memoria, el tamaño de ese bloque ya dependerá de si el micro es de 8, 16, 32 bits...


Citar
2. En tu idea del bootloader, en sí el bootloader no puede ser cambiado ¿o sí?

Podría, pero es peligroso, si no se hace bien el PIC se quedaría bloqueado.
Aunque en principio parece algo absurdo, si que me lo planteé hace tiempo, para el caso de que algún fabricante (chino) me hackease alguna de mis placas, para esos casos liberar un firmware que regrabase el bootloader, se puede hacer, es decir que en vez de ser el bootloader el que actualiza el firmware, fuese el firware el que actualizase el bootloader. Siempre que no pises y borres la página en la que en ese momento se está ejecutando el programa, lo puedes hacer.


Citar
3. Para la modificación del área de programa el origen de la información ¿es siempre externo?

Es que interno, no tiene mucho sentido, una zona de la flash que actualice otra zona de la flash, ¿ para que quieres hacer eso ?.
Otra cosa es utilizar la flash para guardar variables que se conserven tras quitar alimentación al micro, en caso de que no tengas eeprom, como ocurre con los PIC32.


Citar
De hecho mi duda general parte de la última pregunta ya que es en sí lo que no me puedo imaginar. Que un programa en ejecución se pueda modificar a sí mismo partiéndo de las propias condiciones que encuentre.

Es que eso solo suele ocurrir en dos casos, un bootloader para actualizar fimware, y usar la flash simulando una eeprom, aunque en este segundo caso es para guardar datos, no programa.


Citar
Lo he visto en técnicas de AI (inteligencia artificial). El caso más clásico es en los algoritmos genéticos y evolutivos, pero no se me ocurre en un microcontrolador sobre todo porque dichas técnicas corren en ram y memoria secundaria (disco duros, etc.).

Ya, pero es que con los microcontroladores, jugamos con muy poca memoria, no se pueden aplicar algoritmos complejos para que el micro decida autoreprogramarse cuando quiera, reprogramar la flash desde el propio programa solo suele ser necesario en los bootloader, o cuando quieres usar la flash como memoria no volatil para guardar variables.






« Última modificación: 10 de Septiembre de 2013, 13:40:28 por planeta9999 »


 

anything