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....