Forum: Mikrocontroller und Digitale Elektronik SD Card, Datei ins Ram vom µC laden


von L. R. (keyboard)


Lesenswert?

hei,

PIC32MX795F512  MPLAP 8.84  C32 V2.02

Habe mir das Buch von Lucio Di Jasio gekauft.
Wer kennt sich mit FAT, fileio, usw. aus?
Möchte die Daten einer Datei (*.txt) von einer SD Card in das RAM des µC 
laden.

Vielen Dank im Voraus
schönen Tag

von Frank M. (frank_m35)


Lesenswert?

und wo liegt nun dein Problem?

Als FAT Dateisystem würde ich an deiner Stelle nicht das von Lucio 
nehmen, das ist zwar schnell und kompakt, aber hat kaum Funktionen, und 
man stößt schnell an dessen Grenzen,
ebenso nicht das MDDFS von Microchip, da es zwar umfangreich aber extrem 
langsam ist,
stattdessen würde ich and einer Stelle zum FatFS greifen. In den 
Beispielen ist eines für den PIC24 dabei, der Aufwand sollte minimal 
sein das auf dem PIC32 zum laufen zu bringen.
Hier findest du auch fertige Implementierungen für den PIC32:
http://www.microchip.com/forums/m563218.aspx

Du musst nur die mmc.c Datei an den PIC32 anpassen, d.h. dessen SPI 
Schnittstelle dort ansprechen, sowie einen Hardwaretimer bereitstellen, 
der Rest bleibt unverändert.

von Dave C. (dave_chappelle)


Lesenswert?

Hi!

Und wo stehst du an?`

Gruss

von L. R. (keyboard)


Lesenswert?

hei,

Hallo Frank,
Habe mich für FatFS entschieden.
Ist ja ein mächtiges Programm. Werde mich langsam damit beschäftigen.

Wo werden die gelesene Daten von der SD Card abgelegt?

Derzeitig benötige ich nur "lesen" in meinem Projekt, ob ich auch 
"schreiben" benötige wird, kann ich noch nicht sagen.

schönen Tag

von Patrick C. (pcrom)


Lesenswert?

> Wo werden die gelesene Daten von der SD Card abgelegt?

Viel davon ist erledigt auf die FATFS Website. Wenn nur lesen, kann man 
eine Tiny Mode benutzen die viel weniger Ram Speicher benutzt.

http://elm-chan.org/fsw/ff/00index_e.html

von Frank M. (frank_m35)


Lesenswert?

L. R. schrieb:
> hei,
>
> Hallo Frank,
> Habe mich für FatFS entschieden.
> Ist ja ein mächtiges Programm. Werde mich langsam damit beschäftigen.
>
> Wo werden die gelesene Daten von der SD Card abgelegt?
>
> Derzeitig benötige ich nur "lesen" in meinem Projekt, ob ich auch
> "schreiben" benötige wird, kann ich noch nicht sagen.
>
> schönen Tag

Es funktioniert genauso wie das Filesystem von Lucio, d.h. du kannst 
dich vermutlich am Buch weiter einlesen und die Grundidee dahinter 
verstehen.

Generell ist die Vorgehensweise folgende:

Du erstellst ein Byte Array deiner Wunschgröße als Buffer im RAM.
Dann öffnest du die Datei mit FatFS und erhälst einen Pointer zu der 
Dateisturktur zurück.
In einer zweiten Funktion übergibst du diesen Pointer und einen weiteren 
Pointer zu deinem Buffer und gibst an wieviele Bytes eingelesen werden 
sollen, bspw. 512 oder vielfaches davon für eine gute Performance. (je 
nachdem wie groß dein Buffer ist)
Wertest die Daten aus, ließt wieder 512 Byte ein, ... bis das Ende der 
Datei erreicht ist.
Danach schließt du die Datei wieder.


Schau dir einfach die Beispiele an, bzw. die von Lucio für eine nettere 
Beschreibung.

PS: Die Performance des FatFS ist bei mir, zumindest zum PIC24 
Dateisystem von Lucio, identisch oder sogar besser. Also es ist wirklich 
ein super Dateisystem.

: Bearbeitet durch User
von L. R. (keyboard)


Lesenswert?

hei,
Ich gehe die Sache langsam an. Habe heute zumindest meinen ersten 
PIC32MX zum Leben erweckt.
Melde mich auf jedenfalls wieder.
Vielen Dank für die Infos.
schöner Abend

von L. R. (keyboard)


Lesenswert?

hei,

habe es soweit, das ich von der SD-Karte 512 Bytes lesen kann.
Die Datei hat derzeitig 3000 Bytes. Wie kann ich den Rest nachladen ?

schönen Abend

von Frank M. (frank_m35)


Lesenswert?

Die Datei nicht schließen, sondern einfach nochmal 512 Byte nachladen, 
dadurch werden die nächsten 512 Byte geladen. Der Zeiger auf den letzten 
gelesesenen Datensatz im Fat Dateisystem wird automatisch inkrementiert.

von L. R. (keyboard)


Lesenswert?

Hei,

habe die datei nicht geschlossen.

FOpenRes=f_read (&file1, &Buff, 1, &numread);
FOpenRes=f_read (&file1, &Buff, 1, &numread);


Der Inhalt von fp->buf hat sich beim zweitem Aufruf von f_read nicht 
geändert.

Aller Anfang ist schwer. Aber es war kein Problem, die Port Pins und die 
SPIx anzupassen. nur ein paar Zeilen.

schönen Abend

von Dennis H. (c-logic) Benutzerseite


Lesenswert?

Neben dem FatFs gibts da noch das PetitFS, es ist zwar sehr mickrig, 
aber es kann Dateien lesen und braucht sehr wenig Platz.

von L. R. (keyboard)


Lesenswert?

hei,
wenn auch FatFs etwas mehr Speicher benötigt, lasse ich mir gerne 
Optionen offen.
Dieser Code hat mit nur ein paar Einträge (PIN und SPIx) ändern sofort 
funktioniert.
schönen Abend

von Frank M. (frank_m35)


Lesenswert?

Warum soll sich fp->buf ändern?
Die eingelesenen Daten stehen in Buff[0] bei dir. Überprüfe mal diesen 
Wert.

PS: Er hat nen PIC32, da sollte Speicher vorerst kein Problem sein, 
zumal man auch nicht alle Funktionen einschalten muss.

: Bearbeitet durch User
von holger (Gast)


Lesenswert?

>FOpenRes=f_read (&file1, &Buff, 1, &numread);
>FOpenRes=f_read (&file1, &Buff, 1, &numread);

>Der Inhalt von fp->buf hat sich beim zweitem Aufruf von f_read nicht
>geändert.

Was hat dein gezeigter Code mit dem fp->buf zu tun?

von holger (Gast)


Lesenswert?

>Die eingelesenen Daten stehen in Buff[0] bei dir. Überprüfe mal diesen
>Wert.

Und mit seinem Code wird Buff[0] vom ersten f_read mit dem zweiten 
f_read
gleich wieder überschrieben. Das mag ja gewollt sein, oder auch nicht.

von L. R. (keyboard)


Lesenswert?

hei,
das mit "f_read" war ein Denkfehler von mir.

nutze jetzt "f_gets"

wie sieht es aus mit Dateinamen Länge größer 8 Zeichen?

schönen Tag

von Falk B. (falk)


Lesenswert?

@ L. R. (keyboard)

>das mit "f_read" war ein Denkfehler von mir.

>nutze jetzt "f_gets"

f_read ist die grundlegende LEsefunktion, um jedweils die nächsten x 
Byte der Datei zu lesen.  f_gets ist ein Wrapper, der am Ende f_read 
aufruft.

>wie sieht es aus mit Dateinamen Länge größer 8 Zeichen?

Geht bei FATfs auch, muss man halt in der config freischalten und die 
zusätzlich benötigten Funktion zum UTF-8 Support bereitstellen. Die sind 
aber in den Beispielen schon drin, muss man nur kopieren.

MFG
Falk

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.