Forum: Mikrocontroller und Digitale Elektronik Daten im Flash Speichern


von Tobias (Gast)


Lesenswert?

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

von johnny.m (Gast)


Lesenswert?

> ...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...

von Freitag (Gast)


Lesenswert?

Falls AVR,

#include <avr/pgmspace.h>

Benutzung hier:

http://www.nongnu.org/avr-libc/user-manual/modules.html

von Tobias (Gast)


Lesenswert?

Hallo,

ich arbeite mit Codevision AVR 1.24.6 Professionel

von johnny.m (Gast)


Lesenswert?

Hast Du mal in die Hilfe geschaut? Da steht auch, wie man konstante
Daten im Flash ablegt! Suche mal nach dem Schlüsselwort 'flash'!

von crazy horse (Gast)


Lesenswert?

flash unsigned char sample[2][110000];
sollte gehen.

von Tobias (Gast)


Lesenswert?

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.

von Tobias (Gast)


Lesenswert?

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.

von crazy horse (Gast)


Lesenswert?

memory model auf medium gestellt (small geht nicht, da nur mit
16bit-Adressen gearbeitet wird)?

von Tobias (Gast)


Lesenswert?

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.

von Tobias (Gast)


Lesenswert?

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...

von Εrnst B. (ernst)


Lesenswert?

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

von Tobias (Gast)


Lesenswert?

@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

von Εrnst B. (ernst)


Lesenswert?

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
Noch kein Account? Hier anmelden.