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)
(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.
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?
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.
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.
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.
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.
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.
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
> 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?
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.
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
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
> 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.
> 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.
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?
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.
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.
> 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?
> 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
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?
> 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!
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.
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. ;)
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
> 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!