Analizzando l'output con debug=false noto una cosa interessante. Mi chiedevo come mai col debug a false la scrittura di X ed Y finisca prima a "bloccarsi" apparentemente su 2,4 senza passare a 2,5 (che è libero) e dopo parecchi cicli vada a "saltare" a 0,0 ossia fuori dal perimetro e subito dopo "bloccarsi" su 0,1!
Contando il numero di cicli dopo "Inizio navigazione" vedo che si "resetta" su 0,0 esattamente dopo 128 cicli! Ti suona familiare questo valore?
C'è qualche valore intero che "sballa".
Vedo nel codice che oltre ai PROGMEM che non mi convincono, anche varie variabili loali definite "static" senza alcun motivo. Ad esempio:
int cellToAddress(byte X, byte Y) {
static int indirizzo;
indirizzo = (Y-1) * maxX;
return(indirizzo + X);
}
Mi pare tutto inutile, basta fare:
int cellToAddress(byte X, byte Y) {
return((Y-1) * maxX + X);
}
Ma non solo per il discorso dell'inutile variabile statica (variabili locali statiche occupano memoria come variabili globali, quindi se non è necessario che mantengano il valore tra una chiamata e l'altra, le si lascia non statiche ossia allocate di volta in volta): se Y può essere anche zero, questo mi pare sbagliato! Tu hai una mappa dove le coordinate vanno da 0 a 9, d'accordo che tu hai messo le "pareti" da (1,1), ma quando, per ragioni che ancora mi sfuggono, il codice passa a 0,0 (come si vede quando debug=false) questa cosa va a calcolare indirizzi del tutto sballati (quantomeno se Y=0)!!!
Vedi un poco di capire meglio questa cosa, verifica che da nessuna parte ci sia una coordinata a zero, e ti consiglierei di togliere tutte quelle inutili static dove possibile, e le altre lasciarle non statiche togliendo la keyword "static".