Forum: Mikrocontroller und Digitale Elektronik FatFS auf Atmega644


von Stephan B. (stephan_tdci)


Lesenswert?

Hallo,


Ich bin gerade etwas mit SD-Karten und FAT32-Dateisystem am testen.

Nur komme ich dort erneut an Probleme, wo ich nicht klar komme..

Ich verwende einen Atmega644, dieser Stellt bereits einen Webserver 
bereit (von U. Radig). Da ich eine SDHC-Speicherkarte habe mit 16GB, 
muss ich diese mindestens mit Fat32 formatieren, was die Erweiterung bei 
U.Radig auf der Seite unbrauchbar macht, da diese nur Fat16 kann.


Habe mich dann hier ein wenig eingelesen und komme immer wieder auf 
FatFs zurück. Habe mir also die Library geladen und in Atmel Studio 
importiert.

Die Dateien habe ich angepasst. Dazu habe ich mir dann aus einem 
Beispiel noch die mmc_avr_spi.c kopiert und die defines und power_on 
Funktionen alle angepasst.


Kompilieren, keine Fehler.

Dann habe ich in der main.c folgendes hinzugefügt:
1
#include "sdcard/diskio.h"
2
#include "sdcard/ff.h"
3
4
FIL fil;
5
char line[100];
6
FRESULT fr;
7
8
f_mount(&FatFs, "", 0);
9
10
fr = f_open(&fil, "index.html", FA_READ);
11
12
if (fr) {
13
    usart_write("FILE FOUND");
14
15
}
16
else {
17
    usart_write("FILE NOT FOUND");
18
19
}


Versuche ich das ganze jetzt zu Kompilieren erhalte ich folgende 
Meldung:
Data Memory Usage: 7028 bytes 171,6% Full (Memory Overflow)


Hat das schon mal jemand gehabt? Ist FatFs für Atmega644 ungeeignet? Ich 
lese immer wieder das es aktiv so betrieben wird..

Danke !!

von Stefan F. (Gast)


Lesenswert?

Fat32 ist eine Erweiterung auf Fat16 zur Unterstützung langer 
Dateinamen. Soweit mir bekannt ist, kann man also Fat32 Filesystem mit 
einem Fat16 Treiber lesen. Man sieht dann halt nur die kurzen 
Dateinamen, die auch DOS Programme sehen würden.

Wie dem auch sei, ich bin mit der avrfat32 Library 
(https://www.mikrocontroller.net/articles/AVR_FAT32) auf einem 
ATmega644P und einem Xmega128D3 bisher gut zurecht gekommen.

Eventuell musst du die Karte mit einer kleineren Partition ausstatten. 
Ich meine, dass der SD Standard nur bis 2GB geht, habe allerdings auch 
schon eine 4GB Karte verwenden können. Größere habe ich nicht versucht.

> Versuche ich das ganze jetzt zu Kompilieren erhalte ich folgende
> Meldung:
> Data Memory Usage: 7028 bytes 171,6% Full (Memory Overflow)

Ich glaube, da hast du ein ganz anderes Problem. Die avrfat32 Library 
belegt weniger als 1kB RAM und es würde mich wundern, wenn das bei FatFs 
großartig anders wäre.

Wie hast du denn deine String-Konstanten geschrieben? Sind Dir die 
Makros PSTR() und PROGMEM bekannt?

von Ben B. (Firma: Funkenflug Industries) (stromkraft)


Lesenswert?

Evtl. auf den ATMega1284 ausweichen, dann gibts satte 16kByte RAM.

von Mw E. (Firma: fritzler-avr.de) (fritzler)


Lesenswert?

Stefanus F. schrieb:
> Fat32 ist eine Erweiterung auf Fat16 zur Unterstützung langer
> Dateinamen. Soweit mir bekannt ist, kann man also Fat32 Filesystem mit
> einem Fat16 Treiber lesen. Man sieht dann halt nur die kurzen
> Dateinamen, die auch DOS Programme sehen würden.

Nich wirklich.
FAT32 hat eben 32Bit lange Pointer auf Blöcke statt 16Bit lange.
Mit einer FAT32 Implementierung kann man auch FAT16 lesen, aber nicht 
andersrum.

FAT32 kann auch nur 8.3
Das mit den langen Dateinamen ist noch eine Erweiterung.
Nennt sich VFAT:
https://de.wikipedia.org/wiki/File_Allocation_Table#VFAT

Zum Thema:
Aber dass elmchans fatfs ein Programm auf einmal auf 171% RAM aufbläst 
ist merkwürdig. Das braucht eigentlich nicht so viel.
Guck doch mal ins map file was da so viel Speicher zieht.

Stephan B. schrieb:
> Ich verwende einen Atmega644, dieser Stellt bereits einen Webserver
> bereit (von U. Radig). Da ich eine SDHC-Speicherkarte habe mit 16GB,
> muss ich diese mindestens mit Fat32 formatieren, was die Erweiterung bei
> U.Radig auf der Seite unbrauchbar macht, da diese nur Fat16 kann.

Welche Erweiterung genau?

von Stefan F. (Gast)


Lesenswert?

Mw E. schrieb:
> FAT32 hat eben 32Bit lange Pointer auf Blöcke statt 16Bit lange.
> Das mit den langen Dateinamen ist noch eine Erweiterung.
> Nennt sich VFAT

Super, danke für die Klarstellung. Da habe ich glatt einen 
Zwischenschritt vergessen.

von Mw E. (Firma: fritzler-avr.de) (fritzler)


Lesenswert?

Someone is wrong on the Internet!!!
https://xkcd.com/386/
;)

Bei elmchans fatfs kann man LFN sogar deaktivieren, dann geht FAT32 auch 
mit 8.3
Das spart dann noch maln paar Bytes, aber dann werden 171% RAM Verbrauch 
nicht auf einmal nurnoch 71%.

von Karl (Gast)


Lesenswert?

Ich hab mal Fat16 für einen Attiny gemacht. Das Problem war, dass man um 
an eine Datei zu kommen immer die FAT neu einlesen musste, weil die FAT 
im Ram vorzuhalten nicht ging: Zu groß.

Eventuell versucht hier die Lib die FAT in den Ram zwischenzuspeichern 
und kommt damit auf den enormen Rambedarf. Eventuell kann man das 
abschalten und sagen: Lies die FAT immer neu.

Nur so als Idee.

von Stephan B. (stephan_tdci)


Lesenswert?

Hallo,

Vielen dank für eure Vielen Antworten. Nach dem Beitrag von Stefanus 
habe ich direkt mal umgebaut auf AVRFat32.

Die Library ist nicht für den ATMEGA644 ausgelegt. Deshalb habe ich in 
der Datei sd_raw_config.h bei defined Atmega32 den Atmega644 
hinzugefügt.

Habe jetzt also folgende Config vorgenommen:
Most = B5
SCK = B7
SS = B4
MISO = B6

select_card = B1
unselect_card = B1

pin_available = A4
pin_locked = A5


Das Programm läuft durch bis:
sd_raw.c sd_raw_init(); bis zu /* reset card */

dort erreicht das Programm:
if (I == 0x1ff)

und unselectiert dort die Karte wieder.

Ich habe mir zum Experimentieren folgenden Slot gekauft:
https://www.pollin.de/p/sd-speicherkartenmodul-810359
https://www.pollin.de/productdownloads/D810359B.PDF


Kann das Modul das Problem sein??


DANKE !

von Stefan F. (Gast)


Lesenswert?

Stephan B. schrieb:
> Kann das Modul das Problem sein??

Das Modul eignet sich nur, wenn der µC mit 3,3V betrieben wird. Wenn du 
deinen mit 5V betrieben hast, ist jetzt vielleicht die SD Karte kaputt.

von Mw E. (Firma: fritzler-avr.de) (fritzler)


Lesenswert?

Also jetzt sämtliche FAT Libs durchzutesten wird eher nich zum Ziel 
führen.

von Stefan F. (Gast)


Lesenswert?

Stephan B. schrieb:
> Die Library ist nicht für den ATMEGA644 ausgelegt. Deshalb habe ich in
> der Datei sd_raw_config.h bei defined Atmega32 den Atmega644
> hinzugefügt.

Ich hatte https://www.mikrocontroller.net/articles/AVR_FAT32 empfohlen. 
Da gibt es keine sd_raw_config.h.

Wo bist du denn jetzt?

von c-hater (Gast)


Lesenswert?

Stefanus F. schrieb:

> Fat32 ist eine Erweiterung auf Fat16 zur Unterstützung langer
> Dateinamen.

Nein, das eine hat mit dem anderen nichts zu schaffen. Man kann auch in 
einem FAT16-fs lange Dateinamen haben und umgekehrt ist es auch möglich, 
ein FAT32-fs ohne Support für lange Dateinamen zu betreiben.

> Eventuell musst du die Karte mit einer kleineren Partition ausstatten.
> Ich meine, dass der SD Standard nur bis 2GB geht, habe allerdings auch
> schon eine 4GB Karte verwenden können. Größere habe ich nicht versucht.

SD ist durch den Standard künstlich auf 2GB-Partitionen beschränkt. 
Diese Beschränkung ist den ollen DOS-Ablegern von Windows gewidmet, denn 
die können tatsächlich nur damit umgehen. Allerdings kann Linux und auch 
die Windows-NT-Abkömmlinge durchaus auch mit 4GB-Partititionen auf SD 
korrekt umgehen. Deswegen gibt (vielmehr: gab) es SD-Karten mit solchen 
Kapazitäten.

Standard ist heute aber auch schon lange nicht mehr SD, sondern SDHC 
bzw. SDXC. SDHC kann 64GB-Partitionen, SDXC kann noch größere, erfordert 
aber lt. Standard wiederum EXFAT als Filesystem. Natürlich: Linux hat 
kein Problem mit einer FAT-Partition auf so einer Karte, denn es handelt 
sich  (mal wieder) um eine künstliche Beschränkung...

Stephan B. schrieb:
>> Versuche ich das ganze jetzt zu Kompilieren erhalte ich folgende
>> Meldung:
>> Data Memory Usage: 7028 bytes 171,6% Full (Memory Overflow)

Buffer zu groß. Lösung: Geklauten Code verstehen und korrekt 
konfigurieren. Oder: Device mit mehr RAM verwenden.

von Stephan B. (stephan_tdci)


Lesenswert?

Hallo Stefanus,

Tatsächlich habe ich die falsche library importiert...
Jetzt habe ich die richtige von dir empfohlene..

Habe gleichzeitig die Chance genutzt und die Versorgungsspannung von 5V 
auf 3.3V gesenkt.

Jetzt läuft alles in der Schaltung auf 3.3V.

Habe jetzt folgendes aus dem Beispiel in meiner main.c:
1
while (FALSE == mmc_init()) {
2
asm("nop");
3
usart_write("TRY MMC INIT");
4
}


Da bleibt auch hängen. mmc_init() wird nicht TRUE.


Habe nochmals die Belegung kontrolliert... Angeschlossen sollte alles 
richtig....

Eine Idee dazu :( ?

Danke !!

von Mw E. (Firma: fritzler-avr.de) (fritzler)


Lesenswert?

c-hater schrieb:
> SD ist durch den Standard künstlich auf 2GB-Partitionen beschränkt.
> Diese Beschränkung ist den ollen DOS-Ablegern von Windows gewidmet, denn
> die können tatsächlich nur damit umgehen. Allerdings kann Linux und auch
> die Windows-NT-Abkömmlinge durchaus auch mit 4GB-Partititionen auf SD
> korrekt umgehen. Deswegen gibt (vielmehr: gab) es SD-Karten mit solchen
> Kapazitäten.

SD Karten haben ja eine Byteweise Adressierung und könnten damit bis 
4GB.
Daher könnt man durchaus von künstlicher Beschränkung reden.
Ist es nicht eher so, dass als größere Flashspeicher absehbar waren dann 
direkt SDHC entworfen wurde?
SD 1.0 kann übrigens nur 1GB, erst SD 1.1 kann 2GB.
Der SD Standard kam aus Zeiten wo 64MB Flash schon viel waren.


@ Stephan B
Wie schnell ist denn der SPI Takt?
Beim Init mögen Sd Karten nicht mehr als 400kHz.
Erst danach darf der AVR Vollgas geben.

Ansonsten musste dir mal Debugausgaben in die INit bauen und gucken ab 
wanns dir um die Ohren fliegt.

von Stefan F. (Gast)


Lesenswert?

Stephan B. schrieb:
> Da bleibt auch hängen. mmc_init() wird nicht TRUE.
> Eine Idee dazu :( ?

Habe ich schon geäußert: Die Karte könnte defekt sein. Würde mich nach 
der Gewalt-Aktion mit 5V Signalen nicht wundern.

Noch etwas: Nicht jede SD Karte unterstützt den SPI Modus sauber. Je 
älter, umso höher stehen Chancen, dass es gut geht.

von Stephan B. (stephan_tdci)


Lesenswert?

Die SD-Karte funktioniert am PC problemlos, probiere ich immer mal 
wieder aus.

Die hat zum Glück keinen Schaden genommen.

Hersteller ist SanDisk der ja eigentlich ganz gut dadrin ist :-(

ISP steht auf 125kHz

: Bearbeitet durch User
von Stefan F. (Gast)


Lesenswert?

Stephan B. schrieb:
> ISP steht auf 125kHz

In der Doku der AVR FAT32 Library steht, dass viele Karten mit 400KHz 
initialisiert werden müssen.

von Mw E. (Firma: fritzler-avr.de) (fritzler)


Lesenswert?

Ne mit maximal 400kHz.
Erst danach darf auf max 25MHz aufgedreht werden.

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

Stefanus F. schrieb:
> Stephan B. schrieb:
>> ISP steht auf 125kHz
>
> In der Doku der AVR FAT32 Library steht, dass viele Karten mit 400KHz
> initialisiert werden müssen.

 Ich habe alle Karten bisher mit 125KHz initialisiert und noch nie
 irgendwelche Probleme damit gehabt.

von Jim M. (turboj)


Lesenswert?

Stephan B. schrieb:
> Data Memory Usage: 7028 bytes 171,6% Full (Memory Overflow)

In der ffconf.h:
1
#define  _FS_TINY  1

Sollte erheblich RAM sparen, denn mít FS_TYINY 0 hat jedes FIL auch noch 
einen 512 Byte Sektor Puffer mit drin.

Daneben sollte man _FS_EXFAT und LFN ausschalten. Grade LFN schaufelt 
Dir IMHO noch einige große Arrays zur Unicode Konvertierung ins RAM.

von Jim M. (turboj)


Lesenswert?

Marc V. schrieb:
>> In der Doku der AVR FAT32 Library steht, dass viele Karten mit 400KHz
>> initialisiert werden müssen.
>
>  Ich habe alle Karten bisher mit 125KHz initialisiert und noch nie
>  irgendwelche Probleme damit gehabt.

Spec sagt klar die Frequenz bei Initialisierung: 100kHz <= CLK <= 
400kHz. Da liegst Du mit 125kHz gut drin.

: Bearbeitet durch User
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.