mikrocontroller.net

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


Autor: Benjamin (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: holger (Gast)
Datum:

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

Autor: Benjamin (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Benjamin (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 ????

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.