www.mikrocontroller.net

Forum: Compiler & IDEs ATMEGA 128 und ext. Speicher


Autor: wolf4124 (Gast)
Datum:

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

Autor: Andre (Gast)
Datum:

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

Autor: Patrick Dohmen (oldbug) (Moderator) Benutzerseite
Datum:

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

Vielleicht hilfts...

Autor: wolf4124 (Gast)
Datum:
Angehängte Dateien:

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

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

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

Autor: wolf4124 (Gast)
Datum:

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

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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:
EMCUCR = (1 << SRW11);
SFIOR = (1 << XMM0) | (1 << XMM1) | (1 << XMM2);
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?

Autor: wolf4124 (Gast)
Datum:

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

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Hast du vielleicht noch eine Idee.

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

Autor: Patrick Dohmen (oldbug) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Btw.:

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

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

Autor: wolf4124 (Gast)
Datum:

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

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

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

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.