4 votos

Qué biblioteca para tarjetas microSD con Arduino

Estoy tratando de utilizar una microSD tarjeta con un Arduino (ATmega328). Estoy usando el SPI de la interfaz.

He intentado usar el Arduino SD contenedor, pero siempre me #include el SD.h archivo de encabezado de la Arduino continuamente se reinicia. Creo que esta es una RAM problema y parece que este es el problema: http://code.google.com/p/sdfatlib/issues/detail?id=15

¿Cómo puedo hacer esto ahora? Lo de la biblioteca/método debo utilizar?

2voto

Jason Dagit Puntos 5998

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 "));

0voto

Simon Gillbee Puntos 366

No soy un experto en la alternativa de GRASA de las bibliotecas, pero los vinculados tema y una breve descremada de la SD de la biblioteca me dice que es algo de una memoria RAM de cerdo. Su ATmega328 tiene 2 kb de RAM. ¿Qué parte de que está utilizando en su aplicación? Puede que se reduzca? Para la depuración de esto, cree un vacío de croquis y el uso de esta función de SdFatUtil.cpp:

/** Amount of free RAM
 * \return The number of free bytes.
 */
int SdFatUtil::FreeRam() { ...

para averiguar cuánto espacio con tu dibujo. Suena como que usted trató de escribir el resto de los croquis en primer lugar, y, a continuación, agregar la SD.horas después del hecho.

Si usted no ve ningún problemas en la arquitectura (es decir, usted no está usando ninguna de 1,5 kB buffers, lo que haría casi imposible el uso de una tarjeta de la biblioteca que requiere 512B de RAM), me gustaría continuar por el movimiento constante de las cadenas y las definiciones de constantes para Flash.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X