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
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.
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.