Majuz
11.06.2009, 12:11
Hallo zusammen,
Ich schreibe momentan ein Programm mit dem ich eine SD-Karte mit einem Mega32 auslese. Das ganze mache ich OHNE dateisystem. Ich lege in Windows auf einer mit FAT16 Formatierten SD-Karte eine Textdatei an die folgenden Inhalt hat: "<START>Datenbereich<ENDE>". Mit dem µC lese ich dann immer einen Sektor (512Bytes) in einen String ein und durchsuche den anschließend nach meinem Startstring. In meinem Fall "<START>". Anschließend suche ich nach dem Endstring; in meinem Falll "<ENDE>".
Dann kann ich genau sagen, wo die Daten auf der SD-Karte liegen.
Das ganze funktioniert bisher FAST einwandfrei. "<START>" findet er immer in Sektor 771 an Stelle 1. Solange "<ENDE>" vor 254 ist funktioniert es auch, aber sobald das Ende nach 254 ist fehlt ihm 255 :-( Aus Stelle 400 wird dann also z.b. 145. Die Variable ist vom Word-typ, aber er speichert wohl nur das untere byte ab :-(
Hier mal mein Quellcode (Falls wer verbesserungen weiß, immer her damit!):
$regfile = "m32def.dat"
$crystal = 16000000
$lib "mmc.lib"
Config Lcdpin = Pin , Db4 = Portc.5 , Db5 = Portc.4 , Db6 = Portc.3 , Db7 = Portc.2 , E = Portc.7 , Rs = Portc.6
Config Lcd = 16 * 4
$include "config_mmc.bas"
Dim Berror As Byte
Dim Abuffer As String * 512 ' Hold Sector to and from CF-Card
Dim Wsrampointer As Word ' Address-Pointer for write
Dim Lsectornumber As Long ' Sector Number
Dim Ende As Byte
Dim S_position As Word
Dim E_position As Word
Dim S_sektor As Long
Dim E_sektor As Long
Dim Datenmenge As Word
Dim Temp As Word
Ende = 0
Lsectornumber = 0
Cls
If Gbdriveerror = 0 Then
Cls
Do
Wsrampointer = Varptr(abuffer)
Berror = Drivereadsector(wsrampointer , Lsectornumber)
If S_position = 0 Then
S_position = Instr(1 , Abuffer , "<START>")
S_sektor = Lsectornumber
End If
If S_position <> 0 Then
E_position = Instr(1 , Abuffer , "<ENDE>")
If E_position <> 0 Then
E_sektor = Lsectornumber
Ende = 1
End If
End If
Incr Lsectornumber
Loop Until Ende = 1
Else
Lcd "Fehler :-("
End If
If S_sektor = E_sektor Then
Datenmenge = S_position + 7
Datenmenge = E_position - Datenmenge
Else
Datenmenge = S_position + 6
Datenmenge = 512 - Datenmenge
Temp = E_sektor - S_sektor
Temp = Temp - 1
Temp = Temp * 512
Datenmenge = Datenmenge + Temp
Datenmenge = Datenmenge + E_position
Datenmenge = Datenmenge - 1
End If
If Gbdriveerror = 0 Then
Cls
Lcd S_sektor ; ":" ; S_position ; "-" ; E_sektor ; ":" ; E_position
Locate 2 , 1
Lcd "Menge: " ; Datenmenge ; " Bytes"
End If
End 'end program
Falls das wirklich nur bis 254 geht muss ich wohl selbst was stricken. Dann lese ich es in ein Array anstatt einen String ein und muss mir dann selbst eine Suchfunktion basteln. Falls dafür jemand einen Tipp hat wäre ich sehr verbunden! :-)
Gruß
Marius
Ich schreibe momentan ein Programm mit dem ich eine SD-Karte mit einem Mega32 auslese. Das ganze mache ich OHNE dateisystem. Ich lege in Windows auf einer mit FAT16 Formatierten SD-Karte eine Textdatei an die folgenden Inhalt hat: "<START>Datenbereich<ENDE>". Mit dem µC lese ich dann immer einen Sektor (512Bytes) in einen String ein und durchsuche den anschließend nach meinem Startstring. In meinem Fall "<START>". Anschließend suche ich nach dem Endstring; in meinem Falll "<ENDE>".
Dann kann ich genau sagen, wo die Daten auf der SD-Karte liegen.
Das ganze funktioniert bisher FAST einwandfrei. "<START>" findet er immer in Sektor 771 an Stelle 1. Solange "<ENDE>" vor 254 ist funktioniert es auch, aber sobald das Ende nach 254 ist fehlt ihm 255 :-( Aus Stelle 400 wird dann also z.b. 145. Die Variable ist vom Word-typ, aber er speichert wohl nur das untere byte ab :-(
Hier mal mein Quellcode (Falls wer verbesserungen weiß, immer her damit!):
$regfile = "m32def.dat"
$crystal = 16000000
$lib "mmc.lib"
Config Lcdpin = Pin , Db4 = Portc.5 , Db5 = Portc.4 , Db6 = Portc.3 , Db7 = Portc.2 , E = Portc.7 , Rs = Portc.6
Config Lcd = 16 * 4
$include "config_mmc.bas"
Dim Berror As Byte
Dim Abuffer As String * 512 ' Hold Sector to and from CF-Card
Dim Wsrampointer As Word ' Address-Pointer for write
Dim Lsectornumber As Long ' Sector Number
Dim Ende As Byte
Dim S_position As Word
Dim E_position As Word
Dim S_sektor As Long
Dim E_sektor As Long
Dim Datenmenge As Word
Dim Temp As Word
Ende = 0
Lsectornumber = 0
Cls
If Gbdriveerror = 0 Then
Cls
Do
Wsrampointer = Varptr(abuffer)
Berror = Drivereadsector(wsrampointer , Lsectornumber)
If S_position = 0 Then
S_position = Instr(1 , Abuffer , "<START>")
S_sektor = Lsectornumber
End If
If S_position <> 0 Then
E_position = Instr(1 , Abuffer , "<ENDE>")
If E_position <> 0 Then
E_sektor = Lsectornumber
Ende = 1
End If
End If
Incr Lsectornumber
Loop Until Ende = 1
Else
Lcd "Fehler :-("
End If
If S_sektor = E_sektor Then
Datenmenge = S_position + 7
Datenmenge = E_position - Datenmenge
Else
Datenmenge = S_position + 6
Datenmenge = 512 - Datenmenge
Temp = E_sektor - S_sektor
Temp = Temp - 1
Temp = Temp * 512
Datenmenge = Datenmenge + Temp
Datenmenge = Datenmenge + E_position
Datenmenge = Datenmenge - 1
End If
If Gbdriveerror = 0 Then
Cls
Lcd S_sektor ; ":" ; S_position ; "-" ; E_sektor ; ":" ; E_position
Locate 2 , 1
Lcd "Menge: " ; Datenmenge ; " Bytes"
End If
End 'end program
Falls das wirklich nur bis 254 geht muss ich wohl selbst was stricken. Dann lese ich es in ein Array anstatt einen String ein und muss mir dann selbst eine Suchfunktion basteln. Falls dafür jemand einen Tipp hat wäre ich sehr verbunden! :-)
Gruß
Marius