PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : MMC und Bascom



Furtion
02.02.2008, 20:30
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:




$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?

sechsrad
03.02.2008, 20:23
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.





$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

Furtion
04.02.2008, 09:33
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?

sechsrad
04.02.2008, 14:37
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.

sechsrad
04.02.2008, 15:04
..... 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

Furtion
04.02.2008, 17:30
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?