- 3D-Druck Einstieg und Tipps         
Seite 2 von 3 ErsteErste 123 LetzteLetzte
Ergebnis 11 bis 20 von 23

Thema: SD Karte

  1. #11
    Erfahrener Benutzer Robotik Einstein Avatar von Jaecko
    Registriert seit
    16.10.2006
    Ort
    Lkr. Rottal/Inn
    Alter
    42
    Beiträge
    2.009
    Anzeige

    Praxistest und DIY Projekte
    Glaub den 128er gibts nur in SMD. Eine Möglichkeit wär das 256er Modul von Robotikhardware (benutz ich auch); die Pins sind da alle aufs normale 2,54er-Raster rausgeführt.

    Das Teil von Display3000 wäre für Bastlereien für mich fast etwas oversized. Mein Aufbau sieht so aus, dass es nur eine Doppelreihige Stiftleiste gibt (für die Kontaktierung) sowie 8 Widerstände. Mehr isses nicht. Und solangs mit der Software (noch) nicht klappt, muss es auch nicht mehr sein.
    #ifndef MfG
    #define MfG

  2. #12
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    19.07.2007
    Alter
    59
    Beiträge
    1.080
    Moin!

    Ein SD-Card Modul ist Teil meines Bots. Es läuft mit einem Atmega32 und ist nicht grade groß, was die Abmessungen angeht. Folgends macht das Modul:
    - Der Bot schreibt Statusmeldungen fortlaufend in eine txt-Datei, die ich unter Windows auslesen kann.
    - Der Bot sichert auf der Karte Bilder die von einer der Kameras kommt.
    - Der Bot kann Wav-Dateien abspielen, die auf der Karte vorhanden sind.

    Die Ansteuerung der Karte habe ich, was die Pegelumsetzung angeht, ebenso einfach gemacht, wie auf der Seite von Ulrich Radig zu sehen - null Problemo.

    Hier u.a. zwei Bilder dieses Moduls:

    http://www.vreal.de/index.php?option...tegory&catid=5

    Gruß MeckPommER

    EDIT: nicht wundern, einiges an Beschaltung ds Atmega32 (Quarz, Reset, etc. steckt unter dem Controller, und vieles wurde in SMD auf die Leiterbahnen gebrutzelt
    Mein Hexapod im Detail auf www.vreal.de

  3. #13
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    24.09.2006
    Ort
    Nähe Mannheim
    Beiträge
    269
    was heist monstrum, man kann ja den befestigungsrand ringsum entfernen und es ist so breit wie der sd-kartenhalter und 1 cm länger.
    wenn du das ganze mit transistoren aufbaust usw. wird es auch nicht kleiner,oder. war ja auch nur einvorschlag und software ist auch noch dabei.
    Ich meine den uC Jaecko hat ^^ nicht die Platine XD.
    Schonmal den ganzen Text dazu durchgelesen? is denk ich ma fast nur panik mache ;P


    1. An Bascom sollte es nicht liegen habe die Vollversion von daher passt das ja ganz gut ;P.
    2. Also ein Mega 32 reicht wies aussieht vollkommen aus,... werde dann wohl so einen nehmen da ich ja keine Platinen ätzen kann und ich nur ungern "Adapter verweden möchte" wobei dies natürlich auch noch eine altrnative wäre ;P.
    3. Ich schätz mal du verwendest auch das AVR Dos dafür oder?
    Frage dazu: wie verwände ich das überhaupt ? einfach den Codeschnipsel auf den chip und feierabend ?

    @MeckPommER
    Jawoll endlich ma einer der auch alles so einfach wie möglich baut ^^
    könntest du mir vll das programm mal schicken ? ein Beispiel wäre eine riesen hilfe ;P


    mfg

  4. #14
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    19.07.2007
    Alter
    59
    Beiträge
    1.080
    @feratu,

    Mit meinem Code kannst du bestimmt nichts anfangen, da da noch einiges an verwirrender Kommunikation mit anderen Modulen eingestrickt ist.

    So problematisch ist das aber auch nicht, denn alles, was zu tun ist, ist die verwendeten Ports in den zu inkludierenden Dateien richtig einzutragen. Ferner wird in der "Config_MMC.bas" und der "Config_AVR-DOS.bas" noch allerhand kleinkram eingetragen - ist dort aber sehr ausführlich dokumentiert.

    Danach gehts halt wie gewohnt:
    Öffnen der Datei je nach gewünschtem Modus, Lesen/Schreiben, Schliessen.

    Beispiel, in dem ich von einer Wav-Datei auf SD (Mono, 11.050Hz) die ersten 128 Bytes in ein Array verfrachte:

    dim vtrans(12 as byte
    Open Dateiname For Binary As #1
    Werteanzahl = 44
    Get #1 , Vtrans(1) , , Werteanzahl 'ersten 44 Bytes (Dateiheader einer Wave-Datei) laden und verwerfen (nicht benutzen)
    Werteanzahl = 128
    Get #1 , Vtrans(1) , , Werteanzahl 'ersten WAV 128 Bytes und in vtrans(1) bis vtrans(12 ablegen
    Close #1

    Ein und Ausgaben funktionieren auch mit print, input, etc.

    Meine Sub zum Weiterführen einer Log-Datei sieht einfach so aus:

    Sub Writelog(logtxt As String)
    Ledred = 1
    Open Logfilename For Append As #1
    Print #1 , Logtxt
    Flush #1
    Close #1
    Ledred = 0
    End Sub

    Damit das Ganze funzt, müssen natürlich die entsprechenden Dateien eingebunden werden

    $include "Config_MMC.bas"
    $Include "Config_AVR-DOS.bas"

    Hier wird geschaut, ob die Karte ansprechbar ist. Falls nicht, blinkt eine kleine SMD-LED bis ... ja, bis zum nächsten Reset oder Stromausfall
    Soll aber auch so sein, denn dadurch ist es durch den Hauptcontroller auf meinem Bot nicht mehr ansprechbar und der merkt sich zu Programmstart, welche Module reagieren und welche nicht.

    If Gbdriveerror <> 0 Then
    Ledgreen = 0
    Do
    Ledred = 1 : Waitms 40
    Ledred = 0 : Waitms 1200
    Loop
    End If

    Mit folgendem Befehl ist die Sache dann abgeschlossen und man kann frühlich Dateien öffnen, ....

    Datfehler = Initfilesystem(1)

    Ich hoffe, ich konnte auf die Schnelle helfen, bis derzeit nicht im hause und in reichweite eines richtigen Listings =8o)
    Mein Hexapod im Detail auf www.vreal.de

  5. #15
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    24.09.2006
    Ort
    Nähe Mannheim
    Beiträge
    269
    Jap bringt mich schonmal weiter danke ^^, muss jez sowieso erstmal auf mein Mega 32 warten,.... dauert mal wieder ewig grml

  6. #16
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    19.07.2007
    Alter
    59
    Beiträge
    1.080
    Wo muss man denn ewig auf nen Mega32 warten?
    Mein Hexapod im Detail auf www.vreal.de

  7. #17
    Benutzer Stammmitglied
    Registriert seit
    24.01.2006
    Ort
    Kirchdorf a. Inn
    Alter
    53
    Beiträge
    81
    @feratu

    Ich habs ab M32 probiert. Ich betreibe den M32 wiederwillig mit 3,3V ... und er läuft. Somit auch kein aufwendiges Interface. MeckPommer hat ja zum Zugriff schon alles geschrieben.
    Ich habs mit Hard SPI am laufen und muss auch nicht immer die Karte fürs Schreiben entfernen. Zeit- oder ereignisabhängig werden einfach diverse Files auf der Karte erzeugt und Daten reingeschubst. Die Demoversion reicht nicht aus für die Einbindung. Karte: SD 1GB

    gruss,
    wassermann

  8. #18
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    14.01.2008
    Beiträge
    164
    mit dieser einfachen methode kann man in Bascom jeden sector beschreiben und lesen.
    mein zusätzlicher demoausbau:
    die ersten 128 sectoren habe ich mir als merker eingerichtet wo etwas liegt. 4byte + 8buchstaben für name, von den 4byte sind die ersten 2 bytes der 1. sector von der datendatei und die bytes 3+4 sind der letzte sector der datendatei.

    benutze ich für verschiedene datenarchivierungen.
    ist meine eigenes suchsystem.
    dieses dos-geschmirgel ist mir zu aufwändig.

    mit einem eigenen programm auf dem pc mit python entworfen kann ich diese daten auch auf dem pc einlesen.

    macht richtig spass mal etwas eigenes zu entwerfen für unseren kleinen atmega ohne an das dos-system von bill gates zu denken.





    Code:
    $regfile = "m32def.dat"
    $framesize = 32
    $swstack = 32
    $hwstack = 64
    $crystal = 8000000
    $baud = 19200
    
    Declare Sub Mc_init()
    Declare Sub Mc_write()
    Declare Sub Mc_read()
    
    Dim Dout As Byte
    Dim Din As Byte
    Dim A As Word
    Dim Cmd(6) As Byte
    Dim Buffer(515) As Byte
    Dim Tmp As Long
    Dim Sector As Long
    
    Mcs Alias Portb.4
    Mosi Alias Portb.5
    Miso Alias Pinb.6
    Sck Alias Portb.7
    
    Config Pinb.4 = Output
    Config Pinb.5 = Output
    Config Pinb.6 = Input
    Config Pinb.7 = Output
    
    Waitms 255
    
    Buffer(1) = &HFE
    Buffer(514) = &HFF
    Buffer(515) = &HFF
    
    For A = 2 To 513
       Buffer(a) = 14
    Next
    Call Mc_init()
    Sector = 0
    Call Mc_write()
    
    For A = 2 To 513
       Buffer(a) = 15
    Next
    Call Mc_init()
    Sector = 1
    Call Mc_write()
    
    For A = 2 To 513
       Buffer(a) = 16
    Next
    Call Mc_init()
    Sector = 2
    Call Mc_write()
    
    Print
    Print
    Wait 1
    
    ' auslesen
    Wait 1
    Call Mc_init()
    Sector = 0
    Call Mc_read()
    
    For A = 2 To 30
       Print "wert: " ; Buffer(a)
       Waitms 50
    Next
    
    'auslesen
    Wait 1
    Call Mc_init()
    Sector = 1
    Call Mc_read()
    
    For A = 2 To 30
       Print "wert: " ; Buffer(a)
       Waitms 50
    Next
    
    'auslesen
    Wait 1
    Call Mc_init()
    Sector = 2
    Call Mc_read()
    
    For A = 2 To 30
       Print "wert: " ; Buffer(a)
       Waitms 50
    Next
    
    End
    
    Sub Mc_init()
    
       Set Mcs
    
       Dout = &HFF
       For A = 0 To 10
          Shiftout Mosi , Sck , Dout , 1 , 8 , 0
       Next
    
    Anfang:
       Reset Mcs
    
       Cmd(1) = &H40
       Cmd(2) = 0
       Cmd(3) = 0
       Cmd(4) = 0
       Cmd(5) = 0
       Cmd(6) = &H95
       For A = 1 To 6
          Shiftout Mosi , Sck , Cmd(a) , 1 , 8 , 0
       Next
    
       Dout = &HFF
       Shiftout Mosi , Sck , Dout , 1 , 8 , 0
    
       Shiftin Miso , Sck , Din , 1 , 8 , 0
       If Din <> 1 Then
          Goto Anfang
       End If
       Print "idle-modus " ; Din
    
    Anfang1:
       Reset Mcs
    
       Cmd(1) = &H41
       Cmd(2) = 0
       Cmd(3) = 0
       Cmd(4) = 0
       Cmd(5) = 0
       Cmd(6) = &HFF
       For A = 1 To 6
          Shiftout Mosi , Sck , Cmd(a) , 1 , 8 , 0
       Next
    
       Dout = &HFF
       Shiftout Mosi , Sck , Dout , 1 , 8 , 0
    
       Shiftin Miso , Sck , Din , 1 , 8 , 0
       If Din <> 0 Then
          Goto Anfang1
       End If
       Print "betriebs-modus " ; Din
    
       Set Mcs
    End Sub
    
    Sub Mc_read()
       Set Mcs
    
       Cmd(1) = &H51
       Cmd(2) = 0
       Cmd(3) = 0
       Cmd(4) = 0
       Cmd(5) = 0
       Cmd(6) = &HFF
    
       Shift Sector , Left , 9
    
       Tmp = Sector And &HFF000000
       Shift Tmp , Right , 24
       Cmd(2) = Tmp
    
       Tmp = Sector And &H00FF0000
       Shift Tmp , Right , 16
       Cmd(3) = Tmp
    
       Tmp = Sector And &H0000FF00
       Shift Tmp , Right , 8
       Cmd(4) = Tmp
    
    Anfang3:
       Reset Mcs
    
       For A = 1 To 6
          Shiftout Mosi , Sck , Cmd(a) , 1 , 8 , 0
       Next
    
       Dout = &HFF
       Shiftout Mosi , Sck , Dout , 1 , 8 , 0
    
       Shiftin Miso , Sck , Din , 1 , 8 , 0
       If Din <> 0 Then
          Goto Anfang3
       End If
       Print "read-modus " ; Din
    
       Dout = &HFF
       Shiftout Mosi , Sck , Dout , 1 , 8 , 0
       Dout = &HFF
       Shiftout Mosi , Sck , Dout , 1 , 8 , 0
    
       Shiftin Miso , Sck , Din , 1 , 8 , 0
       If Din <> &HFE Then
          Goto Ende
       End If
    
       For A = 2 To 515
          Shiftin Miso , Sck , Buffer(a) , 1 , 8 , 0
       Next
    
    Ende:
       Set Mcs
    End Sub
    
    Sub Mc_write()
    
       Set Mcs
    
       Cmd(1) = &H58
       Cmd(2) = 0
       Cmd(3) = 0
       Cmd(4) = 0
       Cmd(5) = 0
       Cmd(6) = &HFF
    
       Shift Sector , Left , 9
    
       Tmp = Sector And &HFF000000
       Shift Tmp , Right , 24
       Cmd(2) = Tmp
    
       Tmp = Sector And &H00FF0000
       Shift Tmp , Right , 16
       Cmd(3) = Tmp
    
       Tmp = Sector And &H0000FF00
       Shift Tmp , Right , 8
       Cmd(4) = Tmp
    
    Anfang2:
       Reset Mcs
    
       For A = 1 To 6
          Shiftout Mosi , Sck , Cmd(a) , 1 , 8 , 0
       Next
    
       Dout = &HFF
       Shiftout Mosi , Sck , Dout , 1 , 8 , 0
    
       Shiftin Miso , Sck , Din , 1 , 8 , 0
       If Din <> 0 Then
          Goto Anfang2
       End If
       Print "write-modus " ; Din
    
       Dout = &HFF
       Shiftout Mosi , Sck , Dout , 1 , 8 , 0
    
       For A = 1 To 515
          Shiftout Mosi , Sck , Buffer(a) , 1 , 8 , 0
          Waitus 10
       Next
    
       Dout = &HFF
       Shiftout Mosi , Sck , Dout , 1 , 8 , 0
    
       Set Mcs
    End Sub

  9. #19
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    24.09.2006
    Ort
    Nähe Mannheim
    Beiträge
    269
    Ich bestell mit mehreren Leuten zusammen etwas beim Reichelt nur der eine braucht noch ein bischen deswegen warten ;P

    Macht aber nix in der Zwit kann man bissl planen ^^

    Also ich mach das nun einfach mit der Transistor Variante die scheint mir noch am besten zu sein.
    Als erstes versuch ich das ganze mal mit der AVR DOS variante, wenn ich ma das soweit kapieren sollte bastel ich mir das selbst aber erstmal klein anfangen ;P.

    Danke für die antworten werd mich ma im laufe der Woche dran hocken, hab nur Mittelschicht deswegen keine Zeit -_______________-

  10. #20
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    16.02.2006
    Beiträge
    1.113
    Hallo,
    @sechsrad
    es ist bestimmt sinnvoll, auch mal die Hintergründe verstanden zu haben und die Kommunikation mit der Karte selbst auf die Beine gestellt zu haben.
    Aber wenn du schon ohne DOS arbeiten willst, dann würde ich die Funktionen DriveReadSector() und DriveWriteSector() benutzen. Da hast du auch den ganzen DOS Overhead nicht und es braucht wesentlich weniger Speicher.
    Deine Routinen kompilieren bei mir zu 3744 Byte, was einen Mega8 schon zur Hälfte voll macht. Ein vergleichbares Programm mit den beiden Befehlen compiliert zu 1356 Byte.
    Code:
    $regfile = "M8def.dat"
    $crystal = 8000000
    
    $baud = 115200
    
    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 "Wait for Drive"
    '$include "Config_MMC.bas"
             Const Cmmc_soft = 1
    
             #if Cmmc_soft = 0
    
             ' --------- Start of Section for HW-SPI ----------------------------------------
    
                ' define Chip-Select Pin
                Config Pinb.6 = Output                          ' define here Pin for CS of MMC/SD Card
                Mmc_cs Alias Portb.6
                Set Mmc_cs
    
                ' Define here SS Pin of HW-SPI of the CPU (f.e. Pinb.0 on M128)
                ' If an other Pin than SS is used for MMC_SS, SS must be set to OUTPUT and high for proper work of SPI
                ' otherwise AVR starts SPI-SLAVE if SS-Pin is INPUT and goes to LOW
                'Config Pinb.6 = Output                                   ' define here Pin of SPI SS
                'Spi_ss Alias Portb.6
                'Set Spi_ss                                               ' Set SPI-SS to Output and High por Proper work of
                                                                         ' SPI as Master
    
                ' HW-SPI is configured to highest Speed
                Config Spi = Hard , Interrupt = Off , Data Order = Msb , Master = Yes , Polarity = High , Phase = 1 , Clockrate = 4 , Noss = 1
             '   Spsr = 1                                       ' Double speed on ATMega128
                Spiinit                                         ' Init SPI
    
             ' --------- End of Section for HW-SPI ------------------------------------------
    
             #else                                              ' Config here SPI pins, if not using HW SPI
    
             ' --------- Start of Section for Soft-SPI --------------------------------------
    
                ' Chip Select Pin  => Pin 1 of MMC/SD
                Config Pinb.0 = Output
                Mmc_cs Alias Portb.0
                Set Mmc_cs
    
                ' MOSI - Pin  => Pin 2 of MMC/SD
                Config Pinb.4 = Output
                Set Pinb.4
                Mmc_portmosi Alias Portb
                Bmmc_mosi Alias 4
    
                ' MISO - Pin  => Pin 7 of MMC/SD
                Config Pinb.3 = Input
                Mmc_portmiso Alias Pinb
                Bmmc_miso Alias 3
    
                ' SCK - Pin  => Pin 5 of MMC/SD
                Config Pinb.7 = Output
                Set Pinb.7
                Mmc_portsck Alias Portb
                Bmmc_sck Alias 7
    
             ' --------- End of Section for Soft-SPI ----------------------------------------
    
             #endif
    
             ' ========== End of user definable range =======================================
    
    
             ' Error
             Const Cperrdrivereset = 225                        ' Error response Byte at Reset command
             Const Cperrdriveinit = 226                         ' Error response Byte at Init Command
             Const Cperrdrivereadcommand = 227                  ' Error response Byte at Read Command
             Const Cperrdrivewritecommand = 228                 ' Error response Byte at Write Command
             Const Cperrdrivereadresponse = 229                 ' No Data response Byte from MMC at Read
             Const Cperrdrivewriteresponse = 230                ' No Data response Byte from MMC at Write
             Const Cperrdrive = 231
             Const Cperrdrivenotsupported = 232                 ' return code for DriveGetIdentity, not supported yet
    
             Waitms 1                                           ' Wait some time before initialising MMC/SD
             Dim Gbdriveerror As Byte                           ' General Driver Error register
             Dim Gbdriveerrorreg As Byte                        ' Driver load Error-Register of HD in case of error
             Dim Gbdrivestatusreg As Byte                       ' Driver load Status-Register of HD on case of error
             Dim Gbdrivedebug As Byte
             $lib "MMC.LIB"                                     ' link driver library
             $external _mmc
    
    'Hier werden als Test die ersten 1000 Sektoren der Karte eingelesen und auf den UART ausgegeben.
    In_ptr = Varptr(in_buffer)
    If Gbdriveerror = 0 Then
       Mmc_error = Driveinit()
       If Mmc_error = 0 Then
          Print "Driveinit Ok. "
          For In_sect = 0 To 1000
             Mmc_error = Drivereadsector(in_ptr , In_sect)
             If Mmc_error = 0 Then
                Print "ReadSector(" ; In_sect ; ") ok."         'Zum Inhalt drucken, Kommentare entfernen !!!!!!!!!!
                Print In_buffer                                 'Dann wird es aber langsamer, 115200 baud beim übertragen
             Else
                Print "Error during ReadSector(" ; In_sect ; ") : " ; Mmc_error
             End If
             Mmc_error = Drivewritesector(in_ptr , In_sect)
             If Mmc_error = 0 Then
                Print "WriteSector(" ; In_sect ; ") ok."        'Zum Inhalt drucken, Kommentare entfernen !!!!!!!!!!
                Print In_buffer                                 'Dann wird es aber langsamer, 115200 baud beim übertragen
             Else
                Print "Error during WriteSector(" ; In_sect ; ") : " ; Mmc_error
             End If
          Next In_sect
       Else
          Print "Error during Driveinit(): " ; Mmc_error
       End If
    End If
    
    End
    Und was die Geschwindigkeit betrifft würde es mich schwer wundern, wenn du mit deinen Bascom Befehlen besser dran bist als die Lib Funktionen.

    @Feratu
    Na ja, ob AVR-DOS die kleine, einfache Variante ist, bezweifel ich. Lies dir mal durch, womit all die anderen zu kämpfen hatten, die Files öffnen, Text in bestimmter Formatierung schreiben und File wieder schließen wollten.
    Da ist es sicherlich einfacher, einen Sektor zu beschreiben.

    Gruß

    Rolf

Seite 2 von 3 ErsteErste 123 LetzteLetzte

Berechtigungen

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

Solar Speicher und Akkus Tests