PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Mega128 und 32KB externes SRAM



McNugget
20.12.2005, 18:51
Hallo da,

ich habe schon zum Thema gesucht, aber das einzige was ich finden konnte, waren Informationen diesbezüglich das MakeFile betreffend.
Es geht darum, dass ich gerne die GameBoyCamera auslesen möchte und die Daten nicht direkt per RS232 übertragen werden sollen.
Deswegen habe ich eine Platine mit einem 74LS573 und einem 32KB SRAM von Cypress gebaut, dass ich an meine Mega128 Platine anstecken kann.

Soweit so gut.

Jetzt das Problem: Da die Camera ein Format von 128*123 hat, wollte ich ein 8-Bit Array initialisieren, dass entweder
bild[128][123] oder
bild[16380] groß ist.
Das geht natürlich nur, wenn der externe Speicher auch läuft.

Dazu habe ich also folgende Zeile im Makefile freigeschaltet:
# 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

Weil das warscheinlich nicht reicht, habe ich in meiner Initialisierung noch das folgende programmiert:

MCUCR &= (1 << SRE);
XMCRA &= (~1 << XMBK);
XMCRB &= ~(1 << XMM2);
XMCRB &= (1 << XMM1);
XMCRB &= ~(1 << XMM0);

printf("MCUCR has the following value: %d\n", MCUCR);
printf("XMCRA has the following value: %d\n", XMCRA);
printf("XMCRB has the following value: %d\n", XMCRB);

Die printf-Befehle senden an meinen PC. Es kommt überall "0" heraus. Es gibt jetzt drei Möglichkeiten:
- man kann die Register so garnicht setzen und seswegen kommt null raus,
- man kann die Register so nicht auslesen
- oder beides... :P

Wie habt ihr externen Speicher initialisiert? Habt ihr vielleicht beispielcode für mich?
Muss ich was bei der Variablendeklaration beachten?

Gruß und danke,
Timo

McNugget
20.12.2005, 19:29
so, ich habe in der Tat die Register falsch gesetzt, jetzt mache ich es so:
MCUCR = 0x80;
XMCRA = 0x06;
XMCRB = 0x01;

Das Problem ist damit aber nicht behoben, denn wenn mein TestArray den Adressbereich von 4000irgendwas verlässt, was allein durch die deklaration geschieht, dann stürzt der AVR ab und startet neu.

Ich komme damit alleine nicht weiter. Per google konnte ich leider auch keinen Beispielcode für die Deklaration von 32KB externem Speicher finden :(

McNugget
20.12.2005, 20:30
Nachdem ich noch einen Verdrahtungsfehler - in Form eines falschherum gedrehten Steckers - behoben habe, und mir eine weitere Zeile im MakeFile aufgefallen ist, der mein vorheriges Wecken der 32k wieder zu Nichte machte, habe ich noch den Wert für die obere Grenze auf 0x8000 gesetzt:

EXTMEMOPTS = -Wl,-Tdata=0x801100,--defsym=__heap_end=0x808000

Leider startet der mega128 nun garnicht mehr mit diesen Einstellungen. Auch wird nicht versucht auf den Speicher zu zu greifen, zumindest kann ich keinerlei Regung erkennen.

Ich bin quasi für jede Hilfe offen!

Gruß Timo

McNugget
21.12.2005, 20:27
Hat niemand eine Lösung/Idee? :(

linux_80
21.12.2005, 22:59
Hallo,
hast Du schon mal andere Projekte betrachtet, wie die das machen ?
Mir fällt da immer Ethernut ein, dann könntest Du vergleichen.
Die Seite scheint aber zZt. nicht online zu sein, :-k
aber es gibt auch andere Projekte die ähnliches machen,
mal nach Ethernet und Mega128 suchen.

McNugget
21.12.2005, 23:19
Vielen Dank für die Antwort!
Ich brauchte dringend wenigstens einen Hinweis, wo ich zu suchen habe, denn Projekte die externen Ram verwenden gibt es scheinbar nicht so häufig :(

Ich werde mich da nochmal umsehen!

askazo
22.12.2005, 09:14
Ich habe zwar noch nicht selber damit gearbeitet, aber ich habe hier ein Projekt von einem Kollegen, bei dem ein externes 64k RAM am AT90CAN128 läuft. Vergleichen wir doch einfach mal die Einstellungen.

Erst mal habe ich mit mfile einen etwas anderen Makefile-Eintrag für 32k bekommen:
EXTMEMOPTS = -Wl,-Tdata=0x801100,--defsym=__heap_end=0x8090ff
Was auch logisch ist, denn 0x8090ff - 0x801100 = 0x7FFF = 32767

Mein Kollege hat sämtliche WaitStates ausgeschaltet. Wobei mir auffällt, dass Du WaitStates für den Lower Sector angegeben hast, obwohl gar kein Lower Sector aktiviert ist....

Ansonsten ist die einzige Abweichung, dass mein Kollege den BusKeeper eingeschaltet hat (XMBK in XMCRB).

Versuch mal Dein Glück mit diesen Einstellungen.
Wenn's nicht klappt, zeige mal bitte Deinen Schaltplan.

askazo

McNugget
22.12.2005, 11:59
Ok mache ich. Ich habe mfile garnicht verwendet. Ich hoffe das war einer der Fehler!
Leider komme ich erst heute nachmittag dazu....

Vielen Dank auch dir!

Gruß
Timo

McNugget
22.12.2005, 19:37
Ah, freude kommt gewissermaßen Teilweise auf:

Ich habe in meiner Not mal Bascom angeschmissen und durch Variablen spezielle Variablen meinen Speicher auf Funktionalität testen können:

Dim Testarray1(1024) As Xram Integer
Dim Testarray2(1024) As Xram Integer
Dim Testarray3(1024) As Xram Integer
Dim Testarray4(1024) As Xram Integer
Dim Testarray5(1024) As Xram Integer
Dim Testarray6(1024) As Xram Integer

Der Haufen ist ja definitiv größer als der normale Ram, weswegen er im SRAM liegen muss und insbesondere durch den Deklarationshinweis 'Xram' auch da rein gebastelt wird.

Das Programm füllt dann diese Arrays mit Daten und gibt die anschließend per RS232 aus. Das läuft tadellos! Allerdings halt nicht in C :/

Das bedeutet meine jüngst dreimal durchgemessene Schaltung läuft immerhin und es muss sich ergo um ein problem mit dem Programm oder den compileroptions handeln...

ich stelle gleich mal die sourcen online evtl ist das sinnvoll...

McNugget
22.12.2005, 19:49
kompletter Quellcode in C, geschrieben in ProgrammersNotepad 2.

Wäre super, wenn den jemand anschauen würde und dann auch noch den Fehler findet ;)
Also das Phänomen ist immernoch, dass der Mega128 mit eingeschalteten Compileroptionen für 32 KB externen Ram einfach nichts mehr macht. Es regt sich rein garnichts mehr...