SD Kartenzugriff Atmega32

Gast #2614416
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
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
>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
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
"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
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
Gast
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
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
>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
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

Eine eigene Frage? Dieser Thread ist über 14 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.