mikrocontroller.net

Forum: Projekte & Code FAT16


Autor: Vorname Nachname (zoltan)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

im Anhang befindet sich meine FAT16 library, mit dem ich eine MMC-Card
lesen und beschreiben kann(MMClib, UARTlib usw stammen von Pascal
Stang, sind jedoch an manchen Stellen leicht modifiziert).

Es ist möglich ein Verzeichnis mit Dateinamen(z.B.: "A/LangerName/A
He/test.hex") als string der FAT16_Search() Funktion zu übergeben.
Diese Funktion durchsucht die MMC. Falls die Datei vorhanden ist, kann
man antweder die alten Daten überschreiben oder die neuen Daten am Ende
der Datei anfügen. Falls die Datei nicht forhanden ist, wird eine
Meldung ausgegeben (TODO: es wird diese Datei erzeugt). Vor dem
power-off der MMC Karte (oder auch ab und zu möglich) muss die
FAT16_Finish_Data() Funktion aufgerufen werden, um die Datengröße auf
der MMC zu sichern.

Mit einem Terminalprogramm( z.B.:
http://hp.vector.co.jp/authors/VA002416/teraterm.html) ist eine
ausführliche debugging der FAT16 Aktivitäten des µC möglich. Diese
debugging Informationen erhöhen die Kodegrösse von 11510 auf 15128 byte
(siehe fatconf.h ~> #define DEBUG_FAT).

Bsp.:

cmd> i

Resetting MMC/SD Card
MMC_GO_IDLE_STATE: R1=0x01
MMC_SEND_OP_COND: R1=0x01
MMC_SEND_OP_COND: R1=0x00
MMC_CRC_ON_OFF: R1=0x00
MMC_SET_BLOCKLEN: R1=0x00

OEM Name        : MSDOS5.0
Bytes Per Sector:    512
Sector Per Clust:      4
Reserved SecCnt :      6
Number Of FAT   :      2
Root Dir Entries:    512
Total Sector 16 :      0
Media           : Found: Hard disk. DOS version 2.0
Total Sector 32 : 250880
Sector Per FAT  :    245
Volume Label    : NO NAME
Filesystem Type : FAT16

RootDirectoryRegionStart:    496
DataRegionStart         :    528
FATRegionSize           :    490
RootDirectoryRegionSize :     32
DataRegionSize          : 250352

cmd> b
Searching for >testdokument.hex
(CONTINUE)
31.07.2005    15:48       4800 testdokument.hex

Data starts at FAT address  :     12
Sector containing file info :    500
Data starts in sector       :    568
FileSize [uint8_t]          :   4800

----- Read file content-----
Current cluster:     12 Current sector:          0
Next cluster   :     13 Next sector   :        568

Sector   :    568
Next FAT :     13
     00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F  0123456789ABCDEF
     -----------------------------------------------  ---- ASCII -----
0000 00 00 00 00 01 00 00 00 02 00 00 00 03 00 00 00  ................
0010 04 00 00 00 05 00 00 00 06 00 00 00 07 00 00 00  ................
0020 08 00 00 00 09 00 00 00 0A 00 00 00...........

... gibt den kompletten Datenihalt aus ...

.......... 00 00 99 00 00 00 9A 00 00 00 9B 00 00 00  ˜...™...š...›...
01F0 9C 00 00 00 9D 00 00 00 9E 00 00 00 9F 00 00 00  œ......ž...Ÿ...

----- Searching end of file -----

Data ends in FAT address:     14
Data ends in sector     :    577
FileSize                :   4800
Loading last sector of file ->
     00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F  0123456789ABCDEF
     -----------------------------------------------  ---- ASCII -----
0000 60 01 00 00 61 01 00 00 62 01 00 00 63 01 00 00  `...a...b...c...
0010 64 01 00 00 65 01 00 00 66 01 00 00 67 01 00 00  d...e...f...g...
0020 68 01 00 00 69 01 00 00 6A 01 00 00 6B 01 00 00  h...i...j...k...
...



Getestet habe ich das Progamm bis jetzt auf einer Atmega128(mit 8Mhz)
mit einer 128MB MMC Karte(formattiert als superfloppy). Da zwei 512
byte grosse Buffer für die Daten und die FAT verwendet werden ist
mindestens eine ATMEGA32 zum Ausführen des Programms nötig.

Gruss
Zoltan

Autor: marcelKo (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hi,
ich hab auch die lib vom Pascal verwendet, aber muste die ein bischen
ändern, damit die einwandfrei funktioniert.
die SPI geht da nur im interrupt mode.
ich hab aber herausgefunden, das die viel schneller läuft, wenn man
ohne interrupt arbeitet.
damit es ohne unterrupt geht muss man schreiben
SPDR = data;
while(!((SPSR) & (1<<SPIF)));

und in dem original code fehlt das ! und die daten müssen zwingend von
dem warten in SPDR geschrieben werden.
bei dem MMC code fehlt zb nach dem CS high setzten ein sendbyte, damit
das sicher funktioniert.
grüsse

Autor: Vorname Nachname (zoltan)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die Interrupts habe ich auch ausgeschaltet. Und Du hast Recht, mit den
Ausrufezeichen funktioniert die SPI Library nicht. Ich habe in meiner
Kode nur die "!" entfernt, da jedoch in der spiTransferByte()
Funktion eine zweite Warteschleife korrekt auf die "SPDR = data;"
Zuweisung folgt hat die SPI trotzdem funktioniert. Ich werde die Lib
dennoch korrigieren. Danke für den Tipp!

Autor: Thomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Zoltan,

deine Lib hat mich dazu bewegt, endlich eine MEGA128 Platine zu ätzen
und mir einen Datenlogger zu basteln. Die benötigten Teile müsste
eigentlich nächste Woche kommen. Könntest du evtl. den aktualisierten
Code hier veröffentlichen - dann könnte ich nämlich eine Fehlerqelle
schon im Voraus ausschalten.
Vielen Dank für Deine Mühe.

Thomas

Autor: Vorname Nachname (zoltan)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hi Thomas,

es hat sich nur die spi.c geändert. Falls die beim Testen bugs
begegnen, kannst du sie dann bitte hier posten?

Gruss,
Zoltan

Autor: Thomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Werde ich selbstverständlich machen - vielen Dank!!!

Gruß, Thomas

Autor: pittbull (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hallöchen,
wen's interessiert: ein weiteres FAT16 findet ihr hier:
http://alumnus.caltech.edu/~pje/rdcf2.txt

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.