mikrocontroller.net

Forum: Projekte & Code SD-Karte Initialisierung Read Write FAT ATmega8 (Assembler)


Autor: Bernhard S. (bernhard)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Ein ATmega8 initialisiert mit CMD0, CMD1 und CMD16 eine SD-Karte.

Anschließend liest er die Register CID und CSD aus gibt einige Bits / 
Bytes auf dem LCD-Display aus.

Ein Block mit 512 Bytes wird von der SD-Karte gelesen und bei Bedarf 
können auch 512 Bytes geschrieben werden.

Die LEDs zeigen den Zustand der Initialisierung an. Wurde erfolgreich 
initialisiert und ausgelesen, dann leuchten 6 LEDs, die 7. LED zeigt den 
Write-Status an. Write Ist aber im Code sicherheitshalber durch "REM" 
deaktiviert.

Es ist kein fertiges Projekt. Aber man könnte z.B. die Datenübertragung 
testen oder eine "nichtwillige" SD-Karte mit dieser Software ansprechen.

Ganz bewußt arbeitet der SPI-BUS mit einer sehr niedrigen Taktfrequenz.
Kann aber ohne weiteres, durch verändern der SPI Register 
übertragungsfreudiger umkonfiguriert werden.


Über Hinweise, Anregungen und Kritiken würde ich mich sehr freuen.

Momentan ist eine FAT16 Routine in Arbeit, würde sie Euch dann gern zur 
Verfügung stellen. Bin mir aber noch nicht ganz sicher, ob 1K SRAM dafür 
ausreicht.

Bernhard

Autor: Simon K. (simon) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Äh, sorry, aber das gabs hier schon zu genüge.

Der Code von Roland Riegel (glaube ich wars), ist die eierlegende 
Wollmilchsau in Sachen Kompatibilität und Einhaltung der 
Spezifikationen:
Beitrag "MMC/SD-Karte mit FAT16 an AVR"

Autor: Joerg Wolfram (joergwolfram)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Der ist aber halt in C und das mag nicht jeder (zumindest auf dem µC)...

Gruß Jörg

Autor: Simon K. (simon) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Assembler, Das seh ich ja jetzt erst. Ihr Masochisten.

Autor: Heinz Vogel (fixunfoxi)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Berhard

Hab das in 2007 gemacht
Bräuchte ma bitte ein neuen SuperD.
Hab leider Deine email net mehr wegen pc_crash
mal sehen ob ich sie hier finde

Gruß Heinz
vogel.heinz@gmx.net

Autor: Heinz Vogel (fixunfoxi)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo

Hier die Karte dazu
Hab für sd-kontakte eine Federleiste geblündert und hält
Vorallem kostet das nix *g

Das  R2R Netz für D/A Wandler und Audio teil ist von 
http://s-huehn.de/elektronik/bbgong/bbgong.htm

Gruß fix

Autor: Bernhard S. (bernhard)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
@Jörg

>Der ist aber halt in C und das mag nicht jeder (zumindest auf dem µC)...

Den gleichen Gedanken hatte ich auch, nur Du warst schneller mit der 
Antwort ;)



@Heinz

>Hab für sd-kontakte eine Federleiste geblündert und hält
>Vorallem kostet das nix *g

Die SD-Card konnte ich provisorisch vorerst mit einem gekürzten 
Main-Bord-Slot kontaktieren. Aber Du weißt ja, Provisorien dauern 
meistens mehre Jahre g
Bei CSD-Elektronik fand ich SD-Fassungen z.B. SCDA1A1401.



>Hab das in 2007 gemacht

Hast Du FAT16, VFAT oder FAT32 verwendet?




>Bräuchte ma bitte ein neuen SuperD.

Den Super-Debugger konnte ich nicht mehr weiter entwickeln.
Mein VBASIC stürzt permanent ab (WIN98)


>Hab leider Deine email net mehr wegen pc_crash
>mal sehen ob ich sie hier finde

Im PDF-File steht sie.



@alle


Schon seit Tagen quäle ich mich mit FAT16 herum, aber die meisten 
Betriebsysteme formatieren mit VFAT (Weiterentwicklung von FAT16).

Kennt jemand interessante und verständliche LINKS (möglichst deutsch),
wo VFAT gut erklärt ist?


Bernhard

Autor: Heinz Vogel (fixunfoxi)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
@Bernhard

>Hast Du FAT16, VFAT oder FAT32 verwendet?

hab FAT16
bei XP auf die Fomat-Paras achten
Das brauchst net?
Zur kontrolle hatte ich ein suber hex-editor
damit konnte man auh dasFormat kontrollieren


>Bei CSD-Elektronik fand ich SD-Fassungen z.B. SCDA1A1401.
 Danke für den Tip

Fix

ma sehen ob ich Deine  pdf erwische

Autor: Jochen Adler (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Bernhard,

die offizielle Beschreibung von FAT32 gibt es von Microsoft 
höchstpersönlich unter:

http://www.microsoft.com/whdc/system/platform/firm...

Es ist allerdings in english.

Tschüss
Jochen Adler

Autor: Bernhard S. (bernhard)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke Jochen,

hier fand ich auch noch sehr nützliche Informationen:

http://www.jay-code.de
http://www.cc5x.de/MMC/FAT.html


Bernhard

Autor: Bernhard S. (bernhard)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

in dieser Version habe ich FAT bzw. FAT16 eingearbeitet.

Zuerst wird die SD-Card initialisiert mit CMD0, CMD1, ACMD41,
der BOOT-SEKTOR und der VOLUME-BOOT-SEKTOR eingelesen und aus diesen
Daten die Sektoren der 1.FAT und 2.FAT sowie die Directory und der
Datenbereich bestimmt.

Mit Win98 und Win XP formatierte SD-Karten gab es keine Probleme beim 
Einlesen und Auswerten vom BOOTSEKTOR und VOLUMEBOOTSEKTOR.

Nachdem die Initialisierung erfolgreich war, wird die Anzahl der 
physischen Sektoren ermittelt (SD-Register) und die ersten Direktory-
Einträge angezeigt (Datum + Zeit + Attribute + Dateigrösse + 
Startcluster).

Anschließend wird eine Datei "DATEN" (bitte gross schreiben, die Datei-
Erweiterung wird ignoriert) in Verzeichnis gesucht. War die Suche 
erfolgreich, wird der Dateninhalt der Datei an TXD-PIN ausgegeben.

Im Display sieht man den Fortschritt und den aktuellen Cluster aus dem 
gerade gelesen wird.

Nach einer kurzen Pause werden die ersten 1000 physischen Sektoren zu 
Testzwecken an TXD-PIN ausgegeben (dauert ca. 2 Min bei 57.600 Bd)


Bei Gelegenheit möchte ich noch eine Schreib-Routine mit einbauen, ist 
aber nicht ganz einfach, wenn Daten an eine vorhandene Datei angehängt 
werden sollen.

Der Programmcode ist nicht sonderlich optimal, bitte verzeiht mir ;)

Probleme habe ich noch bei der Initialisierung von SDHC -CARD,
könnte mir jemand ein paar Tipps geben?

Bernhard

Autor: Commtel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@  Bernhard Schulz (bernhard)

leider kann ich dir nicht weiter helfen aber vieleicht du mir.
2 fragen hab ich:

1. ist cmd1 nicht das gleiche wie acmd41?

2.du schreibst:
 (CMD1) 0x41 0x00 0x00 0x00 0x00 0x00  ; KARTE in den BETRIEBSMODUS
 in datenbaltt find ich(ulrichs homepage)
 (CMD1) 0x41 0x00 0x00 0x00 0x00 0xFF

ich hab FF und 00 getestet beides geht aber warum 00?
Entschuldige bitte meine unwissenheit

c.u
Commtel

Autor: Bernhard S. (bernhard)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Commtel

> 1. ist cmd1 nicht das gleiche wie acmd41?

Nicht ganz, SD-Karten verstehen beide Kommandos, Du kannst Dich für 
eines entscheiden, dagegen MMC verstehen ACMD41 nicht. Das kann als 
Untescheidungsmerkmal verwendet werden.

Hier ist es ganz gut beschrieben:

http://wwwpriv.uni-koblenz.de:81/~physik/informati...


>2.du schreibst:
> (CMD1) 0x41 0x00 0x00 0x00 0x00 0x00  ; KARTE in den BETRIEBSMODUS
>  in datenbaltt find ich(ulrichs homepage)

> (CMD1) 0x41 0x00 0x00 0x00 0x00 0xFF

> ich hab FF und 00 getestet beides geht aber warum 00?

Das letzte Byte ist die Prüfsumme, dieses wird aber nur bei wenigen
SD-Kommandos von der SD-Karte geprüft.


Bernhard

Autor: Commtel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@  Bernhard Schulz

THX

Autor: Bernhard S. (bernhard)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
@alle

in diesem Update habe ich folgende Funktionen eingebaut:

- Datei anlegen
- Datei schreiben, bzw. anhängen
- Datei lesen
- Datei suchen
- Chache-Funktion (beschleunigt extrem die Leseaktivitäten)


Beim einlegen einer SD-Karte wird zuerst nach der Datei "DATEN1-TXT" 
gesucht. Wird sie im Hauptverzeichnis nicht gefunden, dann wird sie 
angelegt und ein kompletter Datensatz geschrieben.

Ein Datensatz besteht aus 512 Bytes.

Existiert schon eine Datei, dann wird der Datensatz einfach angehängt.

Bei Dateien, bei denen die Dateigröße ungleich ein Vielfaches von 512 
ist, wird diese Datei mit Space aufgefüllt.

Im Minutentakt, wird ein Datensatz gespeichert, lässt sich natürlich im 
Timer variieren.

Der ATmega8 ist durch dieses Programmbeispiel zu fast 100% belegt, viele 
Funktionen sind aber nicht zwingend erforderlich und können nach 
belieben heraus "operiert" werden. Der Programmcode nicht sonderlich 
optimal geschrieben, vieles lässt sich noch vereinfachen und verbessern. 
Hauptsache es funktioniert und ist halbwegs verständlich ;)

Bitte die Dateinamen in Grossbuchstaben schreiben, sonst werden die 
Dateien nicht gefunden.

Ja, die ADC- Eingänge sind im Beispiel mit den LCD-Eingängen verbunden, 
soll ja nur ein Beispiel sein ;)

Beim Schreiben eines Datensatzes laufen prinzipiell folgende Mechanismen 
ab: Zuerst wird die Direktory durchsucht und nach der Datei gesucht, 
anschließend die Dateigröße und der Start-Cluster abgefragt. Nun wird 
die FAT durchstöbert und alle Clustereinträge dieser Datei untersucht 
und den letzten Cluster dieser Datei ermittelt.
Anschließend wird nach einem als "frei" markierten Cluster in der FAT 
gesucht. Nachdem alle Cluster-Angaben gesammelt wurden, wird der Sektor 
errechnet, der zuletzt beschrieben wurde.

Bis jetzt war's ja noch ganz einfach, gel ^^

Nun beginnt die Vorbereitung zum Schreibvorgang. Zuerst muss geprüft 
werden, ob der neue Datensatz noch im alten Cluster geschrieben werden 
kann, wenn nicht, muss ein neuer Cluster als belegt markiert werden (FF 
FF)und der alte bekommt die Clusternummer des neuen Clusters.

Zuguterletzt wird noch der Direktory-Eintag aktualisiert insbesondere 
die Dateigröße und das Attribut, natürlich könnte man noch den 
Zeitstempel mit berücksichtigen.

Für Anregungen, Hinweise wäre ich sehr dankbar.

Bernhard

Autor: Bernhard S. (bernhard)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
@ALLE

Den Programm-Code habe ich in dieser Version stark gekürzt,

nur auf die wesentlichsten Write-Funktionen beschränkt,

jetzt sind ca. 30% frei.


Würde man auf die LCD-Ansteuerung verzichten, blieben ca. 50% frei.


Bernhard

Autor: Christof Rieger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Haleluja,
endlich mal ein Quellcode in Assembler.
Ich bin dir was schuldig. Mal schauen, wenn ich Zeit finde bürste ich 
ihn mal durch.

Autor: Bernhard S. (bernhard)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Christof

>endlich mal ein Quellcode in Assembler.
>Ich bin dir was schuldig


Der Assemblercode läuft schon seit einigen Wochen bei mir in 
verschiedenen Anwendungen, grobe Buggs konnte ich noch nicht 
feststellen. Es gibt aber Probleme, wenn die SD Karte zu stark 
fragmentiert ist, also wenn kein leerer Directory Eintrag gefunden 
werden kann (Format hilft aber).

Ich bin mit SDHC Card noch nicht weiter kekommen, weiß noch nicht, wie 
man sie initialisiert :(

Vielleicht hat jemand eine Idee?

Bernhard

Autor: Christof Rieger (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hi,
ich habe die SD_SPI.asm um 104 Byts geschrupft wenn du Muse hast kannst 
du mal testen, ob sie sauber läuft.
Es ist die Version aus der
SD_WENIG_CODE.zip

Gruß Christof

PS: Ich hatte mal irgendwo gelesen, dass es Probleme gibt, wenn man die 
Befehle LDS und STS bei freigeschalteten Interrups nutzt. Bei SDHC kann 
ich dir leider nicht helfen.

Autor: Bernhard S. (bernhard)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Christof


> ich habe die SD_SPI.asm um 104 Byts geschrupft wenn du Muse hast kannst
> du mal testen, ob sie sauber läuft.  Es ist die Version aus der
> SD_WENIG_CODE.zip

Danke, ich schau's mir mal an und teste es


> Ich hatte mal irgendwo gelesen, dass es Probleme gibt, wenn man die
> Befehle LDS und STS bei freigeschalteten Interrups nutzt.

Mir sind diesbezüglich keine Probleme beim ATmega8 bekannt, STS und LDS 
benötigen allerdings 2 Takte, erst dann kann der Interrupt abgearbeitet 
werden.


Bernhard

Autor: Christof Rieger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hast recht, das STS und LDS hatte der ATmega8 nicht gehabt.

Autor: Bernhard S. (bernhard)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Christof Rieger wrote:
> Hast recht, das STS und LDS hatte der ATmega8 nicht gehabt.

Der ATmega8 kennt die Befehle STS und LDS, ich arbeite gern damit, um 
die wertvollen Register zu "schonen"

Autor: Christof Rieger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das war ein Tippfehler meiner seitz. Selbstverständlich kennt der 
ATmega8 die Befehle STS und LDS. Ich meinte, beim ATmega8 gibt es das 
Problem mit den STS und LDS-Befehlen nicht, welches ich noch irgendwie 
im Hinterkopf hatte. Es ist so wie du es auch schon angemerkt hast. Also 
alles in Butter.
Ich konnte meinen Post leider nicht editieren, hatte die wage Hoffnung, 
das er trotzdem richtig verstanden wird. Lieber nachgefragt als...

Gruß Christof

Autor: NunJa (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Simon k. schrieb:
> Assembler, Das seh ich ja jetzt erst. Ihr Masochisten.

Masochist ist, wer wie ich, von Basic auf Assembler kommt, nachdem man 
mich mit Sprüchen zu einer vernünftigen Programmiersprache nötigte.

Autor: Uli_2 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo @ Bernhard Schulz,

toll das ich endlich fündig geworden bin.
Habe nämlich schon lange nach einem Assembler Code gesucht !!
Habe leider noch nicht ausprobieren könnnen, da ich mir erst den ATMEGA8
besorgen muss.

Habe mich auch noch nicht durch den Code durchgekämpft,deshalb schon ein 
paar Fragen:

- Wie werden den die Daten in der erzeugten TXT Datei abgelegt ?
- Sind es schon ASCII Daten, mit TAB getrennt ?
  Das wäre optimal damit die Datei direkt durch Excel oder ähnlich in
  Zeile und Spalte eingelesen werden kann.

- Welche Taste ? oder Vorgang schaltet das Relais ein oder aus ?
- Wofür wird es benötigt ?

Besten Dank im voraus.

Gruß Uli

Autor: Bernhard S. (bernhard)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> - Wie werden den die Daten in der erzeugten TXT Datei abgelegt ?

  direkt als ACII

> - Sind es schon ASCII Daten, mit TAB getrennt ?
>   Das wäre optimal damit die Datei direkt durch Excel oder ähnlich in
>   Zeile und Spalte eingelesen werden kann.

 ja, lässt sich problemlos mit Excel öffnen

> - Welche Taste ? oder Vorgang schaltet das Relais ein oder aus ?
> - Wofür wird es benötigt ?

 es sollen Tasten sein, ein Relais wird nicht benötigt


Bernhard

Autor: Mario T (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Bernhard
Dieser Beitrag ist schon etwas älter, aber ich probiere es halt mal.
Ich versuche mich gerade an einem Datenlogger(Software) Atmega8, 
Assembler, SD-Card, FAT16, Daten nur schreiben, am PC auslesen. Ich 
kenne mich noch nicht so gut mit der Programmierung aus. Habe aber schon 
Sachen zum Laufen gebracht. Deinen Code habe ich als Vorlage genommen. 
Was anderes Brauchbares hab ich nicht gefunden (Danke). Wollte jetzt 
alles noch optimieren(alles raus was nicht gebraucht wird, Code kürzen, 
schneller machen) und muß leider feststellen das es nicht einfach ist 
den Überblick zu behalten, da ich Assembler zum optimieren nutzen möchte 
und nicht den Code wegen Übersichtlichkeit zu sehr aufblasen. Ich würde 
mich gerne mit jemandem austauschen der da mehr Ahnung hat.
Gruß
Mario

Autor: Bernhard S. (bernhard)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Mario

> Ich würde mich gerne mit jemandem austauschen der da mehr Ahnung hat.

Das Forum "µC & Elektronik" ist z.B. sehr gut geeignet um allgemeine 
Assemblerfragen zu behandeln.

Gruß Bernhard

Autor: Mario T (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Bernhard

Danke erstmal für die schnelle Antwort. Man muß schon lange suchen um 
einiges in Assembler zu finden. SD-Karten beschreiben habe ich nur diese 
eine Seite gefunden. Bin schon recht lange dran mich da einzuarbeiten. 
Manchmal sieht man auch den Wald vor lauter Bäumen nicht. Die Routine 
fehlt mir sowieso. Ich habe mal meine "Baustelle" mit drangehängt. Da 
erkennt man vieleicht eher, warum ich mich dierekt an Dich wende. Eine 
spezielle Frage habe ich auch noch. Meine 128MB_SD-Karte hat, wenn ich 
das richtig verstanden habe, in der FAT-1 240 Sektoren beschrieben. Aber 
in der Routine in der ein leerer Fat-Eintrag gesucht wird, wird nur der 
1.Sektor ausgelesen. Jetzt weiß ich nicht genau, ob ich da richtig 
liege. Dies wollte ich jetzt natürlich ändern. Ich habe im "Netz" 
niemanden gefunden der sich so gut auskennt.

Gruß Mario

Autor: Mario T (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Bernhard

Muß mich nochmal melden. Kannst Du bitte mal in Deiner Datei 
"SD_WENIG_CODE.zip" in der "SD_SPL.asm" die Zeile 433 nachsehen.
Danke

Gruß Mario

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.