Forum: Compiler & IDEs Startprobeleme mit Externem RAM am Mega-2560


von Frank L. (frank-l)


Lesenswert?

Nachdem ich viel über dieses Forum gelernt habe, werde ich nun auch mal 
meinen ersten Beitrag schreiben.

Zunächst kurze Beschreibung:

Die MCU liegt auf einer Platine zur Ein-Ausgabe von Daten für die 
Steuerung von mobilen Signalanlagen ( also mit Tastatur & Display ).

Ich habe einen externen RAM ( LP621024DM-70LL ) an meinem ATMega2560 .

Da mein Interer Speicher nun langsam nicht mehr ausreicht wollte ich nun 
mein Internes RAM ( ausser den Stack ) komplett auslagern.

Nach der Suche hier im Forum bin ich auch auf folgenden Ansatz gestoßen.

Zunächst habe ich vor dem main() folgendes eingefügt, um den externen 
RAM zu initialisiern:

   void init_extSRAM(void) 
__attribute__((used,naked,section(".init3")));
   void init_extSRAM(void)
   {
     XMCRA = 1<<SRE | 1<<SRL0 ;      // 0x2200 - 0xFFFF: 0 Wait
     XMCB = 1<<XMBK;
   }

im Linker habe ich folgende Zeile eingefügt:

    -Wl,--section-start=.data=0x802200

Nun müsste ich doch folgenden Speicher-Aufbau generiert haben:

    0x0000 - 0x21FF     =  Stack
    0x2200 - 0xFFFF     =  Rest des internen RAM ausgelagert ins 
Externe.


Soweit so gut mein Programm läuft auch beim reinschieben in die MCU. Nur 
wenn ich nun meine Spannungsversorgung aus-/anschalte, dann zeigt auf 
einmal mein Display nichts mehr an. Wenn ich nun meinen SPI-Stecker 
wieder dranmache und den Reset-Knopf auf meinem STK drücke, dann kommt 
auch die Anzeige wieder und alles läuft super.
Sieht für mich irgendwie so aus als wenn die Variablen falsch 
Initialisiert werden oder garnicht aber komm auch mit dem Ansatz nicht 
weiter.

von Andreas P. (Firma: PAN Microsysteme) (paulin)


Lesenswert?

Schau mal hier:

Beitrag "AVR Studio und externes RAM"
Beitrag "Externes Speicherinterface Hintergrundwissen"

Weitere Info über Speicherverwaltung etc:
http://www.nongnu.org/avr-libc/user-manual/malloc.html

SPI ist fürs Display, nehme ich an?
Dein Problem scheint auch irgendwas mit dem Power-up-reset zu tun 
haben...


EXRAM-Check: Wenn Du nicht sicher weißt, obs funktioniert, lass doch mal 
durchzählen. Ungefähr so:

exramptr = 0x2100; // nicht 0x802100 ,-)
while (exramptr =!__heap_end)
{
uint8_t *tmp;
*tmp=*exramptr;
*exramptr=0x55;  // z.B.
if (*exramptr !=0x55)
{display_error(exramptr)}
*exramptr=*tmp;
exramptr++
}


Grüßle

Andreas Paulin

von Frank L. (frank-l)


Lesenswert?

Andreas Paulin schrieb:

>
> SPI ist fürs Display, nehme ich an?
> Dein Problem scheint auch irgendwas mit dem Power-up-reset zu tun
> haben...
>
>

Nein über SPI programmiere ich lediglich meine MCU. Das Display ist 
direkt parallel am MCU angeschlossen.

Ich denke mal mein Auslagern ins Externe RAM funktioniert auch soweit, 
weil ich einfach mal meinen Interenen Speicher so voll gemacht habe, das 
die AVR-Anzeige auf über 120% auslastung kommt. Das heisst mein Stack 
würde beim starten direkt Fehler verursachen wenn meine Daten denn immer 
noch im Internen RAM liegen würden.

Mein Problem nochmal ist folgendes. Beim Neubespielen der MCU 
funktionert alles wunderbar.

Nehme ich nun meine Platinen vom Strom, dann bekomme ich keine Anzeige 
mehr im Display.

Resete ich nun meine MCU durch den Reset Knopf oder durch absichtiges 
auslösen des Watch-Dog, dann läuft alles seinen gewohnten Weg.

von Andreas P. (Firma: PAN Microsysteme) (paulin)


Lesenswert?

"Nehme ich nun meine Platinen vom Strom, dann bekomme ich keine Anzeige
mehr im Display."
Hm, eigentlich nicht ungewöhnlich *gg.....

"Resete ich nun meine MCU durch den Reset Knopf oder durch absichtiges
auslösen des Watch-Dog, dann läuft alles seinen gewohnten Weg."

Dann ist Dein Resetpin irgendwie nicht richtig beschaltet.
Signalverlauf dort?
Kann der Resetpin evtl. durch Fuses etc. deaktiviert werden?

Oder Deine Versorgungsspannung steigt zu langsam an..

von Frank L. (frank-l)


Lesenswert?

:-) bissle verschrieben. Aber du wusstest ja was ich mein.

Aber bevor ich das mit dem externen RAM gemacht habe, hats ja auch 
funktioniert :-).

Habe jetzt mal einen Text direkt nach der Initialisierung ausgegeben und 
das macht er auch nach einem Power-On-Reset ( also von mir direkt am 
Netzteil ).

Da er danach nicht in seinen Anzeige-Routinen weiterläuft geh ich mal 
schwer davon aus, das die Variablen, die zum Springen in den 
Masken-Routinen gebraucht werden falsch initialisiert sind und ich 
deshalb nix sehe.
( Licht geht auch nach 2 min aus also muss MCU laufen. ) Kann jetzt 
natürlich jede einzelne Variable explizit nach der Deklaration mit den 
Startwerten füllen aber ich dachte eigentlich, dass das automatisch 
gemacht wird auch im exterenen RAM.

von Andreas P. (Firma: PAN Microsysteme) (paulin)


Lesenswert?

.. wollte sagen:
Die Power-up-Beschaltung deines Resetpins scheint falsch zu sein (zu 
langsamer/zu schneller Spannungsanstieg?); der Resetknopf an sich 
funktioniert ja...

von Frank L. (frank-l)


Lesenswert?

Ich werde dem mal nachgehen. Wobei ich immer noch nicht verstehe warum 
auf einmal, nur weil ich das RAM ausgelagert habe, der Reset-Pin davon 
beeinträchtigt sein soll.

von Andreas P. (Firma: PAN Microsysteme) (paulin)


Lesenswert?

Hi, Frank,

mir ist noch was aufgefallen: Du schreibst:

   void init_extSRAM(void)
   {
     XMCRA = 1<<SRE | 1<<SRL0 ;      // 0x2200 - 0xFFFF: 0 Wait
     XMCB = 1<<XMBK;
   }

Hast Du das aus Deinem Sourcecode kopiert?
Weil: XMCB gibts nicht. Nur XMRCB.

Da müsste der Compiler aber einen error ausgeben...

von Frank L. (frank-l)


Lesenswert?

Hi an alle.

Habe den Fehler nun heut morgen gefunden.

Bei der Beschaltung des externen RAM musste ich den Adress PinA16 auf 
einen anderen Port legen ( damit ich mir die möglichkeit bereit halte 
vielleicht sogar 128k zu benutzen ). Diesen Pin habe ich aber nicht 
Initialisiert und deshalb hat er diesen Mist gemacht.

Danke für die Hilfe. Juhu es geht :-)

von Andreas P. (Firma: PAN Microsysteme) (paulin)


Lesenswert?

Frohlocket :)

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.