SD Kartenzugriff Atmega32

Gast #2614416
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)
Gast #2614440
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.
Gast #2614463
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.
Gast #2614465
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.
Gast #2614490
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?
Gast #2614617
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?
Gast #2614630
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
Gast #2614633
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.
Gast #2614648
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren