La memoria RAM completa es casi seguramente tu problema. Desea mantener 200-400 bytes adicionales para la pila, dependiendo de la complejidad de su programa. Tiendo a tener una pila grande, así que mantengo al menos 400 abiertas todo el tiempo. Si obtiene menos que eso gratis, es hora de optimizar algo.
Aquí hay un ejemplo para mostrarle cuánto le queda:
#define RAMSIZE 2048 //You can probably get this from another define somewhere
int availableMemory() {
int size = RAMSIZE;
byte *buf;
while ((buf = (byte *)
malloc(--size)) == NULL);
free(buf);
return size;
}
void chkMem() {
Serial.print("chkMem free= ");
Serial.print(availableMemory());
Serial.print(", memory used=");
Serial.println(RAMSIZE-availableMemory());
}
La versión 0022 de Arduino ha sido bastante problemática para mí. En cambio, uso 0021 y tomo fat16lib que es más ligero y satisface mis necesidades de registro de datos. Si puede prescindir de los directorios, use los nombres de archivo 8.3 y las tarjetas SD < = 2 GB, ¡es muy útil y funciona!
Finalmente, si tiene una gran cantidad de datos de cadenas en su programa (como sentencias de depuración de println u otras cadenas largas, considere acceder a esos directamente desde la memoria flash del ATmega328, que también ahorrará RAM. Yo uso una biblioteca conveniente para este propósito , se llama Flash incidentalmente. Consulte Flash . También recomiendo encarecidamente a Mikal's Streaming y PString . El gent escribe algunos
bibliotecas realmente bien pensadas IMHO.
Ejemplo usando Flash lib:
Serial.print(F("really long debug message "));