Ciao a tutti,
Sto progettando un robottino basandomi su un ATMega644P.
Il robot prende spunto dal roomba: se riuscirò a finire il progetto sarà in grado di navigare per la casa e ritornare alla base. Ho intenzione di fare questo mediante l'algoritmo A* (Implementation of A*).
Per ovviare al problema della SRAM ho pensato di inserire su un chip esterno le variabili necessarie all'algoritmo (la mappa e le liste).
La mappa viene memorizzata in una griglia, dove ogni cella ha un valore definito da un byte che indica il suo stato (base, posizione corrente, libera, occupata, etc).
Come SRAM esterna ho deciso di utilizzare il 23K256. Guardando il datasheet (http://ww1.microchip.com/downloads/en/DeviceDoc/22100F.pdf) sono riuscito a capire come farlo funzionare (pag. 7).
Quello che chiedo è: cosa ne pensate del metodo che ho utilizzato per recuperare il valore di una cella? Oltre alla funzionalità avrei bisogno di ottimizzare al meglio l'utilizzo della memoria interna del chip, pensate che sia migliorabile?
Ho sempre lavorato su progetti piccoli, questo è il piccolo progetto grande e sopratutto scritto in completa autonomia, perdonatemi se ho scritto cavolate.
P.S.
L'indirizzo del byte da leggere/scrivere è composto da 16bit, quindi ho deciso di utilizzare come indirizzo per i bit una concantenazione del valore X e Y convertiti in binario. Credo che potrebbe funzionare, ho visto che il valore massimo per l'indirizzo è 7FFF (pag. 6 del datasheet), che quindi dovrebbe corrispondere a 32767 (111111111111111), è giusto o ho interpretato male il datasheet?
Grazie in anticipo
const byte SRAMRead[8] PROGMEM = {0,0,0,0,0,0,1,1};
const byte SRAMWrite[8] PROGMEM = {0,0,0,0,0,0,1,0};
const byte SRAMCSDelay PROGMEM = 1;
const byte SRAMIODelay PROGMEM = 1;
bool setMAP(byte reqX, byte reqY, bool SET) {
//GET BYTE ADDRESS
byte bynaryX[8];
byte bynaryY[8];
for(byte i = 0;i<=7; i++){
bynaryX[i] = bitRead(reqX, i);
bynaryY[i] = bitRead(reqY, i);
}
digitalWrite(SRAMSck, LOW);
delay(5);
shiftRegister(1, 7); //SET PIN CS ON
delay(SRAMCSDelay);
while(1) {
shiftRegister(0, 7); //SET PIN CS OFF
delay(SRAMCSDelay);
//SEND WRITE BYTE
for(byte i = 1; i <= 8; i++) {
digitalWrite(SRAMIn, SRAMWrite[i]);
digitalWrite(SRAMSck, HIGH);
delay(SRAMIODelay);
digitalWrite(SRAMSck, LOW);
delay(SRAMIODelay);
}
//SEND X BYTE AS ADDRESS
for(byte i = 0; i<=8; i++){
digitalWrite(SRAMIn, bynaryX[i]);
digitalWrite(SRAMSck, HIGH);
delay(SRAMIODelay);
digitalWrite(SRAMSck, LOW);
delay(SRAMIODelay);
}
//SEND Y BYTE AS ADDRESS
for(byte i = 0; i<=8; i++){
digitalWrite(SRAMIn, bynaryY[i]);
digitalWrite(SRAMSck, HIGH);
delay(SRAMIODelay);
digitalWrite(SRAMSck, LOW);
delay(SRAMIODelay);
}
//SEND SET BYTE
for(byte i = 0; i<=8; i++) {
digitalWrite(SRAMIn, bitRead(SET, i));
digitalWrite(SRAMSck, HIGH);
delay(SRAMIODelay);
digitalWrite(SRAMSck, LOW);
delay(SRAMIODelay);
}
shiftRegister(1, 7); //SET PIN CS ON
//READ IF CORRECTLY SET
if(readMAP(reqX, reqY)==SET) {
return(true);
}
}
}
bool readMAP(byte reqX, byte reqY) {
//ANCORA DA SCRIVERE
}