www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Daten im Flash Speichern


Autor: Tobias (Gast)
Datum:

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

Autor: johnny.m (Gast)
Datum:

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

Autor: Freitag (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Falls AVR,

#include <avr/pgmspace.h>

Benutzung hier:

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

Autor: Tobias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich arbeite mit Codevision AVR 1.24.6 Professionel

Autor: johnny.m (Gast)
Datum:

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

Autor: crazy horse (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
flash unsigned char sample[2][110000];
sollte gehen.

Autor: Tobias (Gast)
Datum:

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

Autor: Tobias (Gast)
Datum:

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

Autor: crazy horse (Gast)
Datum:

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

Autor: Tobias (Gast)
Datum:

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

Autor: Tobias (Gast)
Datum:

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

Autor: Εrnst B✶ (ernst)
Datum:

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

Autor: Tobias (Gast)
Datum:

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

Autor: Εrnst B✶ (ernst)
Datum:

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

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.