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
Ä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"
Der ist aber halt in C und das mag nicht jeder (zumindest auf dem µC)... Gruß Jörg
Assembler, Das seh ich ja jetzt erst. Ihr Masochisten.
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
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
@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
@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
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
Danke Jochen, hier fand ich auch noch sehr nützliche Informationen: http://www.jay-code.de http://www.cc5x.de/MMC/FAT.html Bernhard
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
@ 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
@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
@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
@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
Haleluja, endlich mal ein Quellcode in Assembler. Ich bin dir was schuldig. Mal schauen, wenn ich Zeit finde bürste ich ihn mal durch.
@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
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.
@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
Hast recht, das STS und LDS hatte der ATmega8 nicht gehabt.
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"
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
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.
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
> - 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
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
@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
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
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
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.