- fchao-Sinus-Wechselrichter AliExpress         
Seite 2 von 3 ErsteErste 123 LetzteLetzte
Ergebnis 11 bis 20 von 23

Thema: SD Karte! Ich weiss die Frage kam schon zum 100mal

  1. #11
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    26.05.2007
    Beiträge
    594
    Anzeige

    LiFePo4 Akku selber bauen - Video
    Einen USB-Stick ansprechen ist eine völlig andere Sportart!
    Dafür braucht es einen USB-Host (halt den PC) - der müsste vom AVR emuliert werden - das kannste knicken.
    FTDI hat allerdings einen Chip und auch so Module, die genau das leisten können. http://www.vinculum.com/prd_vmusic1.html

  2. #12
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    03.10.2007
    Alter
    51
    Beiträge
    128

    SD Karte beschreiben - Sektor anlegen?

    Hallo,

    ich möchte eine SD Karte mit Messwerten beschreiben und diese am PC auslesen.
    Da ich nur einen M32 benutze kann ich kein AVR Dos nutzen.
    In einem älteren Beitrag habe ich folgenden Artikel gefunden:


    Zitat Zitat von for_ro
    Dann versuch es doch mal mit der einfachen Version, ohne AVR-DOS.
    Ich weiß nicht, wieviel dein sonstiger Code ausmacht, aber der hier inklusive Lesen und Schreiben von 1000 Sektoren und Ausgabe auf den UART belegt gerade mal 1492 Byte, also noch viel Platz bis 4K.
    Code:
    $regfile = "M128def.dat"
    $crystal = 16000000
    
    $baud1 = 115200
    Open "Com2:" As Binary As #1
    Enable Interrupts
    
    Dim Mmc_error As Byte
    Dim In_ptr As Word                                          ' Address-Pointer for read
    Dim In_sect As Long
    Dim In_buffer As String * 512
    Print #1 , "Wait for Drive"
    $include "Config_MMC.bas"
    'Hier werden als Test die ersten 1000 Sektoren der Karte eingelesen und auf den UART ausgegeben und dann wieder auf die SD geschrieben.
    In_ptr = Varptr(in_buffer)
    If Gbdriveerror = 0 Then
       Mmc_error = Driveinit()
       If Mmc_error = 0 Then
          Print #1 , "Driveinit Ok. "
          For In_sect = 0 To 1000
             Mmc_error = Drivereadsector(in_ptr , In_sect)
             If Mmc_error = 0 Then
                Print #1 , "ReadSector(" ; In_sect ; ") ok."    'Zum Inhalt drucken, Kommentare entfernen !!!!!!!!!!
                Print #1 , In_buffer                            'Dann wird es aber langsamer, 115200 baud beim übertragen
                Mmc_error = Drivewritesector(in_ptr , In_sect)
             Else
                Print #1 , "Error during ReadSector(" ; In_sect ; ") : " ; Mmc_error
             End If
          Next In_sect
       Else
          Print #1 , "Error during Driveinit(): " ; Mmc_error
       End If
    End If
    
    End
    Hierbei werden die Sektoren direkt geschrieben. Das reicht für die Ein- und Ausgabe im µC.
    Wenn du eine Datei in Windows sehen willst, legst du vorher eine dummy-Datei der benötigten Größe an und schreibst dann deren Sektoren.

    Gruß

    Rolf
    Jetzt die Frage:
    Wie und welche Datei muss ich anlegen, und wie weis ich auf welchen Sektoren sie liegt?

  3. #13
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    16.02.2006
    Beiträge
    1.113
    Hi Duesentrieb,
    ich habe das so gemacht:
    Mit dem Editor eine Datei öffnen, Name z.B. Log01.txt, ist für den ATMEGA aber egal.
    In die erste Zeile einen Text einfügen, der im normalen Betrieb nicht auftauchen kann. Ich habe da 510 Zeichen reingeschrieben
    *12345678901234567890...123456789
    Am Ende der Zeile ein Return fügt dann noch 2 Zeichen ein, nämlich <CR> und <LF>. Eine Zeile enthält dann 512 Zeichen, ist also genau einen Sektor lang.
    Die Zeile habe ich dann im Editor kopiert bis die Datei 50MB groß war, also 100.000 Zeilen hatte.

    Die SD Karte habe ich formatiert, sodass nichts auf der Karte steht.
    Dann habe ich die Datei 20 mal auf die SD kopiert und jedesmal die Zahl im Namen erhöht. Die Dateien hießen also Log01.txt, Log02.txt, ..., Log20.txt. Insgesamt sind dies knapp 1GB.
    Auf der SD stehen die Dateien dann direkt hintereinander, ohne Zwischenraum.

    Wenn du nun immer sektorweise schreibst, füllst du eine Datei nach der anderen. Auf dem PC kannst du die Dateien weiterhin mit dem Editor öffnen, solange du immer 512 Zeichen pro Sektor hast und am End immer ein <CR> und ein <LF> steht.
    Nachdem ich alles geschrieben hatte, habe ich die SD mit dem ATMEGA gelesen, und zwar die Sektoren von 0 an.
    Wenn dann das erste Mal die Zeichenfolge *1234567890... gelesen wurde, hast du den Anfang der ersten Datei gefunden. Bei meiner 2GB Karte ist das der Sektor 768.

    Durch den Trick mit der festen Zeichefolge brauche ich die aktuelle Sektornummer nicht zu speichern, sondern kann sie sehr schnell finden.
    Du kannst dazu die "Binäre Suche" verwenden, da die Sektoren praktisch in zwei Bereiche geteilt sind: Die, die schon beschrieben wurden, und die, die noch frei sind (bei denen ist "*" das erste zeichen im Sektor).
    Für meine 2.000.000 Sektoren muss ich dazu beim Programmstart nur 21 Sektoren lesen und habe den zuletzt geschriebenen Sektor gefunden.

  4. #14
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    03.10.2007
    Alter
    51
    Beiträge
    128
    Hallo for_ro,

    danke für die schnelle Antwort.
    Die Logik habe ich, denke ich, soweit verstanden.
    Die erstellten txt-Datein sind dann von Anfang bis Ende mit der Zahlenfolge beschrieben.
    Wenn der Atmega dort nun etwas hinschreibt, überschreibt er doch nur den text der so groß ist wie den der er schreibt, der Rest der urspr. Zahlenfolge bleibt doch bestehen, oder?


    Edit:
    Muss gleich nochne Frage stellen:
    Mit "Drivewritesector" schreibe ich in den Sektor. Wie aber?
    Die Hilfe hilft mir überhaupt nicht. Sieht so aus als ob da das wesentlich fehlt.
    Kann mir jemand dazu den Syntax geben?

  5. #15
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    16.02.2006
    Beiträge
    1.113
    Zitat Zitat von Duesentrieb
    Mit "Drivewritesector" schreibe ich in den Sektor. Wie aber?
    Die Hilfe hilft mir überhaupt nicht. Sieht so aus als ob da das wesentlich fehlt.
    Kann mir jemand dazu den Syntax geben?
    Hier ein Auszug aus dem Code oben:

    Dim In_ptr As Word ' Address-Pointer for read
    Dim In_sect As Long 'Nr. des Sektors, der gelesen oder geschrieben werden soll
    Dim In_buffer As String * 512 'der Ein- und Ausgabe Puffer, kann auch vom Typ Byte sein, oder 256 Word oder 128 Long Werte

    In_ptr = Varptr(in_buffer) 'hier wird die Adresse des Puffers geholt
    Mmc_error = Drivewritesector(in_ptr , In_sect) 'SektorNummer und Adresse werden übergeben

    Es wird also in einen frei wählbaren Sektor geschrieben, und zwar 512 Byte, die im SRAM ab der Adresse In_ptr stehen. Auch wenn du in den In-Buffer weniger geschrieben hast, werden trotzdem 512 Byte auf die SD übertragen.

  6. #16
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    03.10.2007
    Alter
    51
    Beiträge
    128
    Sorry, ich habs immer noch nicht verstanden.
    Angenommen ich möchte den Text "hallo Test" in Sektor 5 schreiben.
    Wie müsste ich dies im Programm einbauen?

  7. #17
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    16.02.2006
    Beiträge
    1.113
    In_buffer = "hallo Test"
    In_sect = 5
    Drivewritesector(in_ptr , In_sect)

  8. #18
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    03.10.2007
    Alter
    51
    Beiträge
    128
    es ist wie verhext.

    So "einfach" habe ich das heute Abend sicher auch schon einmal versucht.
    Hmm, hab mich wohl irgent wo vertippt. Egal - jetzt hats geklappt

    Vielen Dank!

  9. #19
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    16.02.2006
    Beiträge
    1.113
    Noch eins: Schreib lieber nicht in die Sektoren unterhalb des ersten Sektors der Datei. Dort hält Windows seine Tabellen. Wenn du dort schreibst, wird Windows die Karte nicht mehr lesen können.

  10. #20
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    03.10.2007
    Alter
    51
    Beiträge
    128
    o.k. Danke für den Hinweis!

Seite 2 von 3 ErsteErste 123 LetzteLetzte

Berechtigungen

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

Labornetzteil AliExpress