Forum: Mikrocontroller und Digitale Elektronik ATmega128 + ext. SRAM: ein paar Unklarheiten


von Martin M. (martin69)


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

von Alex (Gast)


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

von Gast (Gast)


Lesenswert?

Ein 8Mbit SRAM kannst du aber nicht am XMEM Interface anschließen (So 
wie Martin).

von Dirk B. (sharandac)


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

von Martin M. (martin69)


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

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.