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


von Bernhard S. (bernhard)


Angehängte Dateien:

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

von Simon K. (simon) Benutzerseite


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"

von Joerg W. (joergwolfram)


Lesenswert?

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

Gruß Jörg

von Simon K. (simon) Benutzerseite


Lesenswert?

Assembler, Das seh ich ja jetzt erst. Ihr Masochisten.

von Heinz V. (fixunfoxi)


Angehängte Dateien:

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

von Heinz V. (fixunfoxi)


Angehängte Dateien:

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

von Bernhard S. (bernhard)


Angehängte Dateien:

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

von Heinz V. (fixunfoxi)


Angehängte Dateien:

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

von Jochen Adler (Gast)


Lesenswert?

Hallo Bernhard,

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

http://www.microsoft.com/whdc/system/platform/firmware/fatgen.mspx

Es ist allerdings in english.

Tschüss
Jochen Adler

von Bernhard S. (bernhard)


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

von Bernhard S. (bernhard)


Angehängte Dateien:

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

von Commtel (Gast)


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

von Bernhard S. (bernhard)


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/informatik/ECC/sd.pdf


>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

von Commtel (Gast)


Lesenswert?

@  Bernhard Schulz

THX

von Bernhard S. (bernhard)


Angehängte Dateien:

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

von Bernhard S. (bernhard)


Angehängte Dateien:

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

von Christof Rieger (Gast)


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.

von Bernhard S. (bernhard)


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

von Christof Rieger (Gast)


Angehängte Dateien:

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.

von Bernhard S. (bernhard)


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

von Christof Rieger (Gast)


Lesenswert?

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

von Bernhard S. (bernhard)


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"

von Christof Rieger (Gast)


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

von NunJa (Gast)


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.

von Uli_2 (Gast)


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

von Bernhard S. (bernhard)


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

von Mario T (Gast)


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

von Bernhard S. (bernhard)


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

von Mario T (Gast)


Angehängte Dateien:

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

von Mario T (Gast)


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

von Bernhard S. (bernhard)


Angehängte Dateien:

Lesenswert?

Update 05/2017

Initialisierung von SD und SDHC Karten:

1. CMD0 (IDLE)

2. CMD8,   wenn erfolgreich --> fertig

3. ACMD41, wenn erfolgreich --> fertig

4. CMD1,   wenn erfolgreich --> fertig

wenn fertig, dann

- CMD16 Blocklänge setzen

- CMD9  CSD-Register auslesen (Card Specific Data)

- CMD10 CID-Register auslesen (card identification)


In der Loop-Schleife wird permanent CMD10 (CID) ausgelesen,
tritt ein Fehler auf, geht das Programm davon aus,
daß die SD-Card gezogen worden ist.

LED grün:  alles ok, SD-Karte erfolgreich initialisiert
LED gelb:  SPI-Aktivität
LED rot:   Error

Ich habe versucht, das ATmega328p Assemblerprogramm so zu gestalten, daß 
es nicht abstürzt, wenn die SD-Card im Betrieb gezogen wird.

Mit wenigen Handgriffen lässt es sich an den ATmega8 anpassen.
(Interrupt Vectoren, call-->rcall usw.)


Ich habe mein gesamtes SD-Karten-Sammelsurium mit Erfolg getestet.

Sollte jemand von Euch eine besitzen, die sich nicht initialisieren 
lässt, gebt bitte Bescheid.

Bitte aufpassen, im Menue "DATA-TX" werden Daten auf die SD-Karte 
geschrieben.

Bernhard

: Bearbeitet durch User
von Peter S. (cbscpe)


Lesenswert?

Hallo Bernhard,

da ich in einem grösseren Projekt in Assembler auch Dateien aus einem 
FAT Volume lesen muss bin ich natürlich unweigerlich auf diesen Thread 
gestossen. Daher zuerst mal vielen Dank, dass du deine Arbeit 
veröffentlicht hast. Finde ich super. Zu den IO Routinen habe ich aber 
noch ein paar Fragen. Ich dachte immer bei einer SDHC Karte muss man im 
Command ACMD41 das HCS bit (bit 30) setzen wie das im Kommentar 
angegeben ist, sonst initialisiert sich die Karte nicht? Ich habe das 
mit einer 8Gbyte Karte mal durchgespielt und wirklich wenn ich im ACMD41 
keinen counter habe looped bei mir der code für immer und ewig. Erst mit 
gesetzten HCS bit wird es fertig. Ich dachte auch das SDHC Karten bei 
Read und Write Befehlen nicht eine Byte sondern direkt die Block Nummer 
erwarten. D.h. wenn CMD8 gültig ist, dann ist es eine SDHC/XC Karte und 
man müsste im ACMD41 das bit 30 (HCS Host Capacity Support) setzen. 
Danach müsste man mit einem CMD58 kontrollieren ob auch wirklich eine 
SDHC/XC Karte eingesteckt ist, dort ist dann CCS, auch wieder bit 30 in 
der Response gesetzt.

Gruss

Peter

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.