Forum: Mikrocontroller und Digitale Elektronik [AVR] externer Speicher


von Fragensteller (Gast)


Lesenswert?

Hallo,

und zwar geht meinem ATmega2560 langsam der Speicher aus, da ich ein 
paar Bilder habe die am Display angezeigt werden. Jetzt wollte ich einen 
externen Flash einbauen (W25Q16JV) der die (Bild-)Daten speichern soll, 
damit am uC nur noch das Programm gespeichert ist. Der W25Q16JV bekommt 
die Daten über SPI. Allerdings muss ich ja die Bilder erst am uC 
gespeichert haben, dass ich sie an den externen Flash senden kann was 
irgendwie nicht Sinn der Sache ist.
Gibt es überhaupt eine Lösung für mein Problem?
(Außer den Flash vorm Einbauen über einen anderen uC bespeichern und 
meinen eigentlichen uC nur lesen lassen)

: Bearbeitet durch Admin
von Patrick C. (pcrom)


Lesenswert?

(u)SD karte nehmen, einen FAT32 library benutzen zB 2GB
Dann kann man am anfang die benoetigte dateien direct mittels PC 
schreiben und spaeter routinen schreiben damit du das auch via den 
processor laufen lassen kannst. Bei ein etwas elteres Projekt habe ich 
da FATFS benutzt. Kann sein das heutzutage auch andere libraries dafuer 
gibt.

von MCUA (Gast)


Lesenswert?

Der ATmega2560 hat doch Ext.BusInterface, da kannst du alles dran 
hängen.

von Fragensteller (Gast)


Lesenswert?

MCUA schrieb:
> Der ATmega2560 hat doch Ext.BusInterface, da kannst du alles dran
> hängen.

Echt? das wär ja super.
Unter welchem Punkt find ich dazu was im Datenblatt?

von A. B. (Gast)


Lesenswert?

Wenn's denn unbedingt ein SPI-Flash sein soll und die Alternativen wie 
SD-Karte nicht in Frage kommen:

1) kleines Programm im Flash, dass über UART die Daten fürs externe 
Flash bekommt und dort hinein schreibt.

oder

2) Über JTAG Bitbanging ans SPI-Flash machen. Aber das muss man erstmal 
programmieren ... Einmalig recht hoher Aufwand. Bei so einem kleinen 
Flash geht das sicher auch in erträglicher Zeit, bei einem großen mit 64 
MByte wird es eher unbequem langwierig.

oder

3) RESET mit einem Jumper auf '0', dann kann man mit einem externen 
Programmer an die Pins vom SPI-Flash ran.

von S. R. (svenska)


Lesenswert?

Fragensteller schrieb:
> Unter welchem Punkt find ich dazu was im Datenblatt?

Stichwort XMEM.

von Fragensteller (Gast)


Lesenswert?

A. B. schrieb:
> Wenn's denn unbedingt ein SPI-Flash sein soll und die Alternativen
> wie
> SD-Karte nicht in Frage kommen:

Muss nicht unbedingt ein SPI-Flash sein, hatte nur noch welche 
rumliegen.
Die einfachste Variante wär mir am liebsten.

von Fragensteller (Gast)


Lesenswert?

> Stichwort XMEM.

Hab ich mittlerweile auch schon entdeckt, allerdings ist das mit 64kB 
bzw. tatsächlichen 56kB doch recht dürftig

von Falk B. (falk)


Lesenswert?

Fragensteller schrieb:
> und zwar geht meinem ATmega2560 langsam der Speicher aus, da ich ein
> paar Bilder habe die am Display angezeigt werden.

Wirklich? Hast du die vollen 256kB genutzt?

Beitrag "Re: AVR Flash jenseits der 64kB"

> Jetzt wollte ich einen
> externen Flash einbauen (W25Q16JV) der die (Bild-)Daten speichern soll,
> damit am uC nur noch das Programm gespeichert ist. Der W25Q16JV bekommt
> die Daten über SPI. Allerdings muss ich ja die Bilder erst am uC
> gespeichert haben, dass ich sie an den externen Flash senden kann

Nö, man kann sie auch von einer seriellen Schnittstelle direkt in den 
Flash schreiben. Oder man nimmt gleich eine MicroSD Card.

von Falk B. (falk)


Lesenswert?

Fragensteller schrieb:
> Muss nicht unbedingt ein SPI-Flash sein, hatte nur noch welche
> rumliegen.
> Die einfachste Variante wär mir am liebsten.

SPI-Flash IST einfach. Einfacher geht es kaum.

von Falk B. (falk)


Lesenswert?

Fragensteller schrieb:
> Hab ich mittlerweile auch schon entdeckt, allerdings ist das mit 64kB
> bzw. tatsächlichen 56kB doch recht dürftig

Man kann ja mit guten, alten Pages arbeiten. Einfach die oberen 32k 
nutzen, dann geht das lückenlos.

von Patrick C. (pcrom)


Lesenswert?

Fragensteller schrieb:
> Die einfachste Variante wär mir am liebsten.

Was ist fuer dich einfach ?
Extra XMEM = mehr hardware aufwand
Memory via SD = mehr software aufwand

Wenn moeglich wuerde ich fuer uSD gehen, sonnst ist gleich die naechste 
Frage wie bekomme ich bmp files im XMEM

von Fragensteller (Gast)


Lesenswert?

> Wirklich? Hast du die vollen 256kB genutzt?

 Die HEX Datei ist jetzt bei 228kB

> Nö, man kann sie auch von einer seriellen Schnittstelle direkt in den
> Flash schreiben.

 Wie kann ich mir das vorstellen? Hast du ein paar Schlagwörter für 
mich, dass ich dazu recherchieren kann?

von Fragensteller (Gast)


Lesenswert?

>sonnst ist gleich die naechste
> Frage wie bekomme ich bmp files im XMEM

die Bilder sind auch HEX Dateien

von Falk B. (falk)


Lesenswert?

Fragensteller schrieb:
>> Wirklich? Hast du die vollen 256kB genutzt?
>
>  Die HEX Datei ist jetzt bei 228kB

Also nutzt du schon die pgm_read_byte_far() Funktionen?

>> Nö, man kann sie auch von einer seriellen Schnittstelle direkt in den
>> Flash schreiben.
>
>  Wie kann ich mir das vorstellen? Hast du ein paar Schlagwörter für
> mich, dass ich dazu recherchieren kann?

XMODEM, sftp & Co.

von Sascha W. (sascha-w)


Lesenswert?

Fragensteller schrieb:
>> Wirklich? Hast du die vollen 256kB genutzt?
>
>  Die HEX Datei ist jetzt bei 228kB
die Datei im HEX Format ist wesentlich größer als der Speicherbedarf da 
die Daten als Text abgelegt sind. Oder meinst du eine Datei im BIN 
Format?

Sascha

von Falk B. (falk)


Lesenswert?

Sascha W. schrieb:
> Fragensteller schrieb:
>>> Wirklich? Hast du die vollen 256kB genutzt?
>>
>>  Die HEX Datei ist jetzt bei 228kB
> die Datei im HEX Format ist wesentlich größer als der Speicherbedarf da
> die Daten als Text abgelegt sind. Oder meinst du eine Datei im BIN
> Format?

Hehe, guter Punkt! Eine Intel-Hex-Datei ist ca. 2,25x größer als die 
reinen Binärdaten, macht hier bei 228kB ca. 100kB. Davon sind im 
Normalfall nur 64kB per pgm_read_byte() & Co addressierbar. Wenn man den 
gesamten Speicher für Daten nutzen will, dann so.

https://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#Flash_mit_PROGMEM_und_pgm_read

von Fragensteller (Gast)


Lesenswert?

> die Datei im HEX Format ist wesentlich größer als der Speicherbedarf da
> die Daten als Text abgelegt sind. Oder meinst du eine Datei im BIN
> Format?

 Ich bin im Explorer meinem Pfad so lange gefolgt bis ich in dem Ordner 
bin wo die myProgram.hex Datei liegt. Rechts daneben wird mir die Größe 
mit 228kB angezeigt.

von Fragensteller (Gast)


Lesenswert?

> Hehe, guter Punkt! Eine Intel-Hex-Datei ist ca. 2,25x größer als die
> reinen Binärdaten, macht hier bei 228kB ca. 100kB. Davon sind im
> Normalfall nur 64kB per pgm_read_byte() & Co addressierbar.
>
 Gibt es eine Möglichkeit die reine Binärdatengröße zu bestimmen? Wenn 
ich tatsächlich erst um die 100kB verbraucht habe spare ich mir den 
ganzen Aufwand nämllich.

von Fragensteller (Gast)


Lesenswert?

Habe diesen Befehl gefunden, um mir den Verbrauch des gesamten Programms 
anzeigen zu lassen:  avr-size -x -A foo.elf

Wie genau ist der?
Schreibe ich die Zeile einfach in meine main.cpp oder wie bau ich das 
ein?
Muss ich mir den Wert dann am Display anzeigen lassen oder geht das in 
Atmel Studio 7.0?
Falls ich sie am Display zeigen muss kann ich einfach schreiben:
myVar = avr-size -x -A foo.elf und myVar am Display ausgeben?

von jo mei (Gast)


Lesenswert?

Fragensteller schrieb:
> Muss ich mir den Wert dann am Display anzeigen lassen oder geht das in
> Atmel Studio 7.0?

Kopfschüttel.
Atmel Studio gibt dir doch am Ende des Build aus wie gross das
Binary ist.

von Falk B. (falk)


Lesenswert?

Fragensteller schrieb:
> Gibt es eine Möglichkeit die reine Binärdatengröße zu bestimmen? Wenn
> ich tatsächlich erst um die 100kB verbraucht habe spare ich mir den
> ganzen Aufwand nämllich.

Ja, in deiner Die die Speicherauslastung anschauen. Sowohl 
Atmel/AVR/Microchip Studio als auch Arduino geben das direkt nach dem 
Kompilieren an.

von Fragensteller (Gast)


Lesenswert?

> Kopfschüttel.
> Atmel Studio gibt dir doch am Ende des Build aus wie gross das
> Binary ist.

 Ja ich kenne den Speicherverbrauch den Atmel Studio nach dem buid 
angiebt. Jemand hat mal zu mir gemeint, dass der nicht richtig ist und 
ich mir die Größe der .hex Datei ansehen soll.

Also kann ich doch auf den Vertrauen?

von Fragensteller (Gast)


Lesenswert?

> Ja, in deiner Die die Speicherauslastung anschauen. Sowohl
> Atmel/AVR/Microchip Studio als auch Arduino geben das direkt nach dem
> Kompilieren an.

 Ok da bin ich dann erst bei 83kB

von jo mei (Gast)


Lesenswert?

Fragensteller schrieb:
> Jemand hat mal zu mir gemeint, dass der nicht richtig ist und
> ich mir die Größe der .hex Datei ansehen soll.

Ja und der Jemand spricht Käse.

Fragensteller schrieb:
> Also kann ich doch auf den Vertrauen?

Warum bildest du dir nicht deine eigene Meinung? Sollen wir
für dich enstcheiden wem du vertrauen sollst?

von Fragensteller (Gast)


Lesenswert?

> Warum bildest du dir nicht deine eigene Meinung? Sollen wir
> für dich enstcheiden wem du vertrauen sollst?

 Ich will ja auch keine Meinung sondern Fakten
 Trotzdem Danke!

von Schlaumaier (Gast)


Lesenswert?

Kauf dir in China (oder DE) für ein paar Euro ein normalen 
SD-Karten-Reader.
Den steuerst du einfach an und gut ist.

z.b. 
https://www.ebay.de/itm/SD-Card-Reader-Modul-5-Stuck-geeignet-fur-Arduino-Co/402675349203

Such bei Ebay nach "Arduino SD"  und der zeigt sie dir in Masse.  Die 
kannst auch mit den "kleinen" Arduinos Problemlos über Libs ansteuern.

Mit den Pc das Bild via FAT-16/32 auf die Speicherkarte kopieren. Dabei 
drauf achten das du die alten Dos-Regeln nutzt. (8.3 und keine 
Leerzeichen).

Via Libs das Bild laden und genießen.

von Schlaumaier (Gast)


Lesenswert?

jo mei schrieb:
> Atmel Studio gibt dir doch am Ende des Build aus wie gross das
> Binary ist.

Das macht sogar die Arduino-IDE. ;) Bis auf das Bytes genau und in 
Prozent umgerechnet sogar. ;)

von S. R. (svenska)


Lesenswert?

Fragensteller schrieb:
>> Stichwort XMEM.
>
> Hab ich mittlerweile auch schon entdeckt,
> allerdings ist das mit 64kB
> bzw. tatsächlichen 56kB doch recht dürftig

Da der AVR nur 64 KB Adressraum hat, bist du natürlich etwas 
beschränkt in den Möglichkeiten. Von maximal 64 KB Speicher steht da 
nichts.

Ein Gameboy hat auch nur 64 KB Adressraum und es gibt Cartridges mit 8 
MB ROM und zusätzlich noch RAM.

von Cyblord -. (cyblord)


Lesenswert?

Schlaumaier schrieb:
> Kauf dir in China (oder DE) für ein paar Euro ein normalen
> SD-Karten-Reader.
> Den steuerst du einfach an und gut ist.

Ist kein "SD-Karten-Reader", das ist nur ein SD Slot mit Breakout Board 
und Hühnerfutter.

von Falk B. (falk)


Lesenswert?

S. R. schrieb:
> Fragensteller schrieb:
>>> Stichwort XMEM.
>>
>> Hab ich mittlerweile auch schon entdeckt,
>> allerdings ist das mit 64kB
>> bzw. tatsächlichen 56kB doch recht dürftig
>
> Da der AVR nur 64 KB Adressraum hat,

Nö. Die großen AVRs mit >64kB Flash haben 17 oder 18 Bit Adressraum!
Siehe RAMPZ Register.

von Falk B. (falk)


Lesenswert?

Fragensteller schrieb:
> Ja ich kenne den Speicherverbrauch den Atmel Studio nach dem buid
> angiebt. Jemand hat mal zu mir gemeint, dass der nicht richtig ist und
> ich mir die Größe der .hex Datei ansehen soll.

Unsinn.

> Also kann ich doch auf den Vertrauen?

Ja.

Beitrag "Re: Speicherplatz eines .hex Files auf dem Microcontroller"

von MCUA (Gast)


Lesenswert?

Ja, mit Pages und Zusatz-Registern kann man alles mögliche adressieren, 
auch GB's an Daten. Aber doch umständlicher als wenn man gleich die 
passende OPcode- und Indexregister -Breite hätte.

von c-hater (Gast)


Lesenswert?

Fragensteller schrieb:

>  Ich will ja auch keine Meinung sondern Fakten

Grundsätzlich ein sehr guter Ansatz.

Blöderweise erfordert das Ermitteln und Prüfen von Fakten eigene 
Kompetenz, die man wiederum nur durch zeitaufwendiges und anstrengendes 
LERNEN erwerben kann.

Aber bei dem konkreten Problem hält sich der Schaden in Grenzen.

Man muss erstens verstehen, dass man eine Zahl auf viele verschiedene 
Arten darstellen kann. Theoretisch unendlich viele, praktisch sind aber 
nur wesentlich weniger im Gebrauch. Hier geht es erstmal um den 
Unterschied zwischen einem Byte in binärer Repräsentation (das ist, was 
der Compiler am Ende erzeugt und was der µC als Programm abarbeitet oder 
als Daten verwendet) und der Darstellung desselben Bytes als 
menschenlesbare zweistellige hexadezimale ASCII-Zahl (das ist, was z.B. 
ein Debugger anzeigt oder auch das, was in einem Hexfile steht). Nun ist 
ASCII-Code seinerseits aber am Ende auch wieder binär. Er braucht aber 
zur Abbildung dieser zweistelligen Zahl zwei Bytes.
Weil das so ist, ist ein Hexfile schonmal mindestens doppelt so groß wie 
die Daten, die es darstellt.

Für den Rest muss verstehen, wie ein Hex-File grundsätzlich aufgebaut 
ist. Der entsprechende Wikipedia-Artikel liefert alle Informationen, die 
man dazu braucht. Es kommen zu den Nutzbytes noch pro Zeile 
Informationen über die Adresse, an die sie zu schreiben sind und eine 
Prüfsumme. Dazu gibt es noch ein paar Steuerdaten, um größere 
Adressblöcke als 64k behandeln zu können und um das Dateiende 
zweifelsfrei zu markieren. All dieser Kram wird auch wieder in 
ASCII-Hexzahlen dargestellt. Weiterhin kommen dazu diverse Trennzeichen 
im ASCII-Code, die die einzelnen Zeilen des Hexfiles voneinander 
trennen.
Weil das alles so ist, ist ein Hexfile am Ende immer deutlich größer als 
das doppelte der Binärdaten.

Es ist übrigens nicht möglich, einen genauen Faktor anzugeben, um den 
das Hexfile größer ist als die Daten, die es repräsentiert. Zum einen 
hängt der Overhead von der gewählten Zeilenlänge ab, zum anderen kann 
man im Prinzip so ein Hexfile auch noch beliebig aufblasen, indem man 
ein und dieselben Adressen wieder und immer wieder mit Daten füllt.

Sicher ist also nur eins: der Faktor 2 als Minimum.

von Schlaumaier (Gast)


Lesenswert?

Cyblord -. schrieb:
> Ist kein "SD-Karten-Reader", das ist nur ein SD Slot mit Breakout Board
> und Hühnerfutter.

Reicht aber aus um ihn mit eine Libs anzusteuern. ;)

Und ich verbaue sehr oft Breakout Board direkt auf meiner selbst 
erstellten Platine. Der Grund ist einfach nur das ich zu faul bin das 
"Hühnerfutter" zu beschaffen und dann auch noch zu löten.  Solang sich 
das rechnet.... ;)

Ich nehme z.b. auch Arduinos-Nanos (2.50 Euro China-Boards), Sockel die 
auf meiner Platine und baue meine Bauteile drumherum. Ist alles eine 
Frage des Kosten-/Nutzen Faktors.

von S. R. (svenska)


Lesenswert?

Falk B. schrieb:
>>>> Stichwort XMEM.
>> Da der AVR nur 64 KB Adressraum hat,
> Nö. Die großen AVRs mit >64kB Flash haben 17 oder 18 Bit Adressraum!

Ein Atmega2560 besitzt nur AD[7:0] und A[15:8]. Wenn ich mich nicht 
verzählt habe, sind das 16 Adressleitungen für einen 64 KB Adressraum am 
XMEM. Darum ging es hier.

Wärst du fair gewesen, hättest du das mit erwähnt statt einfach nur 
"falsch" zu brüllen. Du bist schließlich nicht blöd.

von Falk B. (falk)


Lesenswert?

S. R. schrieb:
> Ein Atmega2560 besitzt nur AD[7:0] und A[15:8]. Wenn ich mich nicht
> verzählt habe, sind das 16 Adressleitungen für einen 64 KB Adressraum am
> XMEM.

Ja.

>Darum ging es hier.

Nein. Es ging dem OP darumm, mehr Speicherplatz für Grafiken zu haben. 
Die brauchen Flash, kein RAM.

"und zwar geht meinem ATmega2560 langsam der Speicher aus, da ich ein
paar Bilder habe die am Display angezeigt werden."

> Wärst du fair gewesen,

Das war ich.

von c-hater (Gast)


Lesenswert?

Falk B. schrieb:

> Nein. Es ging dem OP darumm, mehr Speicherplatz für Grafiken zu haben.
> Die brauchen Flash, kein RAM.

So what? Man kann natürlich über den XMEM-Mechanismus auch Flash 
anbinden, zumindest zum Lesen ist das überhaupt kein Problem. Nur, wenn 
man darauf auch schreiben will, wird es etwas komplizierter.

Naja, ein paar Extra-GPIOs für's Bank-Switching und die zum Schreiben 
nötigen Signale sollten sich an einem 2560 ja irgendwie finden lassen.

von Falk B. (falk)


Lesenswert?

c-hater schrieb:
> So what? Man kann natürlich über den XMEM-Mechanismus auch Flash
> anbinden,

Kann man, löst aber das Problem des OP nicht sinnvoll. Außerdem sind wir 
schon lange weiter, selbst der OP.

von Stefan F. (Gast)


Lesenswert?

Was heißt "OP"?

von Erklehr Behr (Gast)


Lesenswert?

Stefan ⛄ F. schrieb:
> Was heißt "OP"?

Offizieller Poser.

von S. R. (svenska)


Lesenswert?

Stefan ⛄ F. schrieb:
> Was heißt "OP"?

"Original Poster", also der Ursprungseröffner des Threads.

von MCUA (Gast)


Lesenswert?

> Man kann natürlich über den XMEM-Mechanismus..
..alles dran hängen, was sich irgentwie par. adressieren lässt.
RAM ist einfacher und auch schneller.
Das was hier benötigt wird/würde kostet fast nichts.


> Was heißt "OP"?
Operationsverstärker!

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.