www.mikrocontroller.net

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


Autor: Frank Labudda (frank-l)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Andreas Paulin (Firma: PAN Microsysteme) (paulin)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Frank Labudda (frank-l)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Andreas Paulin (Firma: PAN Microsysteme) (paulin)
Datum:

Bewertung
0 lesenswert
nicht 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..

Autor: Frank Labudda (frank-l)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Andreas Paulin (Firma: PAN Microsysteme) (paulin)
Datum:

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

Autor: Frank Labudda (frank-l)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Andreas Paulin (Firma: PAN Microsysteme) (paulin)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Frank Labudda (frank-l)
Datum:

Bewertung
0 lesenswert
nicht 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 :-)

Autor: Andreas Paulin (Firma: PAN Microsysteme) (paulin)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Frohlocket :)

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.