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
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!!!!!!
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
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
Powered by vBulletin® Version 4.2.5 Copyright ©2024 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.