Llena la RAM es casi seguro que tu problema. Desea mantener un extra de 200 a 400 bytes de la pila, dependiendo de la complejidad del programa. Que tienden a tener una gran pila, por lo que mantener al menos 400 abiertos todo el tiempo. Si obtiene menos de que el libre, es el momento de optimizar algo.
Aquí es un ejemplo para mostrar lo mucho que te 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());
}
Arduino versión 0022 ha sido bastante problemático para mí. Yo en lugar de utilizar 0021 y agarrar fat16lib que es más ligero y sirve a mi de registro de datos de las necesidades. Si se puede hacer sin los directorios, el uso de nombres de archivo 8.3, y tarjetas SD <= 2 GB, es muy útil y funciona!
Por último, si usted tiene un montón de datos de la cadena en su programa (como println estados de depuración o de otras cadenas largas, considere la posibilidad de acceder a aquellos directamente desde el ATmega328 de memoria flash, que además de ahorrar RAM. Yo uso conveniente de la biblioteca para este propósito, llamado Flash por cierto. Ver Flash. Yo también recomiendo Mikal del Streaming y PString de la biblioteca. La gent escribe
muy bien pensado fuera de las bibliotecas en mi humilde opinión.
Ejemplo de uso de Flash lib:
Serial.print(F("really long debug message "));