Hallo, ich habe einen ATmega128 und werde ein externes SRAM (128k x 8) anschließen. Die Hardware ist fast soweit klar bis auf eine Sache: Kann ich das /CS vom RAM dauerhaft auf Low legen (keine weitere Komponente am Bus)? Oder muß ich das Signal mit irgendeinem speziellen Controllerpin schalten? So, nun zur Software. Hier gibt es auch diverse Unklarheiten: * mit dem SRE-Bit im Register MCUCR sage ich dem Controller, daß ein externes RAM dran hängt. Soweit noch kar. * Nun gibt es ja aber auch die Möglichkeit Wait-states anzugeben. Hier würde ich am Anfang mal 2 Wait-states angeben und später mal mit dem Oszi schauen, wie weit man runter gehen kann. * mit den Bits XMM2...XMM0 im Register XMCRB wähle ich aus, wie viele Adreßleitungen in benötige (ich brauche alle, daher alle Bits auf Null setzen). Soweit auch noch klar. * Was ist den das mit dem Bus-keeper (Bit XMBK im Register XMCRB)? * Das mit den Bits SRL2...SRL0 im Register XMCRB ist mir auch nicht ganz klar. Und wie spreche ich das externe SRAM mittels C-Code mit dem GNU-Compiler an (ich möchte mehrere lange Strings dort ablegen)? Was muß ich im Makefile angeben, daß ich ein externes RAM habe? Der Compiler muß das doch auch irgendwie wissen, daß ich externes RAM habe. Vielleicht hat jemand zufällig ein kleines Testprogramm vom Ansprechen eines externen RAM´s. Gruß Martin
Hab so ziemlich die selben Fragen. Allerdings habe ich ein 8Mbit SRAM und dadurch hab ich noch ein paar Portleitungen als Adressleitung im einsatz. Was aber rein programmtechnisch keinen all zu großen unterschied macht. Greetings, Alex
Ein 8Mbit SRAM kannst du aber nicht am XMEM Interface anschließen (So wie Martin).
@Martin, Der Buskeeper ist hier in der Anwendung uninteressant, er sorgt nur dafür das die Daten/Adressleitung auch bei Nichtbenutzung ihren zustand behalten. Mit den Register kannst du die Speicherbereiche aufteilen und ihnen je andere waitstates zuordnen, praktisch wenn man mehre Speicherbausteine am Bus hat, oder z.b. ein Display Memorymapped mit eingebunden hat, welches aber langsamer ist. Um den Speicher mit dem GCC nutzen zu können brauchst du in dein makefile eigentlich nur bei den Linkoptions folgende Zeile hinzufügen: LDFLAGS += -Wl,--section-start,.data=0x801200,--defsym=__heap_end=0x80ffff Das sagt dem Linker das der Heap bei 0x1200 anfängt und bei 0xffff aufhört. Dann legt er alle Variablen bis auf die die im Stack landen im externen Speicher ab. Der Stack befindet sich dabei im internen RAM, und sollte dort auch bleiben, da das interne RAM schneller ist. Schau einfach mal in die Doku der avr-libc, dort ist das nochmal sehr gut erklärt. Wichtig ist auch, da du 128Kx8 benutzt, das A16 auch irgendwie verdrahtet wird, und nicht in der Luft hängt. Speziell wenn du A16 an den Controller mit anschließt, sorge dafür das der entsprechende PIN auch ein Ausgang ist, bei einen Eingang kommt es sonst zu Fehlern da der PIN sonst in der Luft hängt. Ich habe Stunden damit verbracht den Fehler zu finden :-). CA Dirk
@Dirk: danke für dei Infos. In der Zwischenzeit habe ich das RAM zum laufen gebracht. Wenn man es richtig herum auf das Starterkit auflötet, dann funktioniert es auch grins. Daß es falsch herum drauf ist, habe ich nur dadurch rausgefunden, daß ich mir ein paar RAM-Routinen selbst geschrieben habe. Wenns geraucht hätte, hätte ich den Fehler Tage zuvor schon gefunden....
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.