Forum: Mikrocontroller und Digitale Elektronik externes RAM am ATMEGA64


von Philipp P. (putzer_philipp)


Lesenswert?

Hallo zusammen!

Ich befasse mich gerade damit, ein externes RAM (64kByte) an einem Atmel 
Atmega64 anzubinden. Dazu hätte ich ein paar Fragen und ich hoffe ihr 
könnt mir ein wenig weiterhelfen!

Also:

1.)
Um den Ram anzubinden brauche ich ja ein Adresslatch. Im Datenblatt des 
64'ers steht, man soll für Taktrequenzen größer als 8MHz eines vom Typ 
74AHCxxx nehmen. (Seite 28 unten). Nur gibs so eines leider nicht bei 
Reichelt zu kaufen, dort gibts nur das 74HCTxxx. Weis jemand, ob ich 
auch das verwenden kann? (Taktfrequenz 16MHz)

2.)
Was für einen RAM könnt ihr mir empfehlen zu verwenden? Ich dachte da an 
einen HY62CT08081E, nur gibt es den (wieder) nicht bei reichelt. Da gibs 
zwar den: 62256-70 M (Statischer RAM, 32x8, 70ns) Geht der auch?

3.)
Wenn ich das Latch 74HCT573 und den RAM von reichelt verwende, passt da 
bei 16MHz ein Wartetakt, oder müssen es mehr sein?

4.)
Wenn ich den RAM nun in meinem Programm verwenden möchte, genügt es, 
dass ich im Makefile das einstelle und mein GCC-Compiler verwendet den 
dann als wäre er intern?
So, dass ich einfach meine Variablen anlege, und diese dann teilweise, 
oder direkt in das externe ram ausgelagert werden? Das wäre halt super!

5.)
Vielen Dank dass ich lästig sein durfte! Und schöne Grüße

von Frank J. (frajo)


Lesenswert?

Ich verwende an einem Mega162 den SN74HC573AN als latch und den 32K RAM 
von Reichelt. Geliefert wurde ein U62256ADK von ZMD. Datenblatt ist bei 
ZMD vorhanden. Ein Wartetakt reicht. In den oberen 32K liegt ein LCD mit 
der Ansteuerung nach Peter Fleury mit einem 74HC00. Der Takt ist 16MHz. 
Im Makefile wird der Speicher zugeordnet. Mehrere Varianten sind 
möglich. Bitte in der Beschreibung der avr-libc nachsehen. Bei mir:
1
EXTMEMOPTS = -Wl,-Tdata=0x800500,--defsym=__heap_end=0x807fff
Im Programm eine frühe Aktivierung des Speicherlayouts vornehmen. Etwa 
so:
1
 /*
2
 *  Using this definition, this function will be called by before main()
3
 */
4
5
void init_memory_mapped (void) __attribute__ ((naked)) __attribute__ ((section (".init1")));
6
7
8
/*
9
 * Setup the External Memory Interface early during device initialization
10
 */
11
12
void init_memory_mapped(void)
13
{    
14
#if defined(__AVR_AT90S4414__) || defined(__AVR_AT90S8515__) \
15
16
 || defined(__AVR_ATmega64__)  || defined(__AVR_ATmega128__) || defined(__AVR_ATmega103__) 
17
18
    /* enable external memory mapped interface with one wait state */
19
20
    MCUCR = _BV(SRE) | _BV(SRW);
21
22
#elif defined(__AVR_ATmega161__) || defined(__AVR_ATmega162__) || defined(__AVR_ATmega8515__)
23
24
    /* enable external memory mapped interface with one wait state for the entire external address space*/
25
26
    MCUCR = _BV(SRE) | _BV(SRW10);
27
28
#else
29
30
    #error "external memory mapped interface not available for this device"
31
32
#endif
33
}

Gruß
Frank.

von Philipp P. (putzer_philipp)


Lesenswert?

Super!!! Verdammt schnell!

Dann werde ich das wegen dem Makefile in der Beschreibung der avr-libc 
nachschauen, und den Rest so machen wie Du's beschrieben hast!


Nochmal vielen Dank und schöne Grüße

von Frank J. (frajo)


Lesenswert?

In der FAQ der avr-libc 'How to use external RAM?' lesen und dann dort 
dem Link 'discussion' zu 'Using malloc()' folgen. In meiner EXTMEMOPTS 
wird der interne RAM für den Stack verwendet. Variablen und Heap sind im 
externen RAM. Vom externen RAM ist der Bereich welcher vom internen RAM 
belegt wird, nicht nutzbar. In irgendeinem Atmel Dokument ist 
beschrieben, wie man auch 64K externen RAM und den internen RAM komplett 
nutzen kann. War mir aber zu aufwendig.

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.