Forum: Mikrocontroller und Digitale Elektronik SD Kartenzugriff Atmega32


von Lukas K. (Gast)


Lesenswert?

Hallo Leute,
und zwar habe ich folgendes Problem / bzw. Denkfehler.

Ich hab eine Datei auf die SD Karte gepackt namens 0.

Diese Datei fängt an mit dem Inhalt:
1111111101000000

Nun möchte ich mit hilfe von Holger Klabuntes SD libarys von der 
SD-Karte lesen.
1
  switch(GetDriveInformation()) 
2
  {
3
    case 1:  //ALL is Working
4
      SDstatus=F_OK;
5
      break;
6
    case 2: 
7
      imageL[0][1][0]=0; //FAT-Type nicht erkannt
8
      break;
9
    case 3:
10
      imageL[0][2][0]=0; //CF gives no answer
11
      break;
12
    case 4:
13
      imageL[0][3][0]=0; // no response from card  return CMD0_TIMEOUT;
14
      break;
15
    default:
16
      imageL[0][8][0]=0; //other errors
17
  }
18
19
  if(SDstatus==F_OK)
20
  {
21
22
        unsigned char buffer[2];
23
          unsigned int readbytes;
24
25
    switch(Fopen("0", F_READ)) //Datei Öffnen
26
    {
27
      case F_OK:   //Öffnen erfolgreich
28
              readbytes=Fread(buffer,2);     // Achte auf das & vor by !
29
        imageR[0][0][0]=readbytes; //Anzahl von Bytes
30
        break;
31
      case F_ERROR:
32
        imageR[0][1][0]=0; //Datei kann nicht geöffnet werden
33
        break;
34
    }
35
36
bufnr=1;
37
    if(buffer[bufnr]&0b00000001)
38
      imageR[0][0][1]=0; 
39
    if(buffer[bufnr]&0b00000010)
40
      imageR[0][1][1]=0; 
41
    if(buffer[bufnr]&0b00000100)
42
      imageR[0][2][1]=0;     
43
    if(buffer[bufnr]&0b00001000)
44
      imageR[0][3][1]=0;   
45
    if(buffer[bufnr]&0b00010000)
46
      imageR[0][4][1]=0;               
47
    if(buffer[bufnr]&0b00100000)
48
      imageR[0][5][1]=0; 
49
    if(buffer[bufnr]&0b01000000)
50
      imageR[0][6][1]=0; 
51
    if(buffer[bufnr]&0b10000000)
52
      imageR[0][7][1]=7;

Allerdings liefert mir die Datei als Ausgabe für
buffer[0] den wert 0b0010000 und für
buffer[1] den wert 0b0100100

buffer[0] sollte meienr überlegung nach 0b11111111
und buffer[1] 0b01000000 auswerfen.

Habe ich irgentwo einen Denkfehler, beim lesen oder schreiben der Daten 
in die Datei?
PS. imageR ist für mich nur eine Ausgabe auf RGB Leds (kein display 
vorhanden)

von holger (Gast)


Lesenswert?

>Diese Datei fängt an mit dem Inhalt:
>1111111101000000

Häng die Datei mal als Anhang an.

von Lukas K. (Gast)


Angehängte Dateien:
  • 0 (32,4 KB)

Lesenswert?

Done ;).

von Lukas K. (Gast)


Lesenswert?

sry falsche Datei, moment bitte ;).

von Lukas K. (Gast)


Angehängte Dateien:
  • 0 (4,04 KB)

Lesenswert?

So, jetzt ist die Richtige Datei im Anhang.

von holger (Gast)


Lesenswert?

In den ersten zwei Bytes steht 0xFF 0xFE
also 11111111 11111110.

Gib die doch mal auf einem Port aus.
Oder mach irgendeine Ausgabe wie

if(buffer[0] != 0xFF) FehlerAnzeigen();
if(buffer[1] != 0xFE) FehlerAnzeigen();

Ich glaub das da was mit deiner merkwürdigen
Umrechnung nicht stimmt.

von holger (Gast)


Lesenswert?

>In den ersten zwei Bytes steht 0xFF 0xFE

Ach shit, zu spät;)

In den ersten zwei Bytes steht 0xEF 0xBB
also 11101111 10111011.

Ansonsten siehe oben.

von Lukas K. (Gast)


Lesenswert?

Stimmt da hast du recht, aber wie kann ich dann auf den Inhalt 
zugreifen?

von holger (Gast)


Lesenswert?

>Stimmt da hast du recht, aber wie kann ich dann auf den Inhalt
>zugreifen?

Du hast am anfang drei Bytes die wohl nicht brauchst.
Da musst du erst mal drüber weglesen. Also lesen
und wegwerfen oder was auch immer. Dann kommen deine
'1'er und '0'er im ASCII Code. Die erste 0x31 ist eine 1
und ein 0x30 ist eine 0.

von Lukas K. (Gast)


Lesenswert?

Also eigentlich sehr Umständlich, danke für den Tipp mit den 1. 3 Bytes.

Gibt es ein sinnvolleres Format meine 8Bit Daten in die Datei zu 
schreiben?

Asci Code ist ja nicht gerade die einfachste und schnellste Methode.

von Lukas K. (Gast)


Lesenswert?

"Dann kommen deine
'1'er und '0'er im ASCII Code. Die erste 0x31 ist eine 1
und ein 0x30 ist eine 0."

Heißt dass ich müsste pro Bit 4 bytes lesen?

Dann wär ja das einzig Sinvolle zb meine 1111 in Asci zeichen wie 
Leerzeichen zu verwandeln. Gibts da noch eine einfachere Variante?

von Lukas K. (Gast)


Lesenswert?

Gibt es ein Programm mit dem man sich den ASCII code einer Datei (bzw. 
dass was später ausgelesen wird) anzeigen lässt?

von Lukas K. (Gast)


Lesenswert?

Das Format ist mir mittlerweile klar und ich werd einfach meine Daten in 
Ascii zeichen codieren. (Ein Programm zum anssehen wär Praktisch).

von Tommi (Gast)


Lesenswert?

%windir%\system32\notepad.exe

von Lukas K. (Gast)


Lesenswert?

Ja schon klar, würd aber gerne die einzelnen Bytes der datei sehen.

Ich versteh so einiges noch nicht.

Wenn ich
 in die datei schreibe kommt 0x42 statt 0x7F raus
~ kommt 0x59 raus statt 0x7E

von Lukas K. (Gast)


Lesenswert?

Problem gelöst, hab immer erst ab dem 4. Byte zu lesen angefangen und 
nicht beim 1. (Dachte die ersten 3 Bytes sind immer Müll).

von Lukas K. (Gast)


Lesenswert?

Kurze Verständnisfrage:

Ich führe Fread aus und lese 2 bytes.

Wenn ich danach Fread nochmal ausführe werden die 2 nächstes Bytes 
gelesen, korrekt?

Falls nicht gibt es eine Möglichkeit Fread zu sagen, welche bytes es 
lesen soll?

von eine Dose Bohnen (Gast)


Lesenswert?

Lukas K. schrieb:
> Kurze Verständnisfrage:
>
> Ich führe Fread aus und lese 2 bytes.
>
> Wenn ich danach Fread nochmal ausführe werden die 2 nächstes Bytes
> gelesen, korrekt?
ja
>
> Falls nicht gibt es eine Möglichkeit Fread zu sagen, welche bytes es
> lesen soll?
fseek

von holger (Gast)


Lesenswert?

>Kurze Verständnisfrage:
>
>Ich führe Fread aus und lese 2 bytes.
>
>Wenn ich danach Fread nochmal ausführe werden die 2 nächstes Bytes
>gelesen, korrekt?

Ja.

>Falls nicht gibt es eine Möglichkeit Fread zu sagen, welche bytes es
>lesen soll?

Falls nicht kommt hier ja nicht vor, aber du kannst mit z.B.
Fseek(3, SEEK_SET); vor einem Fread() den Positionszeiger auf Byte
drei (oder auf ein beliebiges Byte) der Datei stellen.

von holger (Gast)


Lesenswert?

Nachtrag:

>Falls nicht kommt hier ja nicht vor, aber du kannst mit z.B.
>Fseek(3, SEEK_SET); vor einem Fread() den Positionszeiger auf Byte
>drei (oder auf ein beliebiges Byte) der Datei stellen.

Die Datei beginnt natürlich bei Byte 0.
Fseek(3, SEEK_SET); setzt die Datei auf das vierte Byte.

von Lukas K. (Gast)


Lesenswert?

Also bei alle Dateien die ich danach erstellt habe hat es beim 1. Byte 
begonnen. Somit kein Problem.

Vielen dank für eure Hilfe!

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.