[AVR] externer Speicher

Gast #6574970
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)
#6574978
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.
Gast #6575031
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.
#6575106
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.
Gast #6575150
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?
#6575168
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.
#6575246
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
Gast #6575777
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.
Gast #6575782
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.
Gast #6575810
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?
Gast #6575911
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?
Gast #6575997
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.
#6576442
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.
Gast #6576772
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.
Gast #6576977
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.
#6578588
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.
#6578626
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.
Gast #6578703
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.
Gast #6578864
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!

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren