in particolare ho fatto le prove su un dspic30f4011.
Da quel che ho potuto capire di fatto la eeprom e' mappata nella flash per utilizzarla bisogna usare delle apposite
macro e funzioni previste nelle librerie del c30 :
dunque usando le macro del c30 il codice viene cosi' :
Codice: Seleziona tutto
unsigned int _EEDATA(32) table0[16] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,};
questa dichiarazione fatta prima del main serve creare un vettore composto da 16 elementi
ciascuno da 2 byte in eeprom
successivamente per accedere a tali dati bisogna usare una specie di puntatore che viene definito cosi' :
Codice: Seleziona tutto
_prog_addressT indirizzi_eeprom;
poi inizializziamo indirizzi_eeprom associandolo agli indirizzi di table0[]
Codice: Seleziona tutto
_init_prog_address(indirizzi_eeprom, table0);
a questo punto abbiamo che indirizzi_eeprom punta a table0[]
per andare a leggere la eeprom bisogna crearsi una variabile in ram di grandezza sufficente
a contenere table0[] .
supponiamo di aver predisposto la variabile unsigned int table_ram[16].
per copiare i valori di table0[] in table_ram[]
il codice da usare e' :
Codice: Seleziona tutto
_memcpy_p2d16(table_ram, indirizzi_eeprom, 32);
per andarla a scrivere invece bisogna prima cancellarla , il codice e' il seguente :
Codice: Seleziona tutto
_erase_eedata(indirizzi_eeprom ,32);
_wait_eedata();
Codice: Seleziona tutto
_write_eedata_row(indirizzi_eeprom, table_ram);
_wait_eedata();
E fin qui tutto ok .
la cosa che mi sarebbe piaciuto fare ma che non sono riuscito e' di inizializzare la eeprom
come array multi dimensionale tipo table[8][16]
per poi andare a leggere e caricare in ram la riga che mi serviva ... ho optato per dichiarare
una serie di vettori tipo table0[16], table1[16],table... gestendoli con una routine
case switch ...
fa un po' schifo ma funziona .