PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Sd Karte in Bascom an Mega 32



PASCALU
25.12.2007, 00:00
Hallo zusammen
Habe mich in den letzten Tagen mit der Anbindung einer SD Karte an einen mega32 beschäftigt. Sd Karte wird erkannt. Jedoch scheitere ich beim auslesen von Sektoren respektive beim initfilesystem bekomme ich diesen Error : Init File System ... Error: 229 at Init file system
Irgendetwas mit der Karte scheint noch nicht ganz zu stimmen ...
Ideen ?
mfg

roboterheld
25.12.2007, 12:16
ich habe mal eine rouine geschrieben für den m32 mit code aus diesem forum.
diese routinen sind zu fuss erstellt, damit man mal sieht bzw erkennt wie eine sd/mmc funktioniert.
schau dir mal die anschlüsse an und verändere die mal für deinen mmc-anschluss.

ich habe eine gute zeichnung über das timinig und daten der mmc in pdf-format, danach habe ich mein programm erstellt und viel dazu gelernt. kann ich dir mailen.


funktioniert super.



$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

PASCALU
25.12.2007, 20:03
Neue Erkenntnisse :
Heute habe ich es soweit gebracht
das ist die Ausgabe mit deinem Code sollte es so aussehen??
1
0
0
224
1
0
0
wert: 0
wert: 0
wert: 0
wert: 0
wert: 0
wert: 0
wert: 0
wert: 0

roboterheld
26.12.2007, 13:38
hallo fast richtig :

1
0
0
229
1
0
0
wert: den du als ascii geladen hast (65 für das a zb usw)

224 ist eine fehlermeldung.
schau den code noch einmal durch.
formatier deine mmc/sd-karte mal neu.
steck die karte mal bei laufenden betrieb raus und rein , ob sich die zahlenwerte ändern.

gib mir deine mail dann sende ich dir mal eine grafische zeitendarstellung für eine karte, danach kann man auch sauber programmieren und der erfolg ist da.

roboterheld
26.12.2007, 13:42
schau nach, ob deine karte genauso amgeklemmt ist, achte auf input und output :

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

oder ändere das nach deinem anschluss!!!!!!

PASCALU
28.12.2007, 23:33
so hat gestern geklappt nach austausch der vorgeschsalteten dioden als Spannungsversorgung durch einem festspannungsregler..
Habe im Forum noch das umgeschreibene AVR - DOS gefunden .. Läuft gut.. Nur wird bei mir zwar die angegebene Datei erstellt jedoch steht nichts darin .. ist das normal ?
mfg

$regfile = "m32def.dat"
$crystal = 16000000

' Adjust HW Stack, Soft-Stack and Frame size to 128 minimum each!!!

$baud = 9600

'Open "Com1:" As Binary As #1 ' use #1 for fs_interpreter
Config Clock = Soft
Enable Interrupts
Config Date = Mdy , Separator = .
Dim Btemp1 As Byte

Print "Wait for Drive"

$include "Config_MMC6.bas"
' Include here you driver for Compactflash/HardDisk or other
'$include "Config_CompactFlash_M128.bas" ' Does drive init too
'$Include "Config_HardDisk_M128.bas"

If Gbdriveerror = 0 Then

' Include AVR-DOS Configuration and library
$include "Config_AVR-DOS.BAS"

Print "Init File System ... ";
Btemp1 = Initfilesystem(1) ' Partition 1
' use 0 for drive without Master boot record
If Btemp1 <> 0 Then
Print "Error: " ; Btemp1 ; " at Init file system"
Else
Print " OK"
Print "Filesystem: " ; Gbfilesystem
Print "FAT Start Sector: " ; Glfatfirstsector
Print "Root Start Sector: " ; Glrootfirstsector
Print "Data First Sector: " ; Gldatafirstsector
Print "Max. Cluster Nummber: " ; Glmaxclusternumber
Print "Sectors per Cluster: " ; Gbsectorspercluster
Print "Root Entries: " ; Gwrootentries
Print "Sectors per FAT: " ; Glsectorsperfat
Print "Number of FATs: " ; Gbnumberoffats
Print "Disksize : " ; Disksize() ' show disk size in bytes
'Print "Disk free: " ; Diskfree()
Print "File Len: " ; Filelen( "TEST2.TXT") ' show free space too
End If
Else
Print "Error during Drive Init: " ; Gbdriveerror
End If


'File erstellen und etwas reinschreiben

'dim some test variables
Dim S As String * 60 , Fl As String * 12 , Ff As Byte
Dim X As Byte
Dim I As Word
Dim Sdatetime As String * 18
Fl = "test.txt"
S = "test this"

'Now we are getting to it
'We can specify a file handle with #1 or #2 etc. or we can ask for a free
' file handle with the FreeFile function. It will return a free handle if there is one.

Ff = Freefile() ' get a file handle

'With this file handle we refer to a file
Open Fl For Output As #ff ' open fikle for output
' we need to open a file before we can use the file commands
' we open it for OUTPUT, INPUT , APPEND or BINARY
' In this case we open it for OUTPUT because we want to write to the file.
' If the file existed, the file would be overwritten.
Print #ff , S ' print some data
Print #ff , S
Print #ff , S
Print #ff , "A constant" ; S
'Testsb Ff
Close #ff

Print "fertig"
End

' If you want to test with File-System Interpreter uncomment next line
'$include "FS_Interpreter.bas"

roboterheld
29.12.2007, 11:18
vergess die umgeschriebene avr-dos auf einem atmega32, kauf dir einen atmega644, ist pinkompatibel zum 32ziger, alten raus neuen rein.
und probier dann das original-dos von bascom aus, funktioniert tadellos.

wassermann
29.12.2007, 14:29
Wenn du AVR-DOS mit dem 32er nutzen willst, gibt's dazu alte Threads zu MMC. Einfach anschauen, probieren ... und wenn's nicht klappt einfach melden.

gruss,
wassermann

PASCALU
31.12.2007, 10:43
Du wirst wohl den Thread meinen oder?
https://www.roboternetz.de/phpBB2/zeigebeitrag.php?t=22500&postdays=0&postorder=asc&highlight=dos&start=44
von dort habe ich ja den Source Code aus meinem letzten Post.
Das Problem ist das zwar die Beispieldokument erstellt wird aber die Variabeln nicht hereingeschrieben werden. Das Dokument bleibt leer.

wassermann
31.12.2007, 15:14
Hi Pascalu,

das einfache print sollte hier ausreichen. Vielleicht scheitert es auch am ordnungsgemäßen Öffnen und Schliessen.
Hier gibts auch noch ein paar Info's. Weiss jetzt nicht, ob der Link ("Datenlogger mit MMC Karte") klappt ... mach sowas zum ersten mal.
https://www.roboternetz.de/phpBB2/zeigebeitrag.php?t=34430&postdays=0&postorder=asc&highlight=wassermann&start=0

Wenn's nicht hilft, einfach nochmal fragen.
Kleiner Tip:
Du hast ganz viele includes, die du nicht alle benötigst.
Beim Initialisieren: benötigst du wirklich alle print?
Ist es dein ganzes Programm? Nur ein Durchlauf?
Wenn doch ein Loop ... nicht immer Öffnen und Schliessen!

gruss,
wassermann