Forum: Mikrocontroller und Digitale Elektronik SRAM am Atmega162


von Roland B. (rolandb)


Lesenswert?

Hallo,

mein Projekt benötigt eindeutig mehr SRAM als es die internen 
Speichergrößen zulassen. Ich dachte da jetzt an den Atmeg162 mit 
Speichererweiterung. Habe mir dieses Modul ausgesucht:
http://www.reichelt.de 628512-55 M

Erstmal müsste das doch zumidenst für die 64Kx8Bit richtig sein?

Es ist ein 512kx8Bit, da aber der Atmega nur 64kx8Bit ansprechen kann 
liegt ein großer Teil brach. Kann man mit Trickfunktionen trotzdem an 
die höheren Bänke ran? Ich denke da an einige Zusatz-PinXX um die 
höherwertigen Adressen ansprechen zu können, aber das denke ich mal wird 
nicht gehen, da ich den Atmega mit XMEM initialisiere und er dann 
durcheinanderkommt?
Desweitern ist eine Taktung von 16Mhz vorgesehen -> somit Zeiten um 55ns 
Zugriff zwingend.

Habe nicht wirklich Informationen im Forum finden können.

mfg
RolandB

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Du kannst die weiteren Bänke schon benutzen, du musst dich dann eben
nur um die Umschaltung kümmern.

Rückgriff auf mein CP/M-System vor 20 Jahren: 384 KiB RAM angeschlossen.
Da die CPU nur 64 KiB verwalten kann, wurde der Rest als Floppylauf-
werksemulation angesprochen.  Vor dem Ummappen des RAMs musste man
natürlich alle Interrupts sperren, dann wurde der angeforderte
,,Sektor'' gelesen oder geschrieben (ging mit DMA vergleichsweise
rasend schnell), danach Zurückmappen des Arbeitsspeichers und Freigabe
der Interrupts.

Ein ähnliches System müsstest du für deinen überschüssigen RAM auch
benutzen können.

von crazy horse (Gast)


Lesenswert?

in Assembler ist das überhaupt kein Problem. Einfach ein paar 
stinknormale I/Os an die restlichen Adresseingänge des RAM pappen, 
fertig. Nur - einem Compiler wird das schwierig beizubringen sein. In 
welcher Sprache willst du denn programmieren?

von Roland B. (rolandb)


Lesenswert?

Danke euch beiden für die flotte Antwort. Es soll in ASM unter AVR 
Studio 4.13 geschrieben werden.

mfg
RolandB

von crazy horse (Gast)


Lesenswert?

jo, dann ist das wie schon gesagt, kein Problem. Musst natürlich ein 
wenig aufpassen. Der Stack z.B. sollte dann nicht im externen RAM 
liegen.
Und du verlierst in jeder Bank die unteren 1,2k, aber das dürfte nicht 
so tragisch sein.

von Roland B. (rolandb)


Lesenswert?

Danke.

Meine Idee:

64Kbyte 1.Bank:
XMEGA Atmega162 AD0..AD7 und A8..A15 -> Speicher A0..A15
XMEGA Atmega162 D0..D7          -> Speicher D0..D7
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
dazwischen ein Latch mit ALE vom Atmega
=17 Leitungen+

2 Leitungen für höherwertige Bänke bin/dez Wandler

Kombination:
0  1   -> A16   128Kbyte
1  0  -> A17  256Kbyte
1  1  -> A18  512Kbyte
=19 Leitungen+

dazu kommen:
XMEGA Atmega162 /RD  -> Speicher /OD
XMEGA Atmega162 /WE  -> Speicher /WE
=21 Leitungen

---------------------------------------------------------
Ich glaube da ist aber ein gewaltiger Gedankenfehler drinne.. muss 
nochmal in meinen Heftern gucken.

Kann man aber nicht mittels einem Zähler die Adressen hochlaufen lassen? 
Ein externer Zähler der einfach nur getacktet wird und die Adressen 
autonom inkrementiert? Ich brauche keinen Wahlfreien Zugriff, 
sequentiell ist vollkommend ausreichend.

Danke
RolandB

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

crazy horse wrote:

> Nur - einem Compiler wird das schwierig beizubringen sein.

Einbildung ist auch eine Bildung...  Warum bitte soll man GPIOs einem
Compiler nicht beibringen können?  Was glaubst du, was all diejenigen,
die einen AVR in C programmieren, mit diesem machen?  Numerische
Berechnungen mit Ausgabe auf stdout?  (Selbst dann müssten sie sich
noch drum kümmern, was zu implementieren, was hinter stdout steht.)

Selbstverständlich kann man sowas auch mit einer höheren Programmier-
sprache machen.  Es ist halt nur eine Frage der Datenorganisation,
was man dort ablegt.

von Helmut L. (helmi1)


Angehängte Dateien:

Lesenswert?

Hallo Roland

Wenn du eine Schaltung suchst wo du deine 512Kbyte Ram vollstaendig 
ansprechen kannst versuch mal diese Schaltung.
Bei dieser Schaltung hast du in den unteren 32Kbyte eine feste RAM 
zuordnung die sich auch nicht aendert. Dann folgen in den naechsten 16 
Kbyte ein sogenanntes Pagefenster wo sich 32 Pages RAM a 16 Kbyte 
ansprechen lassen. Diese Page wird durch einen 4 Bit Output Port vom 
Prozessor gesteuert. So hast du in den unteren 32 Kbyte des 
Addressraumes eine feste RAM zuordnung wo du auch z.B den Stack 
unterbringen kannst und dann ein 16 Kbyte grosses Pagefenster wo du den 
Rest des RAMS verwalten kannst. Du must dir dann nur noch eine kleine 
Speicherverwaltungsroutine schreiben die dir aus lineraren Addressen die 
Pageaddressen generiert.
Ich habe so etwas schon mal mit einen 68HC11 Prozessor gemacht der auch 
nur 64 Kbyte addressieren konnte.
Es gibt auch Compiler die den Code auf verschiedene Speicherbaenke 
aufteilen koennen und selbst die notwendige Pageumschaltung 
bewerkstelligen.

z.B. Keil-Compiler fuer 8051, Cosmic - Compiler fuer 68hC11.

bei den Compilern gibt man beim Linken nur die Page an wo es gespeichert 
werden soll den Rest erledigt dabei der Linker.

Gruss Helmi

von Roland B. (rolandb)


Angehängte Dateien:

Lesenswert?

Habe es mir anders überlegt. Undzwar nehme ich ein Zähler 74HC590. Ist 
zwar ein asyn Zähler, wurde aber des öfterem im Forum lobend erwähnt. 
Ich möchte jetzt einfach squentiell speichern, da mir die Pins viel zu 
schade sind. Allerdings weis ich jetzt nicht ob ich das Datenblatt 
richtig verstanden habe. Habe deswegen mal am Anhang meine Version 
angehangen. Es kommt ein Atmega128@16Mhz zum einsatz.

mfg
RolandB

von holger (Gast)


Lesenswert?

>74HC590

Dir ist klar das du bis zur gewünschten Adresse
auch entsprechend viele Clocks ausführen musst ?
Ich hätte da ja doch eher zwei 8 Bit Schieberegister
mit Output Latch genommen.

von Roland B. (rolandb)


Lesenswert?

Ist ein Datenlogger, somit springe ich keine Adressen direkt an. Sondern 
der Container soll nur gefüllt werden. Mehr eigentlich nicht :-)

von Roland B. (rolandb)


Lesenswert?

Ich glaube ich habe einen Denkfehler?!

Kann ich mit der angehangen Schaltung einfach mittels externen Portpin 
(#3) den Speicher voll ausnutzen? Ich überlege die ganze 'Zeit und bin 
der Meinung das es geht. Allerdings ist es schon etwas spät.. :-)

Page1 Page2 Page3     Speicher
0     0     0         untere 64kB
1     0     0         1. Offset, aber 64kB
0     1     0         2. Offset, aber 64kB
.
.
.
1     1     1         7.Offset, aber 64kB

----------------------------------------------
7 Offset -> 7*64Kb =448kByte
                  + 64 Kbyte
-----------------------------
                   =512Kbyte

Kann es da zu Probleme mit dem Assembler kommen? Meine Messaufnahme soll 
so funktionieren:
Kontinuierliche Aquise über SPI und die Daten in den XMEM schieben bis 
n*64kByte erreicht ist (zum anfang ist n=1, soll später aber bis zu n=8 
erhöht werden können).

mfg
RolandB.

PS: Es soll nun doch ein SRAM direkt angesprchen werden mittels XMEM 
Port.

von Roland B. (rolandb)


Angehängte Dateien:

Lesenswert?

Verdammig..

von holger (Gast)


Lesenswert?

>Kann ich mit der angehangen Schaltung einfach mittels externen Portpin
>(#3) den Speicher voll ausnutzen?

Nicht ganz. Im unteren Speicherbereich wird erstmal das interne
RAM vom AVR angesprochen. Beim ATmega162 also bis 0x4FF. Das kann
man im externen RAM Block nicht benutzen. Du hast also keine kompletten
64kB Blöcke zur Verfügung. Es sind 64kB - 0x500 Blöcke.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Man kann mit Tricks auch noch den Rest ansprechen.  Beispielsweise
könnte man mit XMM0=1 behaupten, dass man PC7 als normalen IO-Pin
benutzt und nur 32 KiB externen SRAM am Stück anspricht.  Diese
32 KiB erreicht man dann über den zusammenhängenden Adressbereich
0x8000 ... 0xFFFF.  Je nachdem, ob man nun PC7 auf low oder high
setzt (ist ja ein normales GPIO-Pin), kann man zwei verschiedene
“pages” zu je 32 KiB auswählen, auf die zugegriffen wird.

Ob das den Aufwand lohnt bzw. für die jeweilige Anwendung sinnvoll
ist, muss man von Fall zu Fall entscheiden.

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.