Qué biblioteca para tarjetas microSD con Arduino

4

Intento usar una tarjeta microSD con un Arduino (ATmega328 ). Estoy usando la interfaz SPI .

He intentado usar el envoltorio Arduino SD, pero cada vez que #include el archivo de encabezado SD.h , el Arduino se reinicia continuamente. Creo que este es un problema de RAM y parece que este es el problema: enlace

¿Cómo voy a hacer esto ahora? ¿Qué biblioteca / método utilizo?

    
pregunta psp

2 respuestas

2

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 "));
    
respondido por el shorted.neuron
0

No soy experto en bibliotecas FAT alternativas, pero el problema vinculado y Un breve vistazo a la biblioteca SD me dice que es algo así como un montón de RAM. Tu ATmega328 tiene 2kB de RAM. ¿Cuánto de eso estás usando en tu aplicación? ¿Se puede reducir eso? Para depurar esto, cree un boceto vacío y use esta función de SdFatUtil.cpp:

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

para saber cuánto espacio tiene tu boceto. Parece que primero intentó escribir el resto del boceto y luego agregar SD.h después del hecho.

Si no ve ningún problema de arquitectura (es decir, no está usando ningún búfer de 1.5kB, lo que haría casi imposible usar una biblioteca SD que requiere 512B de RAM), procedería moviendo la constante Cadenas y definiciones constantes a flash.

    
respondido por el Kevin Vermeer

Lea otras preguntas en las etiquetas