Speicher erweitern AT-MEGA

Gast #1584383
Lesenswert?

Wollte mal eben fragen ob jemand eine Idee hat wie ich den 
Prgrammspeicher eines AT-MEGA erweitern kann.
Ich habe nähmlich ein größeres projekt vor (etwa 2 MB) und der speicher 
eines AT-MEGA oder sonstigen ICs wird dazu viel zu wehnig.
Also will ich einen externen Speicherchip oä. mit dem AT-MEGA 
kommunizieren lassen.

So, jetzt zum eigentlichen problem:
Wie stellt man es an, dass man jetzt beispielsweise funktionen aus dem 
externen chip auf dem AT-MEGA ausführen kann.
Sollte ich dazu irgendwie die funktionen importieren und dann ausführen?
Wenn ja, wie sollten die funktionen gelesen werden, immerhin will ich ja 
ein kompiliertes programm laufen lassen,
zudem will ich aber keinen eigenen Kompiler/Decompiler schreiben.

BTW: eine andere Frage noch:
Wie wird die geschwindigkeit eines AT-MEGA berechnet?
Angenommen ich verwende einen 4MHz Quarz, würde der IC dann 4.000.000 
ASM-Befehle in einer Sekunde schaffen oder sind es doch mehr?
Admin Persönliche Seite #1584386
Lesenswert?

Bentschi schrieb:
> Ich habe nähmlich ein größeres projekt vor (etwa 2 MB)

Wie kommst du auf diese Zahl?

Die AVRs können keinen Code aus externem Speicher ausführen. Was man 
machen kann ist Daten von einem externen Speicher zu laden, z.B. von 
einer SD-Karte. Aber am besten erzählst du erst mal was du eigentlich 
vor hast.

Bentschi schrieb:
> Angenommen ich verwende einen 4MHz Quarz, würde der IC dann 4.000.000
> ASM-Befehle in einer Sekunde schaffen

Maximal, allerdings dauern viele Befehle länger als einen Takt, 
entsprechend reduziert sich der Befehlsdurchsatz.
Gast #1584420
Lesenswert?

Andreas Schwarz schrieb:
> Aber am besten erzählst du erst mal was du eigentlich
> vor hast.

Ich will einen Emulator auf einen AVR bringen.
Den Emulator selbst habe ich schon geschrieben der unter windows läuft.
Es handelt sich dabei um einen NES (Nintendo) emulator.
Die ausgabe über ein PSP-Display funktioniert bereits sowie die ausgabe 
von den guten alten Nintendo-gepiepse.
jetzt will ich nur das ganze NES-system auf nen AVR portieren und die 
ROMS dann per SD-Karte laden.
Natürlich werde ich für dieses projekt nicht nur einen AVR sondern 
mehrere verwenden.
Für den AVR der den CPU darstellen soll will ich eben jetzt die 
funktionen aus einem speicherbaustein laden (nicht der SD-Karte).
Der kompilierte code hat für windows bereits 483 KB (ohne 
Grafikanzeige).
Ich möchte mir aber etwas mehr speicher für spätere updates bereit 
halten, darum etwa 2 MB.
#1584431
Lesenswert?

Vielleicht solltest Du Dich erstmal mit der Architektur des AVRs 
befassen und den Unterschied zwischen Harvard und v.Neumann klären. Der 
AVR ist nämlich kein "Prozessor" im Sinne von Z80, 6520, 68000 oder 
x'86, sondern ein Controller, also ein fertiges Komplettsystem mit ein 
paar I/O-Ports, das man so benutzt, wie es ist.

...
Gast #1584434
Lesenswert?

Natuerlich geht's. Alles eine Frage der Anforderungen. Man kann einen 
kleinen Interpreter in einen Mega64 schreiben und den auszufuehrenden 
Code in einem externen Flash halten. Fuer was SPS maesssiges reichts.
#1584444
Lesenswert?

Bentschi schrieb:

> Wie wird die geschwindigkeit eines AT-MEGA berechnet?
> Angenommen ich verwende einen 4MHz Quarz, würde der IC dann 4.000.000
> ASM-Befehle in einer Sekunde schaffen oder sind es doch mehr?

Grobe Peilung 3 Mio AVR-Befehle pro Sekunde bei 4MHz Takt. Nur ist ein 
AVR Befehl ein "bischen" weniger mächtig als ein x86-Befehl.
Gast #1584485
Lesenswert?

Hannes Lux schrieb:
> Vielleicht solltest Du Dich erstmal mit der Architektur des AVRs
> befassen und den Unterschied zwischen Harvard und v.Neumann klären.

Ich habe mich sowohl mit der architetur eines AVRs als auch der eines 
6502 (nicht 6520) der in einem NES verbaut ist befasst. Ansonsten könnte 
ich wohl auch keinen emulator für diesen IC schreiben ;-)

A. K. schrieb:
> Grobe Peilung 3 Mio AVR-Befehle pro Sekunde bei 4MHz Takt. Nur ist ein
> AVR Befehl ein "bischen" weniger mächtig als ein x86-Befehl.

A. K. schrieb:
> So wie ich ihn verstanden habe ist sein Nintendo-Interpreter/Emulator
> doch selber schon 1/2MB gross. Wenn nun dieser Interpreter/Emulator
> selber interpretiert werden muss, dann könnte am Ende die Performance
> etwas leiden.
>
> Das ganze klingt schon sehr bizarr.

Also wenn das mit deiner Peilung stimmt, dann mach ich mir keine sorgen 
um die Performanz, Da ich ja für die Grafikdarstellung, den CPU und den 
Mapper, jeweils extra einen AVR verwenden will.
Immerhin muss das system weder multitasking, noch 3D darstellungen oder 
sonstige schwierige berechnungen ausführen.

Aber die verbindung zwischen 2 AVRs würde aber dennoch 4 MHz betragen, 
oder?

Zacc schrieb:
> Natuerlich geht's. Alles eine Frage der Anforderungen. Man kann einen
> kleinen Interpreter in einen Mega64 schreiben und den auszufuehrenden
> Code in einem externen Flash halten. Fuer was SPS maesssiges reichts.

Genau das meinte ich, dass ich es nicht so machen will. Wenn es aber 
keine andere lösung gibt bleibt mir das wohl auch nicht erspart.
#1584495
Lesenswert?

Ich schätze einfach mal, dass die 483 KB große Windows-EXE neben 
diversem Header-Gekrempel auch ne Menge Daten drin hat, die keinen 
Programmcode darstellen.

Du könntest sicher versuchen, den Code auf 256 KB runter zu quetschen, 
dann passt er in einen Atmega2560.

Ansonsten ginge noch ATxmega, die gehen bis 384 KB Code und sind mehr 
oder minder kompatibel zu den ATmegas. Nachtrag: okay, die scheinen aber 
offensichtlich (noch) nicht am Markt zu sein.

Eine Lösung, Code von extern auszuführen, gibt es so nicht. Entweder 
muss man interpretieren, oder den Code in den Flash-Speicher laden (und 
der verträgt nur 10.000 Schreibzyklen - und ist außerdem etwas langsam).

Gruß
David
#1584523
Lesenswert?

Bentschi schrieb:

> Aber die verbindung zwischen 2 AVRs würde aber dennoch 4 MHz betragen,
> oder?

Meinst du die Kommunikation zwischen 2 AVRs? Dessen Schnittstellen sind 
eigentlich nicht für den Aufbau von Parallelrechnern konstruiert. 
Bischen was kann man mit synchroner UART zaubern, aber ein AVR kann in 
diesem Tempo entweder reden oder arbeiten, nicht beides.

Mir scheint ein AVR einer der für diese Aufgabe am schlechtesten 
geeigneten Lösungen zu sein, die sich finden lässt. Warum ausgerechnet?

Mikros mit internen 2MB Flash gibt es. Sind halt viel komplexer im 
Umgang. Und sind keine AVRs.
Gast #1584527
Lesenswert?

David Madl schrieb:
> Ich schätze einfach mal, dass die 483 KB große Windows-EXE neben
> diversem Header-Gekrempel auch ne Menge Daten drin hat, die keinen
> Programmcode darstellen.

Die 483 KB sind der eigentlich programmcode ohne OpenGL (das ich für die 
windows emulation verwende) und ohne den Windows-Funktionen selbst.
Inkludiert habe ich dann nur noch <cstdlib>. Zudem ist der code noch 
nicht vollständig (im sinne von "zu allen ROMs kompatiebel"), da ich 
erst 3 mapper in das programm eingebaut habe von etwa 150-200 die es 
giebt.
(1 mapper = ca. 100 Zeilen C-code)

Die bessere lösung währe es, ohne zweifel, den AVR-eigenen Speicher zu 
verwenden, aber ich glaube kaum dass der beim portierten NES reichen 
würde.
Zudem würde ich noch gerne ein paar kleine extras einbauen, wie bsp 
GameGenie, Screenshots speichern, etc. und natürlich die mapper 
erweitern.

A. K. schrieb:
> Meinst du die Kommunikation zwischen 2 AVRs? Dessen Schnittstellen sind
> eigentlich nicht für den Aufbau von Parallelrechnern konstruiert.
> Bischen was kann man mit synchroner UART zaubern, aber ein AVR kann in
> diesem Tempo entweder reden oder arbeiten, nicht beides.

Nein, ich meinte eigentlich dass ich eine kommunikation zwischen 2 AVRs 
über die IO-PINS herstellen möchte. Eigentlich wollte ich 8-16 Pins für 
die kommunikation und 1 Pin für einen taktgeber verwenden (falls nötig).
Diese IO-PINS verwenden ja dann die taktfrequenz des Quartz, wenn ich 
das richtig verstanden habe.

A. K. schrieb:
> Mikros mit internen 2MB Flash gibt es. Sind halt viel komplexer im
> Umgang. Und sind keine AVRs.

Naja mitlerweile habe ich mich damit abgefunden, das ich dennoch einen 
externen ROM-baustein verwenden werde und dafür einen Interpreter 
schreiben werde.

Jetzt ist mir nur noch die sache mit der geschwindigkeit der IO-PINS 
unklar.
Gast #1584538
Lesenswert?

Was genau soll diese Datenverbindung denn machen?

Du kannst sicher mit fast Quarzgeschwindigkeit einen Pin toggeln lassen. 
Problem ist nur, der Atmega macht dann nichts anderes mehr.

Der Atmega bringt ja mehrere Interfaces mit, UART, SPI, TWI usw.
Natürlich kannst du damit mehrere ICs verbinden und Daten austauschen.
Nur wirst du niemals mit 4MHz die Daten gleichzeitig erzeugen, senden, 
empfangen und verarbeiten können.

So ein Atmega macht jede Operation hintereinander. Sicherlich kannst du 
über Interrupts, Sendepuffer etc. einen quasi-Parallelbetrieb erreichen. 
Dabei geht aber die Geschwindigkeit in den Keller.

Vielleicht solltest du dich doch erstmal mit der Funktionsweise von 
einem Atmega befassen, bevor du das Projekt angehst.
Vor allem wenn man aus der PC-Programmierung kommt wundert man sich doch 
erstmal, was diese kleinen Dinger alles nicht können und wie lange so 
ein Rechenschritt doch dauert.
Das ist eben etwas völlig anderes, als in seinem bequemen Betriebssystem 
nochmal einen neuen Task zu starten, wenn Daten irgendwo hin müssen.
Gast #1584714
Lesenswert?

Ok, die Idee ist wirklich Gold wert.
Wusste bis heute leider nicht dass es auch ARM gibt.
Hab schon im internet gestöbert und der beste ARM den ich kriegen kann 
ist
tatsächlich ein LPC2000, weil Conrad leider nix besseres hat als:
>MICROCONTR. ARM7 LPC2378FBD144,551 NXP

Ich habe auch schon eine Idee, wie ich den programmcode unter 512 KB 
halten kann. Dafür muss ich aber dennoch einen externen ROM verwenden, 
sowie einen externen RAM.

Dazu lege ich einfach die Mapper auf den externen ROM, da es ja wie 
gesagt etwa 150-200 Mapper gibt und ich aber nur einen Mapper in der CPU 
benötige, währe das wahrscheinlich die einfachste Lösung. Der Mapper 
wird dann einfach beim laden eines Spieles in die CPU geladen. Danach 
muss nicht mehr auf den externen ROM zugegriffen werden.

Um den externen RAM komme ich sowieso nicht herum, da es sicherlich 
keinen Microcontroller gibt der etwa 1-2 MB RAM bereitstellt. Der RAM 
wird eigentlich nur für die "Memory Maps" des NES benötigt. Dennoch 
mache ich mir um die Performanz keine sorgen, da im RAM nur etwa 50 
KB/sek geschrieben bzw gelesen wird.

Naja, also soweit ist mein problem gelöst.
Ich werde dann wieder posten wenn mein emulator läuft.
Oder, wenn noch probleme auftauchen sollten.
#1584728
Lesenswert?

Sorry, aber war der letzte Post ernst gemeint? Du kennst keinen ARM und 
willst so was bauen???

Es gibt sicherlich jede Menge Prozessoren die Du noch nicht angeschaut 
hast. Außerdem gibt es nicht nur Conrad. Schau mal bei Reichelt oder in 
letzter Zeit von mir immer beliebter wenn auch etwas teuerer (aber 
Conrad ist ja auch ne Apotheke) bei RS-Components, die haben fast alles.

ARM ist sicherlich die bessere Alternative Oder schau Dir mal XMOS oder 
den Propeller von Paralax an, die sind beie schon für KOmmunikation von 
mehreren Prozessoren vorbereitet.


Gruß
Tom
Gast #1584769
Lesenswert?

Thomas Burkhart schrieb:
> Sorry, aber war der letzte Post ernst gemeint? Du kennst keinen ARM und
> willst so was bauen???

Jap, der war ernst gemeint.
Ich will nur dazu sagen, dass ich schnell kappiere und bereits mehrere 
Programmiersprachen behersche.
Das Datenblatt habe ich mir angesehen, jetzt noch 2-3 gute Tutorials 
lesen zwischendurch noch ein paar mal einen blick auf das Datenblatt 
werfen, eine testschaltung aufbauen um zu sehen ob ich es verstanden 
habe und wenns funktioniert steht ja nix mehr im weg, oder?

Thomas Burkhart schrieb:
> Es gibt sicherlich jede Menge Prozessoren die Du noch nicht angeschaut
> hast. Außerdem gibt es nicht nur Conrad. Schau mal bei Reichelt oder in
> letzter Zeit von mir immer beliebter wenn auch etwas teuerer (aber
> Conrad ist ja auch ne Apotheke) bei RS-Components, die haben fast alles.

Also das mit dem ARM das reicht mir, ich bin mir ziemlich sicher dass 
die Leistung für dieses Projekt reicht.

Da ich in Österreich wohne und ein Conrad gleich um die ecke ist, ist 
mir Conrad lieber, so spare ich mir dann auch noch die Versandkosten. 
Würde ich bei Reichelt bestellen müsste ich eine mindestbestellmenge von 
150€ zusammenkriegen und das ist ja wohl zuviel Geld wenn ich doch nur 
einen lächerlichen ARM und eine handvoll kleinkram kaufen will.

Thomas Burkhart schrieb:
> ARM ist sicherlich die bessere Alternative Oder schau Dir mal XMOS oder
> den Propeller von Paralax an, die sind beie schon für KOmmunikation von
> mehreren Prozessoren vorbereitet.

Ich denke, dass wenns ein ARM allein schaffen kann, dass es auch die 
beste lösung ist. Aber trotzdem danke für den Tipp, bei gelegenheit 
werde ich es mir genauer ansehen.
Persönliche Seite #1584789
Lesenswert?

Bentschi schrieb:
> Wollte mal eben fragen ob jemand eine Idee hat wie ich den
> Prgrammspeicher eines AT-MEGA erweitern kann.
> Ich habe nähmlich ein größeres projekt vor (etwa 2 MB) und der speicher
> eines AT-MEGA oder sonstigen ICs wird dazu viel zu wehnig.
> Also will ich einen externen Speicherchip oä. mit dem AT-MEGA
> kommunizieren lassen.

Wie schon gesagt: Du verwechselst den Programmspeicher wahrscheinlich 
mit Hintergrundspeicher. Dass Du tatsaechlich 2MB brauchen wirst, halte 
ich fuer mehr als nur etwas unwahrscheinlich.

> So, jetzt zum eigentlichen problem:
> Wie stellt man es an, dass man jetzt beispielsweise funktionen aus dem
> externen chip auf dem AT-MEGA ausführen kann.

Geht nicht, da die Architektur das nicht vorsieht. Man kann bei den 
groesseren Megas lediglich den Datenspeicher auf 64KByte erweitern (16MB 
beim Xmega).

> Sollte ich dazu irgendwie die funktionen importieren und dann ausführen?

Geht nicht, da die Architektur Programm- und Datenspeicher trennt. Man 
kann lediglich mit Trickserei den Programmspeicher als Datenspeicher 
missbrauchen.

> Wenn ja, wie sollten die funktionen gelesen werden, immerhin will ich ja
> ein kompiliertes programm laufen lassen

Du solltest Dich erst einmal mit Grundlagen befassen, bevor Du solche 
Mondprojekte anstrebst. Dann wird das vielleicht auch mal irgendwann 
etwas.

> zudem will ich aber keinen eigenen Kompiler/Decompiler schreiben.

Ja ne, is klar :P

An die anderen: Auch wenn es Euch Spass macht. Dem Jungen jetzt auch 
noch einen ARM vorzuschlagen, duerfte wohl an Sinnlosigkeit kaum zu 
ueberbieten sein, oder?
Gast #1584900
Lesenswert?

Michael G. schrieb:
> Bentschi schrieb:
>> Wollte mal eben fragen ob jemand eine Idee hat wie ich den
>> Prgrammspeicher eines AT-MEGA erweitern kann.
>> Ich habe nähmlich ein größeres projekt vor (etwa 2 MB) und der speicher
>> eines AT-MEGA oder sonstigen ICs wird dazu viel zu wehnig.
>> Also will ich einen externen Speicherchip oä. mit dem AT-MEGA
>> kommunizieren lassen.
>
> Wie schon gesagt: Du verwechselst den Programmspeicher wahrscheinlich
> mit Hintergrundspeicher. Dass Du tatsaechlich 2MB brauchen wirst, halte
> ich fuer mehr als nur etwas unwahrscheinlich.

Ich verwechsle gar nix.
Und wenn ich alle mapper und features einbauen wollte, würde ich schon 
auf 2 MB kommen.
Ich habe mich aber jetzt für einen anderen weg entschieden.

>> So, jetzt zum eigentlichen problem:
>> Wie stellt man es an, dass man jetzt beispielsweise funktionen aus dem
>> externen chip auf dem AT-MEGA ausführen kann.
>
> Geht nicht, da die Architektur das nicht vorsieht. Man kann bei den
> groesseren Megas lediglich den Datenspeicher auf 64KByte erweitern (16MB
> beim Xmega).

Geht ja wohl, und genau so will ich es jetzt auch machen.
Nur eben dass ich funktionen für die Mapper extern speichern will.
Diese funktionen, die in einer Art compilierter form vorliegen, werden 
von einen Interpreter gelesen und der Interpreter führt dann lokale 
funktionen daraus aus.

>> Sollte ich dazu irgendwie die funktionen importieren und dann ausführen?
>
> Geht nicht, da die Architektur Programm- und Datenspeicher trennt. Man
> kann lediglich mit Trickserei den Programmspeicher als Datenspeicher
> missbrauchen.

Und du hältst mich wohl für so blöd dass ich das nicht weis?
Was ich damit sagen wollte ist, dass es vielleicht besser währe so eine 
funktion (compilierte form) zuerst in den RAM -> Random Access Memory 
(oder zu deutsch schreib/lese speicher) zu laden und mit dem Interpreter 
von da aus zu bearbeiten.

>> Wenn ja, wie sollten die funktionen gelesen werden, immerhin will ich ja
>> ein kompiliertes programm laufen lassen
>
> Du solltest Dich erst einmal mit Grundlagen befassen, bevor Du solche
> Mondprojekte anstrebst. Dann wird das vielleicht auch mal irgendwann
> etwas.

Sag mal, kannst du eigentlich lesen?
>> Die ausgabe über ein PSP-Display funktioniert bereits sowie die ausgabe
>> von den guten alten Nintendo-gepiepse.
Also wenn ich soetwas programmieren kann, dann muss ich mich wohl 
bereits mit den grundlagen beschäftigt haben. Und dass ist auch nicht 
alles was ich bereits mit dem AT-MEGA gemacht habe.

>> zudem will ich aber keinen eigenen Kompiler/Decompiler schreiben.
>
> Ja ne, is klar :P

Ok, ich gebe zu die wortwahl ist nicht gerade die beste, dennoch muss 
ich einen Kompiler schreiben. Und was ich mit Decompiler meinte währe 
dann der Interpreter der dann in den Flash des Microcontrollers kommt.

> An die anderen: Auch wenn es Euch Spass macht. Dem Jungen jetzt auch
> noch einen ARM vorzuschlagen, duerfte wohl an Sinnlosigkeit kaum zu
> ueberbieten sein, oder?

An die anderen: Vielen dank für eure hilfe.

Sonst noch fragen?
Gast #1585106
Lesenswert?

Bentschi schrieb:
>> An die anderen: Auch wenn es Euch Spass macht. Dem Jungen jetzt auch
>> noch einen ARM vorzuschlagen, duerfte wohl an Sinnlosigkeit kaum zu
>> ueberbieten sein, oder?
Das verstehe ich jetzt auch nicht ganz! Was ist daran so schlimm 
jemanden einen ARM vorzuschlagen!?


> An die anderen: Vielen dank für eure hilfe.
Bitte und viel Erfolg!
#1585125
Lesenswert?

Bentschi schrieb:

> Und du hältst mich wohl für so blöd dass ich das nicht weis?

Ruhig Blut!

Anhand von kompakten und ausgesprochen verwirrend klingenden 
Fragestellungen das Kenntnisniveau des Fragestellers einzuschätzen ist 
eine höchst unsichere Sache.

Mal kommt auf Antworten dann "Hä? Bahnhof!" zurück (er klang besser als 
er ist), mal "für was hältst du mich, du ..." (andersrum).

Über die Jahre erlebt man in Foren die seltsamsten Ideen. Da kommt schon 
mal jemand auf den Gedanken, ein Handy (eigentlich ein GSM-Modem) selbst 
zu bauen, um es durch Weglassen überflüssiger Software-Funktionen 
deutlich kleiner bauen zu können.
Gast #1907310
Lesenswert?

>Man kann lediglich mit Trickserei den Programmspeicher als Datenspeicher
missbrauchen.

Mir geht gerade der Datenspeicher aus, wobei ich noch einiges an 
Programmspeicher frei hätte. Es geht hauptsächlich um Strings für 
Fehlerausgaben, die zur Laufzeit nicht mehr geändert werden.

Wie funktioniert denn die "Trickserei" mit der man den Programmspeicher 
als Datenspeicher missbrauchen kann? Mein Controller ist zwar ein XMega, 
aber eventrzuuell geht da ja da auch.

Vielen Dank
Tobi
#1907318
Lesenswert?

Hallo Tobi,

es würde mich wundern, wenn der XMega etwas nicht könnte, was die 
"einfachen" Megas können. Wie das genau geht, hängt davon ab, womit du 
programmierst. Bei Assembler gibt es spezielle Befehle, um Daten aus dem 
Flash zu holen, GCC hat spezielle LIB-Funktionen (finden sich in 
pgmspace.h), Codevision macht das AFAIK von selbst und transparent, wenn 
man Daten den Modifier "const" voran setzt.
Gast #1910625
Lesenswert?

Da werden Sie geholfen...

Ich verwende den GCC (glatt vergessen anzugeben).

Das Macro PSTR("Das ist der Teststring") legt den String im 
Programmspeicher ab. Dann gibt es in der LIB alle üblichen 
string-Funktionen (pgmspace.h) mit der Endung _P für den 
Programmspeicher, beispielsweise die sprintf_P(). Einzelne bytes können 
beispielsweise mit gm_read_byte_near(address_short) aus dem 
Programmspeicher ausgelesen werden, wobei das Attribut PROGMEM die 
Variable bei der Definition in dem Programmspeicher ablegt.

Ich hoffe ich habe damit dem ein oder einderen das suchen etwas 
erleichert.

Danke noch mal an Detlev.

Gruß
Tobi

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