Laut der Hilfe schreibst du mit dem Befehl bis zu 512 Bytes in einen Sektor:
Write a Sector (512 Bytes) to the (Compact Flashcard) Drive
Laut der Hilfe schreibst du mit dem Befehl bis zu 512 Bytes in einen Sektor:
Write a Sector (512 Bytes) to the (Compact Flashcard) Drive
Schaut ruhig mal auf meiner Homepage vorbei:
http://kampis-elektroecke.de
Oder folge mir auf Google+:
Daniel Kampert
Es gibt 10 Arten von Menschen. Die einen können Binär, die anderen nicht.
Gruß
Daniel
Okay hab ich anscheinend überlesen....
Aber wo wird bei dem Befehl definiert was ich jetzt eigentlich speichere?
in meinem Fall gibt doch Berror einen Wert zurück, ob das Schreiben funktioniert hat, wsrampoint die Adresse von wo und Lsectornumber in welchen Sektor ich es schrieben will.
oder wird mit wsrampoint automatisch das byte an dieser Stelle übertragen?
Hallo Fabian,
ich habe das einfach so gemacht:
Du schreibst in den String, durch das Overlay aber gleichzeitig auch in das Byte-Array Buffer.Code:Dim Berror As Byte Dim Buffer(512) As Byte 'SRAM-Bereich für Transfer Dim Messwerte_string * 512 as string at Buffer(1) overlay Dim Wsrampoint As Word 'Adress-Pointer für die Drive.. Routinen Dim Lselectornumber As Long 'Variable für Sektor-Nummer Wsrampointer = Varptr(buffer(1)) Lselectornumber =1 ..... Druck1 = Getadc(4) Druck2 = Getadc(5) Temperatur = Getadc(6) Messwerte_string = Gpgga + ";" + Str(druck1) + ";" + Str(druck2) + ";" + Str(temperatur) + "*" Berror = DriveWriteSector(Wsrampointer,Lselectornumber)
Der DriveWriteSector Befehl schreibt immer die nächsten 512 Byte ab der angegebenen Adresse auf die SD Karte.
Beachte, dass du die Karte mit Windows nicht mehr lesen kannst, wenn du auf den Sektor 1 schreibst.
Hallo!
Grundsätzlich ist es bei SD-Karten möglich, innerhalb eines Sektors Schritt für Schritt zu schreiben - jedes Byte immer dann, wenn es vom Messgerät eingelesen wird. Wahrscheinlich geht das aber nicht mit den üblichen Prozeduren.
Ich wollt nur auf die Möglichkeit hinweisen, weil ist so etwas schon einmal gemacht habe. Dadurch kann man auch mit Mikrocontrollern mit wenig Speicher (z.B. ATtiny25) auf SD-Karten schreiben.
Danke for_ro,
Genau das habe ich gesucht![]()
Hatte auch noch dummer Weis eine Variable falsch geschrieben... aber jetzt funktioniert es
Hatte gedacht in Sektor 0 stehen die wichtigen Daten die man nicht verändern darf aber in Sektor 1 darf man doch schon etwas schreiben oder?
Fabian
Wenn du die Karte mit Windows lesen willst, dann kannst du sehr viele Sektoren am Beginn der Karte nicht benutzen.
Wieviele hängt wohl auch von der Größe der Karte und der Art der FAT ab.
Ich hatte damals eine Karte frisch formatiert und dann einen File mit bekanntem Inhalt (1234567890123456...) draufgeschrieben. Der steht dann auf dem ersten verwendbaren Sektor. Mit dem µC habe ich dann über DriveReadSector diesen Sektor gesucht.
Bei meiner 1GB Karte war es der Sektor 768.
Hallo trekko,
würde mich auch mal interessieren, wie das geht. Müsste man wahrscheinlich die DriveWriteSektor Funktion so ändern, dass über einen zusätzlichen Parameter die Anzahl bytes übergeben wird. Und nur die werden dann geschrieben.
Irgendwo habe ich mal gelesen, dass die Daten erst in einen Buffer geschrieben werden. Wenn dann ein Sektor komplett ist, wird er auf die Karte übertragen. Dies geschieht im Controller der Karte.
Hi for_ro, ich kenn ja die DriveWriteSektor-Funktion nicht, ich hab die SD-Karte "zu Fuß" beschrieben, das heißt, ich hab die Schreibbefehle für die SD-Karte direkt über die serielle Leitung geschickt. Hier findest du ein paar Infos zu dem Thema: http://elm-chan.org/docs/mmc/mmc_e.html
Natürlich ist das aufwändiger, als so komfortable Funktionen wie DriveWriteSektor zu benutzen, es hat aber den Vorteil, dass man den Schreibvorgang so beeinflussen kann, wie man will. Das Schreibprotokoll für die SD-Karten erlaubt es nämlich, während des Schreiben eines Blocks den Clock-Takt vorübergehend anzuhalten und dann ein paar Sekunden (oder Minuten) später weiterzuschreiben, als wäre nichts gewesen.
Hatte ich mir auch so gedacht. Cool wäre es allerdings, wenn man das auch über einen modifizierten DriveWrite Befehl machen könnte.
Aber diese Sache mit dem Clock anhalten ist dort nicht beschrieben, oder habe ich das übersehen?
Hast du dieses unterbrechen schon mal implementiert? Das wäre genau das, wie ich es auch gerne machen würde. Zur Zeit warte ich 8 Minuten, bis ich 512 Byte zusammen habe und diese dann en Block auf die Karte schreibe.
Man kann keinen String mit einer Länge von 512 Zeichen über ein 512 Byte Array legen, denn der String benötigt tatsächlich 512 Zeichen + 1 Endbyte. Wenn der String tatsächlich mal 512 Byte lang ist, wird die dem Array folgende Variable zerstört, hier Wsrampoint, mit unbestimmten Folgen. Auch fehlt dem String, sollte er überhaupt korrekt geschrieben werden, auf der SD-Karte das Endzeichen. Das kann dann bei der Weiterverarbeitung zu Problemen führen. Also den String nur 511 Zeichen lang dimensionieren.
Lesezeichen