Autor Tema: Datos fijos en Flash, C30 y PI24F ,SOLUCIONADO!!  (Leído 1511 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado culebrasx

  • PIC10
  • *
  • Mensajes: 39
Datos fijos en Flash, C30 y PI24F ,SOLUCIONADO!!
« en: 28 de Julio de 2010, 20:30:20 »
Hola a todos, llevo ya unos dias leyendo aquí  y allí, leyendo los manulaes del Pic24F, del C30,etc....
Pero parece que no consigo grabar muy bien datos de forma no volatil en el PIC24FJ16GA002
-En un hilo iniciado por Patoso y respondido entre otros por Suky se daban soluciones pero no me apañaban...

-Por lo que he leido se puede leer de la Flash, bien desde el PSV o bien desde la intrucciones TBLRDL/H; indicandoles la pagina en la cual  esta situada la fila y la posición de la fila dentro de esa pagina a traves de las siguientes intrucciones (con permiso se Suky de ampliar su explicación para dummies; entre nosotros nos entendemos....)

TBLPAG = __builtin_tblpage(&Variable);   // nos dice en que pagina esta la variable que buscamos
 tbloffset = __builtin_tbloffset(&Variable);  // nos dice en que posición dentro de es pagina, (numero de calle y puerta de la finca......)
 DataL=__builtin_tblrdl(tbloffset); // guarda lo que lea en la posicion determinada por la variable offset en la pagina conocida; TBLPAG
 DataH=__builtin_tblrdh(tbloffset);  //esta vez se refiere a la palabra alta, menos los 8 bits mas altos no implementados

Ahora viene mi problema: quiero modificar uno de esos datos y que quede perpetuo ante falta de voltaje:
-Por lo que tengo entendido para modificar una columna de flash primero hay que borrarla y luego escribir,cierto?

-NVMCON=0x4042;  // para que borre y lo que borre sea una pagina entera todo a 0xffff
   tbloffset = __builtin_tbloffset(&LSW); // la direccion de un dato de la pagina como pista para saber
      NVMKEY = 0x55;  //obligado
      NVMKEY = 0xAA;  //obligado
      NVMCONbits.WR=1;  /que empiece a hacer lo que le dice NVMCON 0x4042 en este caso
      Nop();  //espera prudente
      Nop();
-Con el borrrado no hay problema pero si que los tengo con la escritura
solo quiero usar la LSW (palabra mas baja 15:0)
tengo que definir la fila como long unsigned, como char? si las defino como char me las pone contiguas, en una fila podria tener tres pares de datos char?
Suponer que se ha definido como long unsigned:

__builtin_tblwtl(tbloffset,0x0033);  //esto creo que escribe en los latch para que luego cuando se requiera lo vuelque,cierto?
TBLPAG = __builtin_tblpage(&color1_r); //en que pagina actuaremos
NVMCON=0x4001;  //si quiero grabar palabras,esta es la opcion,no?
NVMKEY = 0x55;
NVMKEY = 0xAA;
NVMCONbits.WR=1; // Gooooo!!!!!
Nop();
Nop();


Resulta que si pongo 0x4001, no hace nada, si le pongo 0x4003 (row program operation) escribe bien en la fila actual, pero tambien toca las filas siguientes y luego como que no me deja volver a escribir,
llevo ya unos dias y no le cojo el truco, asi que casi me he visto obligado a escribir,muy en contra de mi voluntad.....
no se si tendrá algo que ver con los incrementos del PC, pero si le digo row operation porque toca el resto de filas (por cierto row es fila, es decir los 24 bits mas los 8 fantasmas,no?
un saludo....
« Última modificación: 29 de Julio de 2010, 14:21:44 por culebrasx »

Desconectado culebrasx

  • PIC10
  • *
  • Mensajes: 39
Re: Datos fijos en Flash, C30 y PI24F ,SOLUCIONADO!!
« Respuesta #1 en: 29 de Julio de 2010, 14:31:43 »
No se muy bien porque el modo palabra no funciona, pero en el modo row, row no es que sea una fila, es decir 24 bits efectivos(+8 no)
row son creo recordar 32 intrucciones de palabra, asi que lo que he hecho es cargar hasta 32 latches con las palabras necesarias a traves los registros W2 y W3, dejando que se incremente W0 por si solo y una vez cargadas las palabras requerias,(27 eran mi caso) le he dado la instruccion que programe toda la row del tiron, y voila!!!!

el ejemplo es un poco brusco y no muy elegante pero es que me estoy acostrumbrando al C30 y todavia tiro un poco de ensamblador.:

asm("MOV #0x0290,W0");   //0x0290 es  donde empieza mis datos en la memoria de programa
asm("MOV #0xFF00,W3");   //como no usare la 'palabra' alta la dejo asi
asm ("MOV 0x0800, W2");  //0x0800 es donde empiezan los datos del bakcup antes de borrar toda la flash

asm("TBLWTL.w W2, [W0]"); // asi guardo lo del registro 2 en el latch
asm("TBLWTH.w W3, [W0++]"); // idem para el 3, aunque no lo use lo declaro asi y lo grabo, uno, que es maniatico...


asm("MOV #0x4001, W0");  //que cuando corresponda programe toda una row
asm("MOV W0, NVMCON");
asm volatile("disi #5");  //desactivar interrupciones durante los proximos
      NVMKEY = 0x55;
      NVMKEY = 0xAA;
      NVMCONbits.WR=1;
      Nop();
      Nop();   


lo dejo mas o menos aclarado por si a alguien le puede servir. ;-)


 

anything