+ Antworten
Seite 2 von 2 ErsteErste 12
Ergebnis 11 bis 17 von 17

Thema: String auf SD-Karte mit Drivewritesector()

  1. #11
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    16.02.2006
    Beiträge
    1.100
    Zitat Zitat von trekko Beitrag anzeigen
    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.
    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.

  2. #12
    Benutzer Stammmitglied
    Registriert seit
    06.08.2009
    Beiträge
    45
    Stimmt das mit dem endbyte hatte ich garnicht beachtet. Wegen der Auswertung: ich wollte in jeden Sektor nur einen datenstring schreiben und zur Auswertung dann die Sektoren durchgehen, dann brauche ich doch keine Endzeichen?
    Wegen der Anfangssektoren werde ich das mal bei meiner 1 gb Karte herausfinden und dann den Startsektor dementsprechend anpassen.

  3. #13
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    01.10.2009
    Beiträge
    437
    Zitat Zitat von Fabian1995 Beitrag anzeigen
    ich wollte in jeden Sektor nur einen datenstring schreiben und zur Auswertung dann die Sektoren durchgehen, dann brauche ich doch keine Endzeichen?
    Wenn der Datenstring immer eine bestimmte Länge hat, könnte man auf das Endzeichen verzichten, ansonsten braucht man's um das Ende des Strings erkennen zu können. Bascom wird das Endzeichen aber auf jeden Fall schreiben, wenn also der String tatsächlich max 512 Bytes enthalten kann, dann unmittelbar auf die Buffervariable folgend ein einzelnes Byte dimensionieren, damit dieses das Endzeichen aufnimmt und nix überschrieben wird.

  4. #14
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    16.02.2006
    Beiträge
    1.100
    Vielleicht solltest du nicht solche hintenrum Lösungen implementieren, die du nachher nicht mehr verstehen kannst.
    Tatsächlich habe ich es bei mir genau anders herum gemacht:

    Dim Messwerte_string * 512 as string
    Dim Buffer(512) As Byte at Messwerte_string overlay

    Dabei wird auch Platz für das Endezeichen bei 512 Byte langen Strings erzeugt.
    Die Bufferlänge von 512 reicht, weil die hier nur zur Verdeutlichung angegeben wird.

    Die DriveWriteSector() Funktion schreibt nicht bis zum Endezeichen des Strings sondern 512 Byte, egal was da drin steht.
    Das musst du dann nur beim Einlesen bedenken, wenn du die DriveReadSector() Funktion benutzt, um den Sektor wieder in den Buffer und damit in den String zu bekommen. Steht weder in den 512 Byte noch im zusätzlichen Byte von Messwerte_string kein 0-Byte, dann geht der String einfach weiter, solange bis er im SRAM auf ein 0-Byte trifft. Evtl. kommen damit aber die Stringfunktionen nicht mehr zurecht.

    Mit den Stringfunktionen solltest du bei solch langen Strings ohnehin sehr vorsichtig umgehen. Besonders Dinge wie

    Messwerte_string = "12345678901234567890" + Messwerte_string

    können zu recht hohen Anforderungen an deinen Frame Bereich führen, weil hierzu eine Kopie von Messwerte_string erzeugt werden muss.
    Damit werden dann evtl. die Stacks überschrieben, was zu recht garstigen Fehlern führen wird.

  5. #15
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    01.10.2009
    Beiträge
    437
    for_ro,
    Zitat Zitat von for_ro Beitrag anzeigen
    Vielleicht solltest du nicht solche hintenrum Lösungen implementieren,
    Die Hintenrum-Lösung war eine Korrektur Deines fehlerhaften Vorschlags:
    Zitat Zitat von for_ro Beitrag anzeigen
    Hallo Fabian,
    ich habe das einfach so gemacht:
    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
    Und hat Dich immerhin dazu bewegt drüber nachzudenken und zu korrigieren.

  6. #16
    Benutzer Stammmitglied
    Registriert seit
    09.03.2012
    Beiträge
    51
    Zitat Zitat von for_ro Beitrag anzeigen
    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.

  7. #17
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    16.02.2006
    Beiträge
    1.100
    Zitat Zitat von trekko Beitrag anzeigen
    ... 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.
    Hatte ich mir auch so gedacht. Cool wäre es allerdings, wenn man das auch über einen modifizierten DriveWrite Befehl machen könnte.
    Zitat Zitat von trekko Beitrag anzeigen
    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.
    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.

+ Antworten
Seite 2 von 2 ErsteErste 12

Ähnliche Themen

  1. Chr(0) im String
    Von Furtion im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 8
    Letzter Beitrag: 28.11.2008, 10:37
  2. string an lcd senden, string in pointer speichern
    Von andi.studi im Forum PIC Controller
    Antworten: 15
    Letzter Beitrag: 13.08.2008, 23:51
  3. String auf String zuweisen geht nicht
    Von Jaecko im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 6
    Letzter Beitrag: 14.12.2006, 17:48
  4. Sim-Karte
    Von Speed im Forum Controller- und Roboterboards von Conrad.de
    Antworten: 2
    Letzter Beitrag: 18.11.2006, 11:51
  5. SD-Karte oder CF-Karte?
    Von Johannes G. im Forum AVR Hardwarethemen
    Antworten: 3
    Letzter Beitrag: 22.08.2006, 12:28

Stichworte

Berechtigungen

  • Neue Themen erstellen: Ja
  • Themen beantworten: Ja
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •