Atmega168 SD-Karte stack overflow

Gast #1256941
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
Gast #1256960
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.
Gast #1256969
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 ????

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 17 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.