mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Gesucht: Tutorial zur Anbindung von externem SRAM an MEGA128/256


Autor: Timo Birnschein (Firma: MicroForge) (timob)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Leute,

ich stoße immer wieder auf diese Frage, da ich bisher erst einmal 
geschaft habe SRAM an einen MEGA128 anzubinden. Damals war eine 
zusätzliche Assember Datei notwendig, damit der externe Speicher zu 
allererst initialisiert wird, bevor irgendwas anderes passiert.

Ich frage mich zum einen, ob das immernoch notwendig ist und zum anderen 
ob es irgendwo ein Step-By-Step Tutorial gibt, das erklärt was genau zu 
tun ist um einen bereits laut Datenblatt angebundenen und verlöteten 
externen 64K Speicher an einen Mega128(0)/256(0) anzubinden.

Gruß und vielen Dank,
Timo

Autor: H.Joachim Seifert (crazyhorse)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hm, versteh deine Frage nicht, was willste da initialisieren?

Autor: Timo Birnschein (Firma: MicroForge) (timob)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Damals sollten die Register XMCRA und XMCRB bereits direkt zu Beginn 
gesetzt werden.
;; begin xram.S

#include <avr/io.h>

        .section .init1,"ax",@progbits
    ;; Activate externam memory interface and use all wait states the avr provides.
      ldi r16, _BV(SRE) | _BV(SRW11) | _BV(SRW10) | _BV(SRW01) | _BV(SRW00)
        out _SFR_IO_ADDR(XMCRA), r16    
    ;; Activate the buskeeper to save some current.
      ldi r16, _BV(XMBK)
        out _SFR_IO_ADDR(XMCRB), r16

;; end xram.S

Ich würde aber gerne, dass folgendes ausreicht:

int main(void)
{
  // Activate externam memory interface and use all wait states the avr provides.
  XMCRA = (1 << SRE) | (1 << SRW11) | (1 << SRW10) | (1 << SRW01) | (1 << SRW00);
  // Activate the buskeeper to save some current.
  XMCRB = (1 << XMBK);
}

Bevor ich wieder stundenlang nach dem Problem suche, warum meine CPU 
beim ersten benutzen einer Variable abraucht, wollte ich lieber fragen, 
ob es ein Tutorual dazu gibt... :)

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

>Bevor ich wieder stundenlang nach dem Problem suche, warum meine CPU
>beim ersten benutzen einer Variable abraucht, wollte ich lieber fragen,
>ob es ein Tutorual dazu gibt... :)

Und was verstehst du von den, was im Datenblatt steht, sogar mit 
Code-Beispiel, nicht?

MfG Spess

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Timo Birnschein schrieb:
> Damals sollten die Register XMCRA und XMCRB bereits direkt zu Beginn
> gesetzt werden.
> ...
> Ich würde aber gerne, dass folgendes ausreicht:

Nach "wollen" geht es aber nicht. Wann das External-Memory-Interface 
initialisiert werden muss, hängt davon ab, für was du den externen 
Speicher benutzen willst. Denn logischerweise muss es initialisiert 
sein, bevor es zum ersten Mal benutzt wird. Eine Initialisierung in Main 
ist nur dann nicht zu spät, wenn du keine der Standard-Sections in den 
externen Speicher legst, sondern ihn komplett selbst verwaltest. Wenn du 
aber z.B. die .data-Section dort platzierst, muss der 
Interface-Initialisierungscode natürlich vor den Code, den der Compiler 
für die Initialisierung von .data erzeugt.

Autor: Timo Birnschein (Firma: MicroForge) (timob)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Gut, dass es bei Mikroprozessorprogrammierung nicht ums "wollen" geht, 
ist mir auch klar - dazu bin ich lang genug dabei.

Stefan, ich verstehe deine Aussage. Mir reicht es, wenn ich mit malloc() 
während des laufenden Programms Speicher allokieren kann.

Dazu habe ich im Makefile folgendes einkommentiert:
#---------------- External Memory Options ----------------

# 64 KB of external RAM, starting after internal RAM (ATmega128!),
# used for variables (.data/.bss) and heap (malloc()).
#EXTMEMOPTS = -Wl,-Tdata=0x801100,--defsym=__heap_end=0x80ffff

# 64 KB of external RAM, starting after internal RAM (ATmega128!),
# only used for heap (malloc()).
EXTMEMOPTS = -Wl,--section-start,.data=0x802200,--defsym=__heap_end=0x80ffff

Also wird mein Speicher nur für den heap verwendet. Reicht es in diesem 
Fall aus das Speicherinterface in main() auf die von mir beschriebene 
Art zu initialisieren, oder muss ich zusätzlich noch etwas beachten?

Gruß
Timo

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Timo Birnschein schrieb:
> Also wird mein Speicher nur für den heap verwendet.

Meinst du? Kommt dir da das "--section-start,.data=0x802200" nicht 
irgendwie verdächtig vor?

> Reicht es in diesem Fall aus das Speicherinterface in main() auf die von
> mir beschriebene Art zu initialisieren

"diesem Fall" bezogen auf deine aktuellen Einstellungen: nein.
"diesem Fall" bezogen auf "nur Heap": ja.

Autor: Timo Birnschein (Firma: MicroForge) (timob)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Zugegen, sehr verdächtig. Ich finde lustig, das dies im ReferenzMakeFile 
so drin steht - als Hilfe.... :(

Kann ich das einfach löschen und abändern zu

EXTMEMOPTS = -Wl,--section-start,--defsym=__heap_end=0x80ffff

oder wie muss die Zeile aussehen? Ich würde meinen, dass ich den Anfang 
des Heap ebenfalls noch definieren muss und nicht nur das Ende.

Gruß und vielen Dank für den Hinweiß!

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Timo Birnschein schrieb:
> Zugegen, sehr verdächtig. Ich finde lustig, das dies im ReferenzMakeFile
> so drin steht - als Hilfe.... :(

Ich habe mal einen Bug-Report gemacht:
https://sourceforge.net/tracker/?func=detail&aid=2...

> oder wie muss die Zeile aussehen? Ich würde meinen, dass ich den Anfang
> des Heap ebenfalls noch definieren muss und nicht nur das Ende.
EXTMEMOPTS = -Wl,--defsym=__heap_start=0x802200,--defsym=__heap_end=0x80ffff

Autor: Timo Birnschein (Firma: MicroForge) (timob)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielen Dank! :)

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.