ATmega128 + ext. SRAM: ein paar Unklarheiten

OP #1116644
Lesenswert?

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
Gast #1199904
Lesenswert?

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
#1200309
Lesenswert?

@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
OP #1200431
Lesenswert?

@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....

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