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!):
Code:
$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