// rutinas de lee y escribe en eprom.
//
//
#include "p30f4011.h"
_FWDT(WDT_OFF); /* Turn off the Watch-Dog Timer. */
void EraseCicle(void);
void EepromWrite(unsigned int Addr , unsigned int Dato);
void EepromReadl(unsigned int Addr , unsigned int* Dato);//UNA VERSION, PASA DIRECION
int EepromReadl2(unsigned int Addr); //OTRA VERSION, RETURN LEIDO
int k, matriz[17]={0x0,0x1,0x2,0x3,0x4,0x5,0x6,0x7,0x8,0x9,0x10,0x11,0x12,0x13,0x1414,0x1515};
int main(void){
k=100;
EepromWrite(0xfc01,1); //PAGINA + 0xfc00 = empieza EPROM
EepromWrite(0xfc02,2); //PAGINA =0x7f, ya puesto en rutinas
EepromWrite(0xfc03,k); //otros pics pueden variar, OJO
EepromWrite(0xfc04,matriz[0]);
EepromWrite(0xfc05,matriz[1]);
EepromWrite(0xfc06,matriz[2]);
EepromReadl(0xfc01,&k);
EepromReadl(0xfc02,&matriz[0]);
EepromReadl(0xfc03,&matriz[1]);
EepromReadl(0xfc04,&matriz[2]);
EepromReadl(0xfc05,&matriz[3]);
EepromReadl(0xfc07,&matriz[4]);
k=k;
matriz[11]=EepromReadl2(0xfc05);
matriz[12]=EepromReadl2(0xfc06);
matriz[13]=EepromReadl2(0xfc09);
matriz[14]=EepromReadl2(0xfc08);
matriz[15]=EepromReadl2(0xfc07);
k=EepromReadl2(0xfc07);
k=k;
//OJO, estamos con 16bits, eprom nombrada de 8,
k=0x1234; // IMPARES Y PARES MEDIO SE SOLAPAN,
EepromWrite(0xfc10,0x1110);
EepromWrite(0xfc12,0x2221);
EepromWrite(0xfc14,matriz[15]);
EepromWrite(0xfc16,matriz[2]);
EepromReadl(0xfc10,&k);
EepromReadl(0xfc12,&matriz[0]);
EepromReadl(0xfc14,&matriz[1]);
EepromReadl(0xfc04,&matriz[2]);
EepromReadl(0xfc05,&matriz[3]);
EepromReadl(0xfc07,&matriz[4]);
k=k;
matriz[11]=EepromReadl2(0xfc05);
matriz[12]=EepromReadl2(0xfc06);
matriz[13]=EepromReadl2(0xfc09);
matriz[14]=EepromReadl2(0xfc08);
matriz[15]=EepromReadl2(0xfc07);
k=EepromReadl2(0xfc01);
k=k;
}
void EraseCicle(void) {
IFS0bits.NVMIF=0;
asm( " DISI #5 " ); // Block all interrupts with priority <7
asm( " MOV #0x55,W0 " ); // for next 5 instructions*/
asm( " MOV W0,NVMKEY " ); // Write the 0x55 key
asm( " MOV #0xAA,W1 " );
asm( " MOV W1,NVMKEY " ); // Write the 0xAA key
asm( " BSET NVMCON,#15 " ); // Initiate program sequence NVMCONbits.WR=1;
asm( " NOP " );
asm( " NOP " );
}
void EepromWrite(unsigned int Addr , unsigned int Dato) {
asm( " push TBLPAG " );
asm( " push w0 " );
asm( " mov #0x7F, w0 " );
asm( " mov w0, TBLPAG " );
asm( " pop w0 " );
asm( " TBLWTL w1, [w0++] " ); //dato ==>> [addr]
asm( " pop TBLPAG " );
NVMCON=0x4044; //borra memoria, (todo a FFFF)
EraseCicle(); while ( IFS0bits.NVMIF==0 ){}
NVMCON=0x4004; //ordena escribir
EraseCicle(); while ( IFS0bits.NVMIF==0 ){}
}
void EepromReadl(unsigned int Addr , unsigned int* Dato){//en esta se entra con direcion
asm( " push TBLPAG " );//actualiza la variable a la que pasamos su direcion
asm( " push w0 " );//no retorna nada
asm( " mov #0x7F, w0 " );
asm( " mov w0, TBLPAG " );
asm( " pop w0 " );
asm( " tblrdl [w0], [w1] " );
asm( " pop TBLPAG " );
}
int EepromReadl2(unsigned int Addr){ //esta es otra version,
asm( " push TBLPAG " ); //entramos con direcion, y return leido
asm( " push w0 " );
asm( " mov #0x7F, w0 " );
asm( " mov w0, TBLPAG " );
asm( " pop w0 " );
asm( " tblrdl [w0], w0 " );
asm( " pop TBLPAG " );
}