Forum: Compiler & IDEs ATMEGA 128 und ext. Speicher


von wolf4124 (Gast)


Lesenswert?

Hallo

Ich bin neu in der C-Welt.
Ich habe an meinem ATMEGA128 ein Gerät anden externen Adress-Datenbus
angeschlossen. Es wird wie ein externers RAM angesprochen.
Wie kann ich in C "Einbinden".
Nemmen wir an es reagiert auf die ersten 2 Adresse (Extern) (0x0 und
0x1).
Kann ich eine Variable sagen, das sie im Externen Bereich 0x0 und 0x1
angelegt werden soll, oder muß ich noch etwas hinzu rechnen?
Welchen Befehle brauche ich für das "externe Ansprechen" .

Bin für jede hilfe dankbar.

Gruß

von Andre (Gast)


Lesenswert?

Ganz einfach:

volatile unsigned char *ExtMem =(unsigned char*) 0x2000;

  und

*ExtMem = 0x55;


Bei den ersten Adressen musst Du aufpassen, damit sprichst Du das
interne RAM an. Einfach ins Datenblatt schauen.

von Patrick D. (oldbug) Benutzerseite


Lesenswert?

Suche hier mal nach "extmem", das sollte einige Beiträge liefern...

Hier einer meiner Beiträge:

http://www.mikrocontroller.net/forum/read-2-153966.html#153966

Vielleicht hilfts...

von wolf4124 (Gast)


Angehängte Dateien:

Lesenswert?

Hallo

Ich habe die Datei mal mit angehängt.
Ich habe meinen ATMega 128 vorher gekillt.
Anderer Grund. Sag ich lieber nicht warum. (;-)
Habe jetzt einen ATMega162.
Habe die Adresse aus dem Datenblatt.
Haut aber leider nicht hin.
Haben den Link von dir Patrick durchgelesen --> Brauche erst wieder ein
paar Minuten um zu mir zu kommen.
Habe gelesen, das man im Makefile den Speicher auch noch aktivieren
muß.
Habe aber so viele Auswahlmöglichkeiten.
Ich brauche nur 8 Adressleitungen. Also brauche ich nur 256 weitere
Adressen (0100h).Das währe dan doch der Bereich von 0500h bis 0600h.
Oder?
Vielleicht kann mal einer kurz über meine Datei drüberschauen, ob ich
noch einen Denkfehler drin habe.

Gruß und Danke

Wolf

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

> Habe gelesen, das man im Makefile den Speicher auch noch aktivieren
> muß.

Nein, nur, wenn man dort normale Variablen vom Compiler ablegen lassen
will.

von wolf4124 (Gast)


Lesenswert?

gut, weil das hatte ich auch icht vor.
Kann es sein, das ich einen falschen Adressbereich habe?
Oder das ich etwas bein "einschalten" falsch gemacht haben?

Gruß

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

> Kann es sein, das ich einen falschen Adressbereich habe?  Oder das
> ich etwas bein "einschalten" falsch gemacht haben?

Sehe ich erstmal nichts.

Du wirst wohl mal einen Oszi dranklemmen müssen.

Wird denn der /RD-Impuls ordentlich weitergeleitet?

Random remarks:

> #include <avr\io.h>

Bitte Vorwärtsstriche nehmen, auch unter Windows.  Das verbessert die
Portabilität.

> #include <stdint.h>  //Weis noch nicht wo für

Um deine privaten Hacks abzulösen. ;-)

Statt BYTE also z.B. uint8_t nehmen.  Das ist mittlerweile (C99)
standardisiert.

> DDRA = 0xff;  //Port B als Ausgang setzen

Nicht nötig.  Ist ja ohnehin ein Ein- oder Ausgang, je nachdem, ob du
liest oder schreibst.  Wenn SRE gesetzt ist, wird die normale
Portlogik hier überschrieben.

> EMCUCR |=(1<<SRW00);//Wait Status auf die längste Zeit stellen
> EMCUCR |=(1<<SRW01);//Wait Status auf die längste Zeit stellen
> EMCUCR |=(1<<SRW10);//Wait Status auf die längste Zeit stellen
> EMCUCR |=(1<<SRW11);//Wait Status auf die längste Zeit stellen
> SFIOR |=(1<<XMM0);  //Adressbit's A08 bis A15 ausschalten
> SFIOR |=(1<<XMM1);  //Adressbit's A08 bis A15 ausschalten
> SFIOR |=(1<<XMM2);  //Adressbit's A08 bis A15 ausschalten

Die kannst du besser in zwei Zeilen zusammenfassen.

Nein, halt mal, nicht ganz.  SRW10 ist im MCUCR, nur die anderen Bits
sind im EMCUCR.  Du musst auch nur eine Hälfte der Bits setzen, sofern
du keine Sektorierung des externen Speichers brauchst (SRL0..2).  Da
du diese nicht benutzt, ist alles by default `upper sector', damit
genügen SRW10 und SRW11.  Also:
1
EMCUCR = (1 << SRW11);
2
SFIOR = (1 << XMM0) | (1 << XMM1) | (1 << XMM2);
3
MCUCR = (1 << SRE) | (1 << SRW10);

Hmm:

> Kann es sein, das ich einen falschen Adressbereich habe?

Vielleicht ja doch?

``Since the external memory is mapped after the internal memory as
shown in Figure 11, only 64,256 Bytes of external memory are available
by default (address space 0x0000 to 0x05FF is reserved for internal
            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
memory).''
^^^^^^

Vielleicht solltest du ja die Pointer auf 0x600 und 0x601 legen?

von wolf4124 (Gast)


Lesenswert?

Hallo

Danke für deine Antwort.
Ich habe nochmal im Datenblatt nachgeschaut.
Meine Freundin sagt zwar auch das ich nicht sehe, aber ich sehe in der
Grafik, wo der Speicherbereich auf intern und extern dargestellt ist,
das der Interne bei 04FFh endet und bei 0500h der externe anfängt.
Ich verwende einen ATMega162.
Habe es aber auch mit der Adresse 0600 usw probiert.
Haut leider auch nicht hin.
Hast du vielleicht noch eine Idee.

Gruß

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

> Hast du vielleicht noch eine Idee.

Ja, schon geäußert: nimm einen Oszi.

von Patrick D. (oldbug) Benutzerseite


Lesenswert?

Btw.:

> DDRA = 0xff;  //Port B als Ausgang setzen

DDRA ist für PORTA Zuständig, was aber an Deinem Problem nichts
ändern wird...

von wolf4124 (Gast)


Lesenswert?

Hallo

Habe alles nachgemessen.
Ich habe Datenverkehr auf den Ausgängen des AVR.
Ich verwende ein 74HC573 Adresslatch.
Wenn ich die Ausgänge des Latches offen habe müsste ich doch eswas
messen können.
Egal, ob ich das Latch auf high oder low oder mit Flanke triggere.
Die Ausgänge bleiben immer low.
Der OE habe ich natürlich auch mit low und high probiert.
Keine Änderung.
Müssen die Ausgänge des Latches mit Pullupwiderständen auf High gezogen
werden?
Das Gleiche Problem habe ich bei einem 74HC274, welches ich als Treiber
verwende.


Gruß

Gruß

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

> Müssen die Ausgänge des Latches mit Pullupwiderständen auf High
> gezogen werden?

Nein, die sind aktiv.

/OE muss low sein.  Strobe sitzt auf ALE.  Mit der steigenden Flanke
von /RD werden die Daten eingelesen, du könntest also auf die fallende
Flanke von /RD den Oszi triggern und dann die Leitung A0 mit dem
zweiten Kanal verfolgen.  Oder du triggerst mit der fallenden Flanke
von ALE.

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.