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ß
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.
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...
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
> Habe gelesen, das man im Makefile den Speicher auch noch aktivieren > muß. Nein, nur, wenn man dort normale Variablen vom Compiler ablegen lassen will.
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ß
> 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?
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ß
> Hast du vielleicht noch eine Idee.
Ja, schon geäußert: nimm einen Oszi.
Btw.:
> DDRA = 0xff; //Port B als Ausgang setzen
DDRA ist für PORTA Zuständig, was aber an Deinem Problem nichts
ändern wird...
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ß
> 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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.