TODOPIC

Microcontroladores PIC => dsPIC => Mensaje iniciado por: leotardo en 27 de Mayo de 2007, 20:52:52

Título: aqui ejemplo de eprom para pic30f4011
Publicado por: leotardo en 27 de Mayo de 2007, 20:52:52
//  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       " );       
   }