Forum: Mikrocontroller und Digitale Elektronik Atmega168 SD-Karte stack overflow


von Benjamin (Gast)


Lesenswert?

Hallo Leute,
wir haben erfolgreich eine SD-Karte an unseren Atmega168 angeschlossen 
und bekommen positive Rückmeldung (CMD0 und CMD1 antworten richtig). 
Jetzt wollten wir eine 128MB SD-Karte auslesen, die sich unter Windows 
(laut Software) nur minimal mit einer Cluster Größe von 4096Byte FAT16 
formatieren ließ.

Im Beispielprogramm von Ulrich Radig kann man diese Block Size 
einstellen und das haben wir auch getan. Nun haben wir gemerkt, dass die 
4096 Byte, die beim lesen des MBR beim Initialisieren viel zu groß für 
unseren Speicher des Atmega168 sind. Als Konsequenz davon hatten wir 
einen ständigen StackOverflow der den Chip resettet hat.
Aber größere Chips wie der Atmega644 haben ja auch nur 4KB SRAM!?!?!?

Nun ist die Frage - wie schafft man es, eine größere SD-Karte (deren 
Cluster Size ja anscheinend mit der Kapazität wächst) von einem Atmega 
auslesen zu lassen, der nur so wenig RAM hat ? (Oder überseh ich da was 
? )

Vielen Dank für die Antwort.
Gruß
Benjamin

von holger (Gast)


Lesenswert?

Der Trick ist das man nur einen Sektor (512 Byte) liest.
Der Cluster wird dann einen Sektor nach dem anderen
stückchenweise gelesen.

von Benjamin (Gast)


Lesenswert?

Soweit ich das im Code von Ullrich Radig sehe, hat er das aber nicht so 
implementiert, richtig ?

Sollte ich jetzt eine andere Fat Library benutzen ? Wenn wir die Karte 
mit 4096 Cluster Size mit ner Clustersize von 512 versuchen zu lesen, 
bekommt er den MBR nicht richtig.

von Benjamin (Gast)


Lesenswert?

NACHTRAG:

Hier unser Code zum Initialisieren:

//###################################################################### 
######
//Auslesen Cluster Size der MMC/SD Karte und Speichern der größe ins 
EEprom
//Auslesen Cluster Offset der MMC/SD Karte und Speichern der größe ins 
EEprom
void fat_init (void)
//###################################################################### 
######
{
  struct BootSec *bootp; //Zeiger auf Bootsektor Struktur

  unsigned char Buffer[BlockSize];

  //volume_boot_record_addr = fat_addr (Buffer);
     mmc_read_sector (MASTER_BOOT_RECORD,Buffer); //Read Master Boot 
Record

    if (Buffer[510] == 0x55 && Buffer[511] == 0xAA)
    {
       message("MBR Signatur found!", 3000);
    }
    else
    {
       message("MBR Signatur not found!", 3000);
       while(1);
    }

    volume_boot_record_addr = Buffer[VBR_ADDR] + (Buffer[VBR_ADDR+1] << 
8);

  mmc_read_sector (volume_boot_record_addr,Buffer);
    if (Buffer[510] == 0x55 && Buffer[511] == 0xAA)
    {
  stdmsg("VBR Signatur found!");
    }

     else
     {
        stdmsg("VBR Signatur not found!");
        volume_boot_record_addr = MASTER_BOOT_RECORD;//<- added by 
Hennie
        mmc_read_sector (MASTER_BOOT_RECORD,Buffer); //Read Master Boot 
Record
     }
    bootp=(struct BootSec *)Buffer;

  cluster_size = bootp->BPB_SecPerClus;
  fat_offset = bootp->BPB_RsvdSecCnt;
  cluster_offset = ((bootp->BPB_BytesPerSec * 32)/BlockSize);
  cluster_offset += fat_root_dir_addr(Buffer);
}



Das lustige ist nun, wenn ich BlockSize auf 4096 setze, erkennt er den 
MBR und den VBR. Wenn es auf 512 gesetzt ist, scheint er schon vor der 
"MBR Initialized" Nachricht zu crashen. Es kommt keine weitere Ausgabe.
Wie kann das sein ????

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.