PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : AVR an SD (libfat?)



Wsk8
05.09.2009, 00:09
Versuche jetzt schon seit einiger zeit eine SD am avr zum laufen zu bringen, leider klappt das überhaupt nicht. Könnte mir jemand einen schaltplan und ein beispiel (C/C++) schicken wie es bei ihm funktioniert?? Und weis jemand wie man libfat (devktitpro) in das projekt einbindet um die lib zu nutzen?? Mein compiler meckert bis jetzt nur.

Bin über jede hilfe dankbar!

mfg

Ceos
05.09.2009, 09:20
http://www.ulrichradig.de/home/index.php/avr/mmc-sd

für die beschaltung und

http://de.wikipedia.org/wiki/FAT16#FAT16

fürs dateisystem

die befehle fürs ansteuern der karte selber hab cih aufm arbeitsrechner liegen und hier finde ich gerade die seite nciht mehr

EDIT: gefunden ^^

http://www.maxim-ic.com/appnotes.cfm/an_pk/3969

ich hab mich bis zum verzeichnis durchgearbeitet ... hänge im moment daran LFN-verzeichniseinträge über mehrere sektorgrenzen hin EFFEKTIV auszulesen

Wsk8
05.09.2009, 12:28
Die beschaltung und die befehle sind nicht schlecht, aber mit der lib geht es bei mir nicht, die MBR signatur oder so wird nicht gefunden, und das bei jeder karte die ich verwende(vom PC werden sie einwandfrei erkannt).
Und teils kann ich gar keine verbindung zur karte herstellen.

mfg

Ceos
05.09.2009, 13:31
dann ist entweder n wurm in der lib, oder etwas stimmt an deiner beschaltung nicht .... leiderleider hab ich mein programm auf arbeit gelassen ... sonst würd ich es gern mit dir teilen

Wsk8
15.09.2009, 21:23
Habe jetzt die komplette schaltung auf 3,3V umgelegt und jetzt geht es.

nur noch ne kleine Frage:
Und zwar muss ich den dateinamen so angeben:


char datei[12]="Test txt";

und dann diese funktion aufrufen:


fat_str(datei);

Quelltext zu fat_str:


char * fat_str(char *str){

unsigned char i;
unsigned char j = 0;
unsigned char c;
char tmp[12]; // tmp string zum einfacheren umwandeln

strcpy(tmp,str);

for(i = 0;i < 11;i++) str[i]=' '; // als vorbereitung alles mit leerzeichen füllen
str[11]='\0';

i=0;

do{
c=toupper(tmp[j]);
if(c=='\0')return str;
if(c!='.')str[i]=c;
else i=7;
i++;
j++;
}while(i<12);

return str;

}


Ich würde das aber gern in der Form "Test.txt" schreiben, und ordner in "Ordner/Test.txt" usw. Weiß jemand wie das geht??

Ach ja, wie funktioniert SoftPWM? OC1 und 2 werden ja durch die karte schon belegt.

mfg

Ceos
16.09.2009, 10:40
du müsstest theoretisch nur eine schleife schreiben, die bis zum '.' oder zum 8ten zeichen deines übergebenen String (hier "Test.txt") durchzählt

DANN

prüfen ob denn ÜBERHAUPT ein punkt da ist (bei verzeichnissen gilt die 8_3 regel nicht) ... ist kein punkt da, bis zum 11ten zeichen ab der 8ten position weiterkopieren oder mit leerzeichen auffüllen (wenn am ende des strings eine 0 '\0') steht (achtung, den eingabestring nicht weiter absuchen, alles was danach kommt iss nur müll)

ist ein punkt da, die ersten 8 bytes mit leerzeichen auffüllen, wenn noch nicht 8 zeichen eingelesen wurden, ODER wenn 8 zeichen da sind, die 3 zeichen HINTER dem punkt an die position 8 9 und 10 schreiben ...

abschliessend die 0 an position 11 nicht vergessen (die positionen fangen bei 0 an, desweghen 0-11 = 12 zeichen

versuch das in einen übersetzbaren code umzusetzen dann haste deine methode TXTtoFilename(char* Str, char &Name[12]); (geht das so überhaupt? naja ist nur der deutlichkeit wegen)

Wsk8
16.09.2009, 12:28
Also müsste ich über eine stringfunktion(mir fällt die bezeichnung grad nicht ein...) alles bis zum punkt lesen und das in das array schreiben und den rest mit leerzeichen auffüllen, dann die 3 zeichen nach den punkt in 8, 9, 10 schreiben und ne 0 bei 11?

mfg