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.
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
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.
"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..
:-) 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.
.. wollte sagen: Die Power-up-Beschaltung deines Resetpins scheint falsch zu sein (zu langsamer/zu schneller Spannungsanstieg?); der Resetknopf an sich funktioniert ja...
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.
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...
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 :-)
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.