Forum: Mikrocontroller und Digitale Elektronik 8051 externes RAM als Codespeicher (Beschaltung)


von itsme (Gast)


Angehängte Dateien:

Lesenswert?

Hallo Leute,

ich möchte einen 32k RAM Baustein an einen DS89C430 anschliessen, doch 
weiss ich nicht genau wie ich das tun soll, da ich nicht alle Pins habe, 
wie sie hier im Schaltplan sind.
Es soll so angeschlossen werden, dass Code aus dem Speicher ausgeführt 
werden kann, wie im angehängten Plan.

Die Pins, die im Plan sind, aber ich nicht habe sind RD# und WR#.
Ich habe am Controller:
 ALE/PROG# (im Plan ALE)
 PSEN# (im Plan PSEN#)
 EA

Jedoch brauche ich laut Plan RD# und WR#, da jedoch RD# und PSEN# über 
ein AND gehen, müsste es doch reichen nur das PSEN# an das erste AND 
(beide Inputs) gehen zu lassen und ist dann EA an meinem Controller 
gleich wie WR# in Plan?

Ich hoffe mir kann da jemand weiterhelfen...

von ds89c430 (Gast)


Lesenswert?

Schon mal ins Datenblatt geschaut?

PORT  ALTERNATE  FUNCTION
P3.0 RXD0  Serial Port 0 Receive
P3.1 TXD0  Serial Port 0 Transmit
P3.2  INT0  External Interrupt 0
P3.3  INT1  External Interrupt 1
P3.4 T0  Timer 0 External Input
P3.5 T1  Timer 1 External Input
P3.6  WR  External Data Memory Write Strobe
P3.7  RD          External Data Memory Read Strobe

Da ist doch alles, was Du brauchst!

von Thomas (Gast)


Lesenswert?

nun du musst es genauso machen wie in dem Plan und in den Controller den 
Paulmon flashen sonst geht es nicht!
Das Coderam liegt in diesem Beispiel bei 0x8000.

Thomas

von ingo (Gast)


Lesenswert?

Wenn Du auf den "movx a,@dptr"-Befehl verzichten kannst (Ersatz durch 
"clr a / movc a,@a+dptr"), könntest Du auch die ~RD weglassen und damit 
ein Portpin gewinnen. Hat sich bei mir gut bewährt.
mfG ingo

von itsme (Gast)


Lesenswert?

>Schon mal ins Datenblatt geschaut?

>PORT  ALTERNATE  FUNCTION
>P3.0 RXD0  Serial Port 0 Receive
>P3.1 TXD0  Serial Port 0 Transmit
>P3.2  INT0  External Interrupt 0
>P3.3  INT1  External Interrupt 1
>P3.4 T0  Timer 0 External Input
>P3.5 T1  Timer 1 External Input
>P3.6  WR  External Data Memory Write Strobe
>P3.7  RD          External Data Memory Read Strobe

>Da ist doch alles, was Du brauchst!

Omg, die alternate Funktionen habe ich natürlich nicht beachtet... Habe 
zwei Stunden gebraucht, bis ich das Eagle Symbol fürs Layout gebastelt 
hatte und irgendwie.. naja, Dummheit kennt keine Grenzen :D

>den Paulmon flashen sonst geht es nicht!
Das ist egal, was für Software da drin rennt, mein Controller ist per 
ISP Programmierbar, da brauch keinen extra Bootloader/Monitorprogramm 
dafür...

DANKE!

von itsme (Gast)


Lesenswert?

ingo schrieb:
> Wenn Du auf den "movx a,@dptr"-Befehl verzichten kannst (Ersatz durch
> "clr a / movc a,@a+dptr"), könntest Du auch die ~RD weglassen und damit
> ein Portpin gewinnen. Hat sich bei mir gut bewährt.
> mfG ingo
Hmm da ich mit 8051ern gerade erst Anfange, möchte ich nicht direkt auf 
einen Befehl verzichten, der mir mir von einer Adresse im Datenpointer 
direkt in den Akku lädt :)
Vorallem, vlt kommt ja noch C und das müsste ich irgendwie dem Compiler 
beibringen...

von ingo (Gast)


Lesenswert?

> das müsste ich irgendwie dem Compiler beibringen...
Dann geht es natürlich nicht so gut.
mfG ingo

von Graue Maus (Gast)


Lesenswert?

Pin 31 = /EA
Diese Leitung legt fest, ob der Programmspeicher intern oder oder extern 
genutzt wird. Schau dir mal das Datenblatt vom DS89C430 an.

von ds89c430 (Gast)


Lesenswert?

Mit /EA auf Low schaltet man den internen Programmspeicher komplett ab.
Dann kann man nur noch externen Speicher nutzen.
Im geposteten Fall wird durch die Verknüpfung von /RD und /PSEN auf den 
externen Programmspeicher zugegriffen. Wenn der externe Speicher nur als 
Datenspeicher genutzt wird, kann auf /PSEN verzichtet werden.

von Jobst M. (jobstens-de)


Lesenswert?

itsme schrieb:
> Das ist egal, was für Software da drin rennt, mein Controller ist per
> ISP Programmierbar, da brauch keinen extra Bootloader/Monitorprogramm
> dafür...

Dann brauchst Du doch auch keinen RAM, aus dem Du Code ausführen kannst.
Der ISP-Programmer kann nämlich keine Daten ins RAM schreiben.

Nachtrag: Dann nutze lieber die 18 frei gewordenen Ports für andere 
Sachen.


itsme schrieb:
> Hmm da ich mit 8051ern gerade erst Anfange, möchte ich nicht direkt auf
> einen Befehl verzichten, der mir mir von einer Adresse im Datenpointer
> direkt in den Akku lädt :)

Aber genau das tut MOVC A, @A + DPTR doch ...


Gruß

Jobst

von Bernhard S. (b_spitzer)


Lesenswert?

itsme schrieb:
> Hmm da ich mit 8051ern gerade erst Anfange, möchte ich nicht direkt auf
> einen Befehl verzichten, der mir mir von einer Adresse im Datenpointer
> direkt in den Akku lädt :)
>
> Vorallem, vlt kommt ja noch C und das müsste ich irgendwie dem Compiler
> beibringen...

Dem Compiler bringt man die gewünschten Speicherbereiche über Space 
Qualifier bei. Eine globale Variable (nur da geht die exakte Adresse, 
bei lokalen Variablen geht nur der Speicher-Bereich) kann man an eine 
beliebige Speicheradresse "tackern". Bei RIDE z.B.
xdata at 0x100 unsigned char Wert1, Wert2, Wert3;
Damit liegt Wert1 an 0x100, Wert2 an 0x101 etc. Weitere Speicherbereiche 
sind data (unteres RAM), idata (oberes RAM), code (ROM), bit (Bit im 
bitadressierbarem RAM), sfr und sbit.
Die Bit-Variablen kann man so z.B. über eine char-Variable legen und 
mehrere Bits so auf einen Schlag lesen oder schreiben.
bit at 0x00 Flag0, Flag1, Flag2, Flag3; // und so weiter...
data at 0x20 unsigned char AlleFlags; // liegt auf den Bitadressen 
0x00-0x07...

tschuessle
Bernhard

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.