Salve ![]()
Da tempo sto lavorando ad un semplice impianto di antifurto in casa mia, adesso sto realizzando la centralina. Per la centralina ho utilizzato un Arduino 2009 ed ho gestito le chiavi di accesso con un modulo RFID. Questi moduli mi permettono, non appena avvicino il tag, di leggere una serie di 4byte specifica per ogni chiave. Se questi 4 byte coincidono con quelli che l'arcuino ha in memoria, le chiavi autorizzate, inserisce e disinserisce l'allarme. Nuove chiavi possono essere messe in memoria attraverso un'interfaccia grafica che ho realizzato con una tastiera e un LCD ed ad ogni chiave si può associare una stringa di 21 caratteri che contiene il nome del proprietario associato alla chiave.
Fin qui tutto funziona, ora arriva il problema.
Voglio che questi dati non si perdano nel momento in cui, per un motivo qualunque, venga a mancare l'alimentazione al microcontrollore. Inizialmente ho pensato di utilizzare una EEPROM esterna ma non ci sono riuscito. Ho ripiegato sulla EEPROM interna dell'ATmega che mi offre 1024byte, sufficienti per quello che voglio fare.
per prima cosa ho creato una funzione che mi ha azzerato tutte le locazioni della EEPROM, che altrimenti sono di default a 0xFF. Verificato l'azzeramento con un'altra sempre funzione, ho scritto le seguenti due funzioni per la lettura dei dati e la scrittura dei dati sulla EEPROM
void acquisisci_dato_dalla_EEPROM(){
Â
 n_chiaviRegistrate = EEPROM.read(0);      // il primo indirizzo di memoria contiene il numero
                                   // delle chiavi registrate
 Â
 int ind_base = 0;
  for(int i = 0; i < n_chiaviRegistrate; i++){
  for(int j = 0; j < 4; i++)
   ID_chiavi[i][j] = EEPROM.read(0x002 + j + ind_base);Â
 Â
  for(int j = 0; j < 21; j++)
   nomi_chiavi[i][j] = EEPROM.read(0x006 + j + ind_base);
  ind_base += 0X1A; // Ogni blocco chiave occupa 26 registri
 }
}
ho organizzato la memoria in questo modo:
indirizzo 0x000 --> numero di chiavi registrate
un byte vuoto
da 0x002 a 0x005 --> i 4 byte della chiave
da 0x006 a 0x01A --> i 21 caratteri della stringa del nome
un byte vuoto
poi i blocchi si ripetono
Il problema è che questa funzione quando all'indirizzo 0x000 è memorizzato 0, ovvero non ci sono chiavi, passa tranquillamente e non fa nulla e il programma funziona perfettamente, ma se registro una nuova chiave, e sono sicuro che i dati nella eeprom vengono scritti correttamente perché ho verificato, e quel registro passa a 1, il programma si blocca subito dopo la chiamata della funzione. La chiamata a questo funzione si trova nel Setup, per chiamarla semplicemente resetto l'arduino o scollego l'aliemtazione.
Qualcuno capisce dov'è l'errore? ci sono impazzendo