- 12V Akku mit 280 Ah bauen         
Ergebnis 1 bis 6 von 6

Thema: MMC und Bascom

  1. #1
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    13.05.2005
    Alter
    32
    Beiträge
    601

    MMC und Bascom

    Anzeige

    Powerstation Test
    Hi,

    ich habe ein verständnis Problem des Codes für die Ansteuerung der MMC-
    Karte von roboterheld. Das Programm läuft (bezogen auf den ersten
    Sector) super. (Alles erkannt, ausgelesen....) Will ich nun den 2ten Sektor
    auslesen, bekomm ich nichts mehr raus.

    Hier der Code:

    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.0
    Mosi Alias Portb.1
    Miso Alias Pinb.2
    Sck Alias Portb.3
    
    Config Pinb.0 = Output
    Config Pinb.1 = Output
    Config Pinb.2 = Input
    Config Pinb.3 = Output
    
    
    Waitms 255
    Sector = 0
    
    Buffer(1) = &HFE
    Buffer(514) = &HFF
    Buffer(515) = &HFF
    
    For A = 2 To 513
       Buffer(a) = 76
    Next
    
    Call Mc_init()
    Call Mc_write()
    
    Waitms 500
    For A = 1 To 515
       Buffer(a) = 0
    Next
    
    Call Mc_init()
    Call Mc_read()
    
    For A = 2 To 513
       Print "wert: " ; Buffer(a)
       Waitms 255
    Next
    
    End
    
    Sub Mc_init()
    
       Set Mcs
    
       Dout = &HFF
       For A = 0 To 10
          Shiftout Mosi , Sck , Dout , 1 , 8 , 16
       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 , 16
       Next
    
       For A = 1 To 8
          Reset Sck
          Waitus 10
          Set Sck
          Waitus 10
       Next
    
       Shiftin Miso , Sck , Din , 1 , 8 , 16
       If Din <> 1 Then
          Goto Anfang
       End If
       Print 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 , 16
       Next
    
       For A = 1 To 8
          Reset Sck
          Waitus 10
          Set Sck
          Waitus 10
       Next
    
       Shiftin Miso , Sck , Din , 1 , 8 , 16
       If Din <> 0 Then
          Goto Anfang1
       End If
       Print 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 , 16
       Next
    
       For A = 1 To 8
          Reset Sck
          Waitus 10
          Set Sck
          Waitus 10
       Next
    
       Shiftin Miso , Sck , Din , 1 , 8 , 16
       If Din <> 0 Then
          Goto Anfang3
       End If
       Print Din
    
       For A = 1 To 16
          Reset Sck
          Waitus 10
          Set Sck
          Waitus 10
       Next
    
       Shiftin Miso , Sck , Din , 1 , 8 , 16
       If Din <> &HFE Then
          Goto Ende
       End If
    
       For A = 2 To 515
          Shiftin Miso , Sck , Din , 1 , 8 , 16
          Buffer(a) = Din
       Next
    
    Ende:
       Waitms 5
    
       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 , 16
       Next
    
       For A = 1 To 8
          Reset Sck
          Waitus 10
          Set Sck
          Waitus 10
       Next
    
       Shiftin Miso , Sck , Din , 1 , 8 , 16
       If Din <> 0 Then
          Goto Anfang2
       End If
       Print Din
    
       For A = 1 To 8
          Reset Sck
          Waitus 10
          Set Sck
          Waitus 10
       Next
    
       For A = 1 To 515
          Dout = Buffer(a)
          Shiftout Mosi , Sck , Dout , 1 , 8 , 16
          Waitus 10
       Next
    
       Waitus 10
       Shiftin Miso , Sck , Din , 1 , 8 , 16
       Print Din
    
       For A = 1 To 8
          Reset Sck
          Waitus 10
          Set Sck
          Waitus 10
       Next
    
       Set Mcs
    
    End Sub
    Weiß jemand wie man da den Sector ändern kann?
    Grüße Furtion

  2. #2
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    14.01.2008
    Beiträge
    164
    sector 0-3 wird beschrieben und gelesen :

    wenn du nicht hintereinander die sectoren beschreibst , musst du den buffer vorher..
    Buffer(1) = &HFE
    Buffer(514) = &HFF
    Buffer(515) = &HFF
    ...immer so belegen.

    bei mir laufen so alle karten.



    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.0
    Mosi Alias Portb.1
    Miso Alias Pinb.2
    Sck Alias Portb.3
    
    Config Pinb.0 = Output
    Config Pinb.1 = Output
    Config Pinb.2 = Input
    Config Pinb.3 = Output
    
    Waitms 255
    
    Buffer(1) = &HFE
    Buffer(514) = &HFF
    Buffer(515) = &HFF
    
    For A = 2 To 513
       Buffer(a) = 65
    Next
    Call Mc_init()
    Sector = 0
    Call Mc_write()
    
    For A = 2 To 513
       Buffer(a) = 66
    Next
    Call Mc_init()
    Sector = 1
    Call Mc_write()
    
    For A = 2 To 513
       Buffer(a) = 67
    Next
    Call Mc_init()
    Sector = 2
    Call Mc_write()
    
    For A = 2 To 513
       Buffer(a) = 68
    Next
    Call Mc_init()
    Sector = 3
    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
    
    'auslesen
    Wait 1
    Call Mc_init()
    Sector = 3
    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 , 16
       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 , 16
       Next
    
       Dout = &HFF
       Shiftout Mosi , Sck , Dout , 1 , 8 , 16
    
       Shiftin Miso , Sck , Din , 1 , 8 , 16
       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 , 16
       Next
    
       Dout = &HFF
       Shiftout Mosi , Sck , Dout , 1 , 8 , 16
    
       Shiftin Miso , Sck , Din , 1 , 8 , 16
       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 , 16
       Next
    
       Dout = &HFF
       Shiftout Mosi , Sck , Dout , 1 , 8 , 16
    
       Shiftin Miso , Sck , Din , 1 , 8 , 16
       If Din <> 0 Then
          Goto Anfang3
       End If
       Print "read-modus " ; Din
    
       Dout = &HFF
       Shiftout Mosi , Sck , Dout , 1 , 8 , 16
       Dout = &HFF
       Shiftout Mosi , Sck , Dout , 1 , 8 , 16
    
       Shiftin Miso , Sck , Din , 1 , 8 , 16
       If Din <> &HFE Then
          Goto Ende
       End If
    
       For A = 2 To 515
          Shiftin Miso , Sck , Din , 1 , 8 , 16
          Buffer(a) = Din
       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 , 16
       Next
    
       Dout = &HFF
       Shiftout Mosi , Sck , Dout , 1 , 8 , 16
    
       Shiftin Miso , Sck , Din , 1 , 8 , 16
       If Din <> 0 Then
          Goto Anfang2
       End If
       Print "write-modus " ; Din
    
       Dout = &HFF
       Shiftout Mosi , Sck , Dout , 1 , 8 , 16
    
       For A = 1 To 515
          Dout = Buffer(a)
          Shiftout Mosi , Sck , Dout , 1 , 8 , 16
          Waitus 10
       Next
    
       Dout = &HFF
       Shiftout Mosi , Sck , Dout , 1 , 8 , 16
    
       Set Mcs
    End Sub

  3. #3
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    13.05.2005
    Alter
    32
    Beiträge
    601
    Hi,

    ich habe noch ein paar Fragen dazu:

    1) Wofür ist dieses Shift Sector,....... gut?
    2) Wenn ich eine 16Mb karte habe, habe ich doch dann max. 32768
    Sectoren, oder?
    3) Warum bekomme ich (wenn ich die Karte mit Fat16 formatiert habe)
    beim ersten Sector, wunderbare Daten raus, beim 2ten Sector aber
    nur 0en?
    Grüße Furtion

  4. #4
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    14.01.2008
    Beiträge
    164
    1) Wofür ist dieses Shift Sector,....... gut?
    da wird der wert zb sector 4 geshiftet für die datenbytes die bei der übergabe
    gebraucht werden (cmd1-cmd5).


    bei mir laufen alle karten mit verschiedenen sectoren , schreiben und lesen.
    habe keine schwierigkeiten. komisch.

    habe aber gehört im anderen foren, das die karten manchmal zickig sind.
    gerade wenn sie mit winavr-c geproggt werden.

    die spannungsquelle muss sehr genau stimmen.
    dieser widerstands-spannungsteiler für die 3,3v ist sehr beschissen und tückisch, sollte man nicht nehmen.

  5. #5
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    14.01.2008
    Beiträge
    164
    ..... Wenn ich eine 16Mb karte habe, habe ich doch dann max. 32768
    Sectoren, oder?.........

    irgendwie funktioniert das formatieren unter windows erst ab 32mb als normal. darunter muss man man irgend etwas einstellen. google mal.

    ich hab keine karten mher unter 32mb.

    mfg

  6. #6
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    13.05.2005
    Alter
    32
    Beiträge
    601
    Hi,

    ich kann auch eine 16Mb karte unter Windows formatieren. Funzt mit
    der Software eigendlich auch SD Karten? Zur Stromquelle:
    geregelte 3,5 V auf der ganzen Schaltung. Also wenn ich eine
    16Mb karte habe kann ich auch den Sector = 1234 setzen oder?
    Grüße Furtion

Berechtigungen

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

LiFePO4 Speicher Test