Hallo,
ich befürchte beim Problem ist banal, jedoch habe ich seit Stunden keine
Antwort.
Ich versuche ganz simple ein UART bedingt auf eine SD Karte zu loggen,
jetzt habe ich endlich eine Lib gefunden die sich auf Anhieb für meinen
AtMega168 compilieren lässt, jedoch ist sie zu groß, ob wohl sie laut
Autor für einen 168er gemacht wurde. Ich habe schon FAT32 in der config
auf 0 gesetzt, trotzdem hab ich immernoch:
Benutzt Du AVR-Studio?
Dann Project --> Configuration Options --> General --> Optimization auf
-Os
Ich hab hier grad bestimmt nicht die aktuelle Lib von ihm, wenn ich aber
mal in ein altes Beispielprojekt schaue, dann heißt es da:
1
Program: 16718 bytes
2
(.text + .data + .bootloader)
3
4
Data: 842 bytes
5
(.data + .bss + .noinit)
Das war dann allerdings mit kompletter Shell über UART.
Ich weiß von damals wo ich die Lib benutzte, dass dieses Beispiel auf
einen ATMEGA16 gepasst hatte (hart am Anschlag).
Eine Ergänzung und es gab seltsame Phänomene (Stack/Heap - Overflow).
Deshalb bin ich kurzerhand auf ein ATMEGA644 umgestiegen.
Bei dem sind das dann lediglich 25 %.
Grüße
HA! Danke. Als "Neueinsteiger" kannte ich diese Option garnicht. Ich
sehe gerade vor meinem inneren Auge die Zeit die ich mit Optimierung per
Hand wegen ein paar Bytes gemacht habe... Grr ;-)
Danke vielmals, schönen Abend noch. =)
führen bei mir zu einem Problem, heißt "!dd" ist true, und ich bekomme
den error();
Ich weis aber das die Hardware funktioniert, da ich schon mit anderem
Code auf die SD Karte geschrieben habe.
Jemand eine Idee?
>Ich versuche ganz simple ein UART bedingt auf eine SD Karte zu loggen,
Viel Spass damit wenn die Karte mal eine kleine
Pause von 100-500ms wegen Wear Levelling einlegt.
Dein Atmega168 ist mit 1kB RAM viel zu klein um
das gebacken zu kriegen. Selbst bei nur 9600 Baud
wirst du da Ärger kriegen.
graul schrieb:> Aber es gibt so viele GPS Logger etc die mit einem AtMega8 oder 168> arbeiten...
Wie gesagt, auf nen Atmega16 passt es drauf.
Aber arg viel mehr geht dann nicht mehr.
Ich hatte das mal auf nem 16ner, 1-2 Zeilen mehr und es gab ein
Overflow...
graul schrieb:> Das heißt ich brauch eine andere Lib?
Die Frage ist, ob Du eine kleinere findest!?
Oder einfacher wäre es einen anderen Controller zu nehmen.
Da ich mir irgendwie nicht vorstellen kann, dass es garnicht geht, habe
ich weitergemacht.
Initialisieren geht einwandfrei (lang erst natürlich an der SD
Karte...), auslesen des root Dirs geht auch. ("ls").
Nur am Schreiben haperts.
Stimmt es, wenn ich es so mache?
1
charname[8]="hallo-du";
2
3
structfat_dir_entry_structfile_entry;
4
uint8_treturns;
5
returns=fat_create_file(dd,name,&file_entry);
6
uart_putc(48+returns);
Leider kommt da immer "0" zurück ("0 on failure, 1 on success, 2 if the
file already existed.")
Muss ich den Namen noch mit \0 abschließen oder der gleichen? Ich habs
auch schon versucht, aber ich bekomm keine Datei oder ein Ordner
erstellt.
Danke,
Gruß
PS: Kein Write-Lock drin ;-)
Sieht eigentlich nicht schlecht aus.
Mach mal ein sd_raw_sync(); (musst Du immer machen vor dem Auswurf der
Karte)
--> Evtl. ist die Datei bereits vorhanden?
Kriterien für einen Abbruch mit "0" sind eigentlich nur die 3:
if(strcmp(file, dir_entry->long_name) == 0) //Datei existiert bereits
4
...
5
if(!(dir_entry->entry_offset = fat_find_offset_for_dir_entry(fs, parent, dir_entry))) // Fehler beim finden eine Directory Entry
6
...
7
if(!fat_write_dir_entry(fs, dir_entry)) //Schreiben eines Directory Entry
8
...
Kannst Du debuggen?
Dann mach mal ein Breakpoint in der fat.c bei den 3 return 0;
Alternativ kannst Du Dir ja den Fehler auch über UART ausgeben lassen.
Also ich habs mit anderen Code versucht, der wesentlich mehr Speicher
verbraucht (~90%/~90%) und es geht einwandfrei.
Die UART Daten werden ohne Probleme auf der SD Karte gespeichert.