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
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.
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?
Danke euch beiden für die flotte Antwort. Es soll in ASM unter AVR Studio 4.13 geschrieben werden. mfg RolandB
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.
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
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.
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
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
>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.
Ist ein Datenlogger, somit springe ich keine Adressen direkt an. Sondern der Container soll nur gefüllt werden. Mehr eigentlich nicht :-)
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.
>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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.