8051 externes RAM als Codespeicher (Beschaltung)

Gast #1934523
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...
Angehängte Dateien:
Gast #1934541
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!
Gast #1934550
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
Gast #1934571
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!
Gast #1934574
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...
Gast #1934655
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.
#1934957
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
#1962824
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren