Forum: Mikrocontroller und Digitale Elektronik Probleme mit FAT16


von picprogger (Gast)


Lesenswert?

Hallo,
ich bin gerade dabei mit mit FAT auseinander zu setzen.
Ich wollte nun die ersten 512 byte per USART ausgeben und mit dem 
HexEditor vegleichen, jedoch kommen nur Nullen zur Anzeige.
1
char SDdata[512];
2
Mmc_Read_Sector(0,SDdata);
3
for(i=0,i<512;i++) Usart_Write(SDdata[i]);
Kann mir jemand sagen was ich falsch mache.

PS: arbeite mit Mikroc Compiler for PIC

von holger (Gast)


Lesenswert?

>for(i=0,i<512;i++) Usart_Write(SDdata[i]);

for(i=0; i<512; i++) Usart_Write(SDdata[i]);

von picprogger (Gast)


Lesenswert?

Hallo,

das Komma ist ein versehen das ist nicht das Problem.

Danke

von holger (Gast)


Lesenswert?

>das Komma ist ein versehen das ist nicht das Problem.

Dann ist das auch nicht der Code den du benutzt.
Antworten überflüssig weil der Fehler in Zeile 42 ist.

von picprogger (Gast)


Lesenswert?

Das ist  der richtige Code.
Was willst du mit "Antworten überflüssig weil der Fehler in Zeile 42 
ist."

von Ahem (Gast)


Lesenswert?

Der richtige Code wäre compilierbar. Da der obige Code nicht 
compilierbar ist, ist es nicht der richtige Code.

Beitrag ""Hilfe", "funktioniert nicht", funktioniert nicht."

von picprogger (Gast)


Lesenswert?

Hallo

ich benutze den Mikroc Compiler und da funktioniert der Code.

von Ahem (Gast)


Lesenswert?

>ich benutze den Mikroc Compiler und da funktioniert der Code.
Wie auch immer:

1. Der Code kann so nicht funktionieren, weil er unvollständig ist. Es 
fehlt z.B eine main-funktion oder die Deklaration von i.

2. Die Hinweise unter dem genannten Link werden Dir helfen bessere 
Antworten zu bekommen. Beitrag ""Hilfe", "funktioniert nicht", funktioniert nicht."

von picprogger (Gast)


Lesenswert?

Hallo,
es ist ein Ausschnitt und nicht der ganze Code.
Und sorry das ich dachte das klar ist wie man i deklariert (int), sorry.

Wie kann ich mir den Inhalt von SDdata noch ansehen??

von Ahem (Gast)


Lesenswert?

Es tut mir leid, aber da Du konstant die Hinweise ignorierst, sehe ich 
keinen Grund mehr weiter auf Dich einzugehen.

Insbesondere finde ich:
>Und sorry das ich dachte das klar ist wie man i deklariert (int), sorry.
unsinnig, denn Du fragst ja hier und weisst etwas nicht und gehst 
davon aus, das wir Dein Problem erkennen. Wir können nicht wissen ob Du 
weisst, das man i deklarieren muss. Die beste Art dies zu zeigen, wäre, 
einfach den Code zu posten.

Aber gut, das hat sich ja sowieso erledigt.

von picprogger (Gast)


Lesenswert?

Ja,in Ordnung hast ja recht hätte ich das gleich rein geschrieben dann 
wären wir vieleicht schon weiter.

Aber,
1
char SDdata[512];
2
int i;
3
Mmc_Read_Sector(0,SDdata);
4
for(i=0; i<512; i++) Usart_Write(SDdata[i]);

Das ist der einzig relevante Code.
Mmc_Read_Sector() und Usart_Write(), sind im Compiler schon fertige 
Funktionen.

Kann mir jetzt bitte jemand helfen???

von Ahem (Gast)


Lesenswert?

Du weisst nicht wo der Fehler ist und fragst uns, weisst aber ganz genau 
das der Fehler in dem Codeabschnitt liegt; wir wissen aber auch nicht, 
warum Du das vermutest oder wie wir darauf kommen sollen, das das so 
stimmt.

Lies bitte: Beitrag ""Hilfe", "funktioniert nicht", funktioniert nicht."

von Stefan E. (sternst)


Lesenswert?

picprogger schrieb:

> Das ist der einzig relevante Code.

Nein, ist es nicht, denn an diesem Code kann man nicht sehen, warum du 
nur Nullen bekommst. Nicht zu sehen ist z.B. wie die beteiligten 
Funktionen deklariert sind. Selbst wenn die beiden Funktionen 
einwandfrei funktionieren und von dir auch richtig verwendet werden, 
gibt es noch diverse andere Möglichkeiten wo es haken könnte.
Funktioniert z.B die UART-Übertragung überhaupt?
Funktioniert die Verbindung zur MMC-Karte?
etc ...

> Kann mir jetzt bitte jemand helfen???

Hast du dir überhaupt mal den von Ahem geposteten Link angesehen?
Kurzfassung: mit den mickrigen von dir gelieferten Informationen ist 
keine Fehleranalyse möglich.

von Uwe B. (boerge) Benutzerseite


Lesenswert?

> Was willst du mit "Antworten überflüssig weil der Fehler in Zeile 42
> ist."
>
http://de.wikipedia.org/wiki/42_(Antwort)

wollte ich schon immer mal posten, für alle die, die den Klassiker nicht 
kennen... ;-)

Uwe

von holger (Gast)


Lesenswert?

>Aber,
>
>char SDdata[512];
>int i;
>Mmc_Read_Sector(0,SDdata);
>for(i=0; i<512; i++) Usart_Write(SDdata[i]);
>
>Das ist der einzig relevante Code.
>Mmc_Read_Sector() und Usart_Write(), sind im Compiler schon fertige
>Funktionen.

Also bei meinen SD Programmen wird erst mal ne SD-Init
durchlaufen. Wenn die nicht klappt braucht man gar nicht
erst weiter zu machen. Kommt nur noch Schrott bei raus.
Wo ist deine SD-Init? Kommt dein Programm da durch?

Vieleicht hast du deine Karte ja auch nicht richtig
angeschlossen? Wo ist dein Schaltplan?

Über welchen PIC reden wir eigentlich?

>Kann mir jetzt bitte jemand helfen???

Nö.

Lies bitte: Beitrag ""Hilfe", "funktioniert nicht", funktioniert nicht."

von Bernd R. (Firma: Promaxx.net) (bigwumpus)


Lesenswert?

Hallo picprogger (Gast)


Ich habe hier nur das MikroBasic im Einsatz, aber das ist quasi das 
gleiche.

In der Erklärung der Funktion MMC_READ_SECTOR() wird erklärt, daß die 
MMC vorher initialisiert werden muß (MMC_Init).
Dann ist es eine Funktion, die einen Rückgabewert gibt, den man 
auswerten kann.

In Deinem Code finde ich nichts davon. Ist die Hilfe in Deinem Compiler 
defekt oder willst Du uns hier etwas narren ?

von picprogger (Gast)


Lesenswert?

Also,

ich arbeite mit dem EasyPic5 und passendem SD Interface darauf der PIC 
18F458

Die ferigen Funktionen sind unsigned char deklariert.
dazu gehören Mmc_Init(unsigned short *port, unsigned short 
pin),Mmc_Read_Sector(unsigned long sector, char *buffer), void 
Usart_Write(unsigned short data).
Mein ganzer Code:
1
void Usart_Write_Text(char *ostr){
2
  int i;
3
  i=0;
4
  while(ostr[i]){
5
    Usart_Write(ostr[i++]);
6
  }
7
  Usart_Write(13);
8
  Usart_Write(10);
9
}
10
char SDdata[512];
11
int i;
12
13
void main(){
14
15
Usart_Init(9600);
16
Delay_100ms();
17
18
Usart_Write_Text("Initializing MMC");
19
while(Mmc_Init(&PORTC, 2));
20
  if(!Mmc_Read_Sector(0, SDdata))
21
  {
22
    for(i=0; i<512; i++) Usart_Write(SDdata[i]);
23
  }
24
}

von Ahem (Gast)


Lesenswert?

Naja. Das geht doch schon mal in die richtige Richtung.
Was ist mit den anderen Punkten aus dem Link?

Ist die Karte formatiert? Sind da Dateien drauf?
Wie sieht der Schaltplan aus?
Was hast Du schon probiert? Was waren die Ergebnisse?

Also erstmal könntest Du Deine Kommunikation testen.
Setze das Array auf einen oder mehrere konstante Werte und gib die aus.

Dann könntest Du einfach mal einen anderen Sektor lesen.

Ausserdem könntest Du, mal den Sektor mit 0xA5 oder ähnlichem 
beschreiben und danach auslesen, falls die Daten darauf zerstört werden 
dürfen.

von picprogger (Gast)


Lesenswert?

Hallo,

die Karte(32MB) ist FAT16 formatiert.
Keine Dateien drauf.
Schaltplan gibts nicht da fertig aufgebautes Bord.

Array ausgabe hat hervorragen geklappt.

Wenn ich einen anderen Sektor beschreibe und dann wieder auslese passt 
alles prima.
Nur den MBR, Sektor 0 bekomme ich nicht, aber am Ende steht das der MBR 
zu ende ist also 0x55 0xAA.

von Ahem (Gast)


Lesenswert?

>Wenn ich einen anderen Sektor beschreibe und dann wieder auslese passt
>alles prima.
Na, das sieht doch schon mal nicht schlecht aus. Also geht Deine 
Initialisierung und das Lesen und Schreiben.

>Nur den MBR, Sektor 0 bekomme ich nicht, aber am Ende steht das der MBR
>zu ende ist also 0x55 0xAA.

Das ist bei SD-Karten normal. Da man von ihnen normalerweise nicht 
bootet, enthalten sie keinen Bootloader und oft (wie anscheinend bei 
Dir) nicht mal eine Partitionstabelle. Im Gegenteil kann das 
Vorhandensein der MBR-Kennung (0x55 0xAA) schon als Schmankerl angesehen 
werden.

Suche mal bei Google nach "leerer MBR SD-KArte". Du wirst finden, das da 
jeder Hersteller seine eigenen Ansichten hat und dazu noch je nach Weg 
der Formatierung verschiedenes geschrieben oder eben nicht geschrieben 
wird. Zum Teil sind die Auslassungen auch logisch, da es z.B. unter 
Windows nicht nötig ist eine Partitionstabelle oder einen Bootloader auf 
einer SD-Karte zu haben. Siehe unter: 
http://de.wikipedia.org/wiki/Partitionstabelle und 
http://de.wikipedia.org/wiki/Master_Boot_Record
Andererseits kann man mittels eigenem Bootsektor usw. SD-Karten bootbar 
machen.

Ist das für Dich so ausreichend? Wenn nicht frag einfach weiter. (Da das 
Problem mit dem Lesen ja erledigt ist, am besten in einem neuen Thread).

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Es gibt auch partitionslose und damit auch MBR-lose Formate für 
Wechseldatenträger, das Stichwort ist hier "Superfloppy".

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.