SD-Karte Initialisierung Read Write FAT ATmega8 (Assembler)

OP #740359
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
Angehängte Dateien:
OP #742110
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
Angehängte Dateien:
#742188
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
Angehängte Dateien:
OP #750267
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
Angehängte Dateien:
Gast #750540
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
OP #757295
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
OP #821929
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
Angehängte Dateien:
OP #841408
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
Gast #841686
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.
Angehängte Dateien:
OP #841962
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
Gast #843690
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
Gast #1092791
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.
Gast #1199980
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
OP #1239468
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
Gast #1516520
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
Gast #1516910
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
Angehängte Dateien:
OP #4995347
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
Angehängte Dateien:
#5054509
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren