Hallo, ich habe einen ATMEGA2561 mit 256kB Flash. Ich möcht in diesem Flash ein WAV File speichern(ca:220kB). Als erstes wollte ich das in ein BYTE Array[2][110000](16Bit/Sample) im Headerfile legen und gut. Da reichen anscheinen die Adressen nicht. (geht nur bis ca 30000). Dann wollte ich das Array verbreitern (Array[6][30000]). Da gibt dann der Compiler auf. Danach dachte ich 6x Array[30000] aber das mag der Compiler auch nicht. Jetzt dachte ich noch mehrere Headerfiles zu nehmen(für jedes Array eines, oder den Flash so vollschreiben und mit Pointern arbeiten. Hat jemand einen Tip für mich? Bin für jeden Rat dankbar Tobias
> ...das mag der Compiler auch nicht...
Wäre sehr hilfreich, zu wissen, welcher Compiler... So wie das oben
aussieht, versuchst Du, die Daten ins SRAM zu schreiben...
Falls AVR, #include <avr/pgmspace.h> Benutzung hier: http://www.nongnu.org/avr-libc/user-manual/modules.html
Hast Du mal in die Hilfe geschaut? Da steht auch, wie man konstante Daten im Flash ablegt! Suche mal nach dem Schlüsselwort 'flash'!
Genau, sollte. So weit bin ich schon. Das geht auch im kleinen Rahmen (ca 30000). Ich tippe sogar dass es genau bis 32768 (2^15) geht. Dann kann man in der Hilfe lesen, dass Arrays auf eine Dimension limitiert sind. Hat es denn von euch schon mal jemand mit größeren Datenmengen hinbekommen? Ich überlege schon auf den WINAVR Gcc Compiler und AVR Studio zu wechseln.
Also man kann Variablen im Flash über "const" oder "flash" speichern. const int sample[]={....}; Wenn man dies tut, muss man den Variablen schon beim Deklarieren Werte zuweisen. So entsteht dann eine sehr lange Zeile. Ich glaube, dass der Compiler da irgendwann aufgibt.
memory model auf medium gestellt (small geht nicht, da nur mit 16bit-Adressen gearbeitet wird)?
Memory model ist auf small gestell, aber in der Drop down liste kann man beim Mega2561 auch nur small auswählen. Habs auch schon mit mehreren Feldern a 30000 Werte probiert und dann bringt er immer die Fehlermeldung: missing '}' obwohl alles passt. Lösche ich dann einige Werte aus den geschweiften Klammer dann gehts irgendwann wieder.
Des Rätsels Lösung: Ich hab mir eine neuere Version des CodeVisions C Compiler besorgt. 1.25.1 Pro. Da war das Problem aber noch das selbe. Also habe ich bei der Initialisierung nicht den Hex-Wert (0x23) sonder den Int-Wert angegeben. Das spart mir mindestens drei zeichen. const BYTE Sound[]={2,5,6,4,12,...}. Ich habe also zwei Arrays a ca. 102000 BYTE angelegt. Jetzt geht das so. Eigenartige Sache...
Kenn jetzt den Compiler nicht, aber evtl einfach ein .asm file mit lauter .db xx Anweisungen generieren, und das dazulinken lassen? Der Assembler sollte dann keine Probleme mit zu langen Initialisierungslisten haben. /Ernst
@Ernst Bin in Assembler nicht so fit. Das muss ich mir erst mal anschauen. Das versteh ich auf anhieb gar nicht, aber trotzdem Danke für den Tip. Werds mir mal anschauen. Und auch an die Anderen: vielen Dank für die Anregungen
Müsste im Prinzip recht einfach gehen: im C file: extern const char sample[]; im ASM File: _sample: .db 0x01, 0x02, 0x03, 0x04 .db 0x05 ... usw. für (16Bit-) Int arrays halt mit ".dw". Wenns beim Zusammenlinken eine Fehlermeldung wg. unaufgelösten Symbolen gibt, muss das Label im ASM-File evtl. anders heissen. /Ernst
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.