Forum: Mikrocontroller und Digitale Elektronik 25KB Array anlegen


von Matthias L. (mcl024)


Lesenswert?

Hallo Zusammen,

wie kann ich bei einem ATXmega128A1 folgendes Array in den internen SRAM 
legen und darauf zugreifen?

unsigned char array[24576];

Vielen Dank.

von Uwe Bonnes (Gast)


Lesenswert?

Mit 8 kiB internen SRam kann man kein solches Array machen!

von Peter II (Gast)


Lesenswert?

überhaupt nicht, weil diese daten nicht in 8kb reinpassen.

von Cyblord -. (cyblord)


Lesenswert?

Kann so eine Frage ernst gemeint sein? Wie soll man 25KB in 8KB 
unterbringen?

von Matthias L. (mcl024)


Lesenswert?

OK Sorry, da war ich ein bisschen ungeduldig, dass hätte ich auch noch 
selber herrausfinden können.

Wenn das Array nun max. 8KB groß ist, wie funktioniert das dann?

von Uwe Bonnes (Gast)


Lesenswert?

Da die CPU auch Platz im SRAM fuer den STACK braucht, muss dass Array 
deutlich kleiner als das SRAM werden...

Im Program einfach
unsigned char array[<size>]
schreiben...

von Oh man (Gast)


Lesenswert?

So hat ers ja oben auch schon geschrieben.

Wie genau meinst du denn deine Frage überhaupt genau?

Wofür brauchst du denn so ein großes Array??

von Konrad (Gast)


Lesenswert?

Lasst die Anfänger (z. B mich) doch bitte wissen, was size in diesem 
Kontext bewirkt/bedeutet. Man kennt "size of", aber nur size?

von Konrad (Gast)


Lesenswert?

Achso, <size> soll nur ein Platzhalter sein, und nun dacht ich schon, 
dass wär der Trick für die maximale Größe, ohne das man was rechnen 
muss.

von Uwe Bonnes (Gast)


Lesenswert?

Die maximale moegliche Groesse laesst sich nur schwer, wenn ueberhaupt 
berechen. Interrupts und Funktionsaufrufe brauchen Platz auf dem Stack, 
und wenn rekursive Aufrufe vorkommen, haengt die noetige  Stackgroesse 
auch noch von den Daten ab.

von Matthias L. (mcl024)


Lesenswert?

Erstmal vielen Dank für die Antworten.

Ich möchte ein Bild auf einem Display darstellen und es dazu in SRAM 
speichern. Ich habe jetz auch verstanden das, dass mit dem internen 
nicht funktioniert.
Ich nutze das AVR X-Plained Board und möchte nun das externe SDRAM 
nutzen und nutze dazu die AVR1312 von Atmel. Nur leider bekomme ich 
einen haufen an Fehlermeldungen, da einige Sachen nicht definiert sind, 
wie zum Beispiel EBI_CS_ASPACE_t
Wo bekomme ich die fehlenden Definitionen her?

von Matthias L. (mcl024)


Lesenswert?

...oder könnte ich das Array auch in Flash legen? Wie kann ich das Flash 
beschreiben (Befehle)?

von 123 (Gast)


Lesenswert?

Moin

1. Nur blockweise,
2. nur 10.000 bis 1.000.000 mal je nach flash dann ist der flasch im 
eimer. 3. nur sehr langsam.

somit sicher nicht das was du willst.

ggf eine alternative mcu?

von Matthias L. (mcl024)


Lesenswert?

Wie funktioniert denn der Zugriff auf die Pages?

von Uwe Bonnes (Gast)


Lesenswert?

Zur Laufzeit willst Du kein Array im Flash anlegen.

von Matthias L. (mcl024)


Lesenswert?

Ich möchte zur Laufzeit eimalig Daten von einer SD-Karte lesen und ins 
Flash ablegen und diese dann auslesen und aufs Display schreiben. Ich 
verspreche mir das, dass lesen des Flashs schneller geht als der Zugriff 
auf die SD-Karte über SPI.

Oder halt die Variante mit dem SDRAM, dass ist ja auf jeden Fall 
schneller nur bekomme ich beim Compilieren wie oben beschrieben die 
Fehlermeldungen. Irgendwie drehe ich mich im Kreis und komme kein Stück 
weiter.

von Daniel V. (danvet)


Lesenswert?

Du denkst, die Daten per SPI zu lesen, ins Flash zu schreiben, wieder 
auszulesen und am Display anzuzeigen geht schneller, als die Daten per 
SPI zu lesen und gleich anzuzeigen? Hmmm....????

von Oh man (Gast)


Lesenswert?

Hol dir doch nen anderen Controller mit ausreichend RAM.

von Matthias L. (mcl024)


Lesenswert?

Wenn ich die Daten einmalig per SPI ins Flash schreibe und dann zum 
Beispiel zwischen zwei Bildern hin und her wechseln möchte geht das 
denke ich ein bisschen schneller.

Oh man schrieb:
> Hol dir doch nen anderen Controller mit ausreichend RAM.

Ich habe 8MB externes RAM. Kann es nur leider nicht bedienen weil ich 
den Code nicht Compilieren kann, weil er einige Definitionen nicht 
findet und ich keine passende Header finde wo die Variablen definiert 
sind. Hat noch keiner den Code aus der AVR1312 benutzt?

von Karl H. (kbuchegg)


Lesenswert?

Matthias Laubnitz schrieb:

> Ich habe 8MB externes RAM. Kann es nur leider nicht bedienen weil ich
> den Code nicht Compilieren kann, weil er einige Definitionen nicht
> findet und ich keine passende Header finde wo die Variablen definiert
> sind.

Wie wäre es, wenn du dieses Problem erst mal angehen würdest, anstelle 
dass du dich in noch komplizierteren Lösungen verstrickst?

von Matthias L. (mcl024)


Lesenswert?

Das mache ich ja nur leider finde ich keine Lösung und habe daher hier 
um Hilfe gebeten (siehe oben), aber leider bisher ohne Erfolg und daher 
bin ich auf die Flash Variante gekommen.

Also ich bekomme von AVRStudio5 folgende Fehlermeldungen

von Matthias L. (mcl024)


Angehängte Dateien:

Lesenswert?

...so nochmal

von Karl H. (kbuchegg)


Lesenswert?

20 Sekunden googeln ergibt, dass Atmel offenbar da ein paar Namen 
geändert hat und es verabsäumt hat, den Driver Code auf neueren Stand zu 
bringen.

Schau ich in meiner älteren WinAvr Installation rein, dann findet sich 
in
iox128a1.h (der Header Datei, die letztendlich durch -include avr/io.h 
hereingezogen wird) zb
1
/* Chip Select adress space */
2
typedef enum EBI_CS_ASPACE_enum
3
{
4
    EBI_CS_ASPACE_256B_gc = (0x00<<2),  /* 256 bytes */
5
    EBI_CS_ASPACE_512B_gc = (0x01<<2),  /* 512 bytes */
6
    EBI_CS_ASPACE_1KB_gc = (0x02<<2),  /* 1K bytes */
7
    EBI_CS_ASPACE_2KB_gc = (0x03<<2),  /* 2K bytes */
8
    EBI_CS_ASPACE_4KB_gc = (0x04<<2),  /* 4K bytes */
9
    EBI_CS_ASPACE_8KB_gc = (0x05<<2),  /* 8K bytes */
10
    EBI_CS_ASPACE_16KB_gc = (0x06<<2),  /* 16K bytes */
11
    EBI_CS_ASPACE_32KB_gc = (0x07<<2),  /* 32K bytes */
12
    EBI_CS_ASPACE_64KB_gc = (0x08<<2),  /* 64K bytes */
13
    EBI_CS_ASPACE_128KB_gc = (0x09<<2),  /* 128K bytes */
14
    EBI_CS_ASPACE_256KB_gc = (0x0A<<2),  /* 256K bytes */
15
    EBI_CS_ASPACE_512KB_gc = (0x0B<<2),  /* 512K bytes */
16
    EBI_CS_ASPACE_1MB_gc = (0x0C<<2),  /* 1M bytes */
17
    EBI_CS_ASPACE_2MB_gc = (0x0D<<2),  /* 2M bytes */
18
    EBI_CS_ASPACE_4MB_gc = (0x0E<<2),  /* 4M bytes */
19
    EBI_CS_ASPACE_8MB_gc = (0x0F<<2),  /* 8M bytes */
20
    EBI_CS_ASPACE_16M_gc = (0x10<<2),  /* 16M bytes */
21
} EBI_CS_ASPACE_t;

jetzt machst du dein iox128a1.h auf und scrollst da mal durch, ob du 
etwas ähnliches da drinnen findest. ("Chip select adress space" könnte 
ein Suchebgriff sein). Wenn ja, dann hast du den Namen auf den 
EBI_CS_ASPACE_t umbenannt wurde und mit diesem Namen tauscht du dann im 
Driver Code erst mal aus.

(Laut meinen Googel Treffern reicht das. Funktional hat sich offenbar 
nichts geändert, die Dinge sind lediglich ein wenig anders benannt 
worden)

Und wenn ich mir die Fehlermeldungen so ansehe, dann ist das grob 
geschätzt immer der gleiche Fehler, der dafür verantwortlich zeichnet: 
EBI_CS_ASPACE_t heisst nicht mehr so, sondern ein wenig anders.

von Matthias L. (mcl024)


Lesenswert?

Hey Danke jetzt funktioniert wenigstens schonmal das kompilieren.

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.