PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : FAT 16 für SD Karte in CodeVision AVR ( gelöst ! )



wkrug
13.05.2009, 17:09
Hallo,

ich bin auf der Suche nach einer FAT 16 lib zum schreiben von dateien auf eine SD Speicherkarte mit einem ATMEGA32 L8.
Am liebsten wär mir ein Quellcode für CodeVision AVR.
Ein wirklich gut dokumentierter Code für AVR GCC würde zur Not auch gehen.

Ich möchte einen seriellen Datenstrom aufzeichnen und die ankommenden Daten auf die Speicherkarte schreiben, damit man sie mit einem Cardreader am PC wieder auslesen kann.

Die Soft sollte also eine Datei öffnen, Daten in die Datei schreiben und die Datei wieder schließen können.
Es soll auch möglich sein schon mehrere Dateien auf der Speicherkarte zu haben ( mehrere Logs ) und immer wieder eine Neue aufzumachen.
Datei append brauch ich nicht.
Die Karte wird exklusiv für diesen Zweck verwendet werden.

FAT's hab ich schon einige gefunden, allerdings waren Die voller Fehler, oder ließen sich überhaupt nicht Compilieren.

Den Quellcode von Ullrich Radig hab ich mir auch schon runtergeladen, der ist aber für GCC und nur sehr schwierig für CodeVision zu adaptieren.
Ausserdem fehlt das komplette File Handling.

Hat von Euch schon so etwas in Open Source gesehen ( ich will es ja selber erweitern )?

Ich möchte halt gerne das Rad nicht zweimal erfinden müssen.

Die Schaltung soll mal die Logfunktion für unser LiPo Voltmeter werden.
Link: http://www.toeging.lednet.de/flieger/profi/lipovolt/lipovolt.htm

uffi
26.05.2009, 16:35
FAT16 z.B. hier:

http://www.dl8nci.de/sdcard001.html

FAT12/16/32 z.B. hier:
http://elm-chan.org/fsw/ff/00index_e.html

letztere ist generisch in ANSI C geschrieben, sollte also auch auf CodeVision zu compilieren sein.

wkrug
28.05.2009, 21:27
Hallo Uffi,

danke für Deine Antwort.

Ich habs in der Zwischenzeit mit einer umgestrickten Version aus dem Microcontroller Net hingekriegt.

Die dl8nci Seite kannte ich schon, ich hab allerdings den Quelltext zum Download nicht gefunden !? - Vielleicht bin ich auch zu blöde dazu ;-)

Die Seite von ELM Chan ist meines Wissens die Grundlage von der LIB von Ulrich Radig.

Da es läuft, werd ich es jetzt auch so lassen.

Eventuell wär das auch mal ein Thema für RN-Wissen ?

SN7400
11.06.2009, 22:06
Hallo wkrug ...

die Sorge, daß Du zu blöde wärst, auf meiner SD-Card-Seite die Sourcen nicht gefunden zu haben, kann ich Dir nehmen. Sie waren garnicht da!

Ich habe sie jetzt als Link zugefügt (http://www.dl8nci.de/sdcard001.html#R9, Ref. 9). Wenn's Dich überhaupt noch interessiert, dann kannst Du ja mal von Zeit zu Zeit auf sourceforge.net schauen: https://sourceforge.net/projects/sd-cardandatmel/ oder einfach suchen mit "sd atmel". Dort treibe ich die Geschichte wieder etwas weiter. Wenn die Zeit reicht ...

Aber wahrscheinlich ist der Hase längst über die Höhe ...

Gruß ... Matthias.

wkrug
11.06.2009, 22:19
Hallo Matthias
Danke für Deine Antwort.
Ich werd mir die Sourcen auf jeden Fall mal anschauen.
In der Zwischenzeit läuft das SD-Kartenschreiben schon sehr gut und zuverlässig.
Die .lib hat aber auch so ihre Einschränkungen.
Ich warte zur Zeit noch auf meine ersten Prototypenplatinen.
In der Zwischenzeit hab ich auch noch verschiedene Datenübertragungsgeschwindigkeiten für den USART geproggt ( kein großer Aufwand ).
Es soll ja mal ein Aufzeichnungsgerät für serielle Daten werden, im speziellen Fall für unserer Funktelemetrie.

SN7400
12.06.2009, 14:35
Hallo ...

schön, daß schon was läuft ... ich habe meine SD-Karte eher in meinem selbstgebauten Datenlogger im Einsatz. Ich hatte mir mal ein Seismometer gebaut und zeichne jetzt schon seit fast einem Jahr die Daten mit einer Samplingrate von 100 Messungen pro Sekunde auf vier Kanälen auf. Damit habe ich eine Datenrate von rund 1 kB pro Sekunde, die problemlos verkraftet wird. Der FIFO wird garnicht richtig genutzt. Aber ohne würde es auch nicht gehen. Hängt aber auch ein wenig von der SD-Karte ab. Bei manchen langsameren Karten läuft der FIFO etwas voller als bei anderen Karten. Einmal die Woche tausche ich dann die Karte aus.

Für Dich sind dann die beiden Files FAT16 und SD_api entscheidend. Im Idealfall solltest Du die unverändert verwenden können. Die Hardwarespezifischen Implementierungen sind in SD_interface drin. Dann gibt's noch 'ne Reihe Hilfsfunktionen, die aber nicht so entscheidend sind. SDCardExperiment3.c ist dann die Anwendung. Momentan aktualisiere ich recht häufig das doc-File https://sourceforge.net/project/downloading.php?group_id=264329&filename=SDCardExperiment3-doc.zip und arbeite an den Kommentaren. An der Implementierung tut sich erst mal nix.

Ach so ... 1 kB pro Sekunde bedeutet, daß ich 9k6 ohne Schwierigkeiten ununterbrochen aufzeichnen kann. 19k2 ununterbrochen werde ich wohl nicht schaffen. Aber wenn Du einen Puffer implementierst, und die Daten eben nicht ununterbrochen kommen, dann kommt's ja nur auf die mittlere Datenrate drauf an.

Wichtig: bislang kann ich nur FAT16 und Blockgröße 512 byte. D.h. bei 1 GB ist die Grenze. Die 2 GB-Karten haben 1 kB Blockgröße. Die Arbeit habe ich mir noch nicht gemacht, das auch zu ermöglichen. Aber auf einem Mega32 würde das auch recht eng werden ... Mega64 müßte aber gehen, weil er ein doppelt so graßes RAM hat, wie der Mega32.

Gruß ... Matthias.

wkrug
12.06.2009, 15:17
Ich hab ne ASCII Zeichen übertragung am laufen, mit den Eckparametern 38400,8,N,1.
Allerdings wird nur jede Sekunde ein kompletter Datendsatz gesendet.
Es werden 12 Spannungen, Drehzahl, 2 Temperaturen und ein Stromwert übertragen.
Also fast keine Last für den Controller.

Die Empfangsroutine läuft in einem Interrupt mit einem 127Byte großen Puffer.

Für die FAT hab ich ein Pufferarray ( Sektorpuffer ) von 512Byte reserviert.
Sehr viel mehr geht beim Mega32 auch nicht.

In so eine Datei soll maximal ein Flug oder eine Ladezyklus von einer bis eineinhalb Stunden.

Eine Übliche Aufzeichnugsdauer sind 10...15min, also ein Flug.

Mein Problem ist schon eher die maximale Anzahl der Dateien, die ja bei FAT 16 auf 512 beschränkt ist.

Wenn man aber die Karte jede Woche einmal leert wird auch das sicher kein Problem werden.

Darki89
28.08.2009, 15:45
Entschuldigt bitte wenn ich das hier hochziehe, aber ich habe mich die letzten Tage mit dem Thema beschäftigt.
Ich habe mir die Dateien von SN7400 runtergeladen und auf meine bedürfnisse angepasst.
Ich kann es momentan leider nicht testen, habe aber eine Frage:
Kann ich mit der funktion fat16_put() immer nur ein Byte übertragen, oder kann ich auch ein char übertragen?
Weil ich habe einen string, ähnlich dem von wkrug (von einem GPS-Modul). Leider hat er nicht geschrieben welche Variante er nutzt zum beschreiben der SD-Karte, sonst hätte sich das wohl schon geklährt, würde er den gleichen Code nutzen.

wkrug
29.08.2009, 20:12
Ich hab das so gelöst:

//LOG Pin ist 1 und Datei ist geöffnet
if(LOG>0&&ub_open>0&&rx_counter>0)
{
//Ein Byte wird geschrieben
c=getchar();
uc_return=ffwrite(c);
if(uc_return != 0)
{
strcpyf(uc_buffer,"<Fehler>\r\n");
for(c=0;c<strlen(uc_buffer);c++)
{
putchar(uc_buffer[c]);
}

}
else
{
putchar(c);
};
}

Wsk8
30.08.2009, 01:39
Hallo,
wollte jetzt auch mal ne sd an meinen mega32 anschließen um was zu speichern, leider wird meine sd nicht erkannt und ich weiß nicht warum, bin die schaltung schon 1000x durchgegangen. Hab mich nach der doku von u. radig gehalten.

mfg

wkrug
31.08.2009, 07:09
Hab mich nach der doku von u. radig gehalten
Im microcontroller.net ist ein ellenlanger Threat über dieses Thema - ließ da mal nach.
Ausserdem werden da verschiedene Versionen der FAT Software für AVR - GCC vorgestellt.
Bei mir wars letztlich eine Einstellung und zwar der Parameter Superfloppy=1 . Habs dann auf Superfloppy = 0 geändert, dang gings.
Ich hab aber die Code-Vision Variante der Software benutzt.
Zu der Pegelanpassung kann ich nichts sagen, ich hab gleich einen ATMEGA32 L 8 mit 3,3V Spannungsversorgung genommen und mir somit die Pegelanpasserei a la Radig gespart.

*Edit*
Hab den Threat gefunden:
http://www.mikrocontroller.net/topic/14800