Forum: Mikrocontroller und Digitale Elektronik Port-Restore am 8051 möglich ?


von THaala (Gast)


Lesenswert?

An meiner p89lv51rd2 - Baisschaltung ist ein CPLD 9572 angeschlossen, 
der
die Adressdekodierung für den 8051 übernimmt. Es ist einiges an externen 
Bausteien angeschlossen z.B. Ram Speicher. Ich habe auch zwei 8 Bit 
Ports die als input und output angesteuert werden können. Aber eben über 
einen externen Adressbreich und nicht über die Port Pins P0/P2 des 8051.

Gibt es eine Möglichkeit am 8051 die Ports P0/P2 die für die externe 
Addressierung nötig sind zu restaurieren ? Für den Motorola HC11 gab es 
einen zusätzlichen Chip der die Ports zurückbrachte.

Die IO's am 8051 sind ja recht einfach, aber wie wären die Bedingungen 
um dem 8051 den P0/P2 als IO "vorzugaukeln"?

Es ist klar das der 8051 beim Zugriff af P2/P0 kein Steuersignal nach 
außen gibt, aber wenn mann die realen IO - Inputs über das CPLD "weak" 
auf P0/P2 legt könnte man den realen Wert zurücklesen. Die Unterscheide, 
die sich ergeben - (es können nur L - Pegel anliegen wo es H - Pegel 
erwartet wurden - nicht umgekehrt) wären relevant um zwischen In und Out 
zu Unterscheiden. Dieses Wissen könnte man nutzen um die Richtung am 
realen IO auf Out - zu stellen und dort ein "L" anzulegen.

Ich bin nicht sicher ob ich das vernünftig erklärt habe.
Habe ich was übersehen ? Kann das so klappen ?


Gruß
THaala

von Peter D. (peda)


Lesenswert?

P2 wird ja nicht zerstört.
P0 wird auf FF gesetzt.

Es ist mir allerdings rätselhaft, wie Du P0/P2 bei Benutzung als 
externer Bus auch noch als IO verwenden willst.
Als Input zerstören Sie Dir den Buszugriff und als Output hast Du immer 
jeden Buszugriff mit drauf.

Wenn man IOs am Bus haben will, macht man das memory mapped 
(74HC541/74HC574).


Peter

von THaala (Gast)


Lesenswert?

Hallo Peter,

für den externen Zugriff gibt es ja die Signale (ALE, WR, RD). Wenn ein 
externer Zugriff im Gange ist muß die Mimik natürlich disabelt werden. 
Aber auch nur zwischen dem 8051 und dem CPLD - nicht am realen IO des 
CPLD.

Der 8051 hat ja feste Clock - Zeiten indem er diese Samples am IO nimmt 
bzw. setzt. Nur dann müssten die Signale vom realen IO an den 8051 
durchgestellt werden.

Man müsste also - wenn ALE,RD oder WR aktiv ist - die IO wegschalten. 
Gleichzeitig wäre man sicher das die P0/P2 nicht gesampelt werden 
während dieses Vorganges.

Meines Wissens nach gibt es keine Restriktion im 8051 die besagt das man 
die Port - Befehle nicht im Zusammenhang mit externer Beschaltung 
anwenden darf. Es ergibt nur normalerweise keinen Sinn weil die externe 
Beschaltung nun mal entweder Bus ist oder IO ist.
Mit dem CPLD würde ich die oben genannten Signale auswerten und immer 
wenn kein Zugiff auf externe Peripherie im Gange ist die Ports bedienen.

Nur wenn die Inhalte von P2/P0 in den internen Registern zerstört werden 
würde bei Zugiff auf den externen Bus ist es natürlich Essig damit.



Gruß THaala

von Peter D. (peda)


Lesenswert?

THaala schrieb:
> Man müsste also - wenn ALE,RD oder WR aktiv ist - die IO wegschalten.
> Gleichzeitig wäre man sicher das die P0/P2 nicht gesampelt werden
> während dieses Vorganges.

Dazu müßte Dein CPLD allerdings hellsehen können.
Die Adresse/Daten werden schon aktiv, bevor ALE/RD/WR wechseln.
Was auch sinnvoll ist, man möchte ja nicht die falsche Adresse latchen.


Peter

von G. O. (aminox86)


Lesenswert?

Also, ich schlage für den Anfang den X88C75SLIC(=Portexpander für 
8051-Syteme) vor.
Selbermachen, egal auf weiche Art, dürfte nicht ganz ohne sein, da der 
8051 transparente Buszugriffe von Hause aus nicht unterstützt. Der 
aktuelle Maschinenzustand ist nicht so ohne weiteres ersichtlich, was 
nur ein Teil des Problems ist. Die Portzugriffe müssen an der richtigen 
Stelle während des Buszyklus stattfinden, der passende Buszugriff muß 
gefunden werden usw. Ist schon 'ne Herausforderung.

mfg

von Jobst M. (jobstens-de)


Lesenswert?

Möglichkeit #1

Du findest die richtigen Stellen auf dem Die, wo Du Leitungen 
anschliessen musst.

Möglichkeit #2

Du nimmst ein FPGA, der mit einem Adapter in Dein Board passt und 
schiebst dort einen 8051 hinein, welchen Du entsprechend modifiziert 
hast.

Möglichkeit #3

Du machst ein Macro, eine Funktion, Whatever, die Dir das übersetzt.

Möglichkeit #4 (mein Favorit :-)

Du schreibst einen 8051 Interpreter für den 8051, der diesen Fall so 
berücksichtigt.


Gruß

Jobst

von Marko B. (Gast)


Lesenswert?

Von Intel gibts den 82C55. Den hat sogar Reichelt.

von Jobst M. (jobstens-de)


Lesenswert?

Marko B. schrieb:
> Von Intel gibts den 82C55. Den hat sogar Reichelt.

Auch den kann er nicht mit P0 / P1 ansprechen ...


Gruß

Jobst

von Jobst M. (jobstens-de)


Lesenswert?

edit P0 / P2

von THaala (Gast)


Lesenswert?

hallo,

>> X88C75SLIC ...
bringts glaube ich nicht. Der restauriert diese Ports nicht sondern 
bietet das was ich auch bereits in meinem CPLD habe.

>> 8255...
da gilt das Gleiche..
Der Witz wäre ja die Ports wiederzubekommen um die SFR P0/P2 weiterhin 
normal ansprechen zu können, eben ohne movex und DPTR usw.

Klar bei genügend großem FPGA pappt man den 8051 als Softcore rein. So 
was gibt es - allerdings liegt man da schon bei 30 - 50 Euro um einen 
FPGA zu bekommen in den der 8051 reinpasst. Das ist zu teuer.

Ich habe mittlerweile so viel verstanden:
Wenn der 8051 in seinen 6 stufigen Zyklen etwas vom externen Bus will 
wackelt er mit seinen Pins. Ist das nicht der Fall arbeitet er intern.
Wenn es mir gelingt CPLD und 8051 zu synchronisieren kann man die 
Zyklen,  die nur intern ablaufen, die Portpins testen.

Der Test könnte so aussehen----
Weak high anlegen und zurücklesen:

  pin ist H: Der 8051 hat entweder diesen Pin als Eingang geschaltet
             oder ein H auf dem Ausgang. Egal - der Pin gilt
             als Eingang, es wird der reale Pin an den 8051
             Eingang durchgeschaltet.
  pin ist L: Der 8051 nutzt den Pin als Ausgang und dieser ist L
             Dann dieses L durchschalten zum realen Pin - Latch
             als Ausgang...

dies Prüfung muß in einer Stufe seines Zyklus stattfinden in dem der 
8051 sicher nicht die Ports evaluiert.

Weiß evtl. jemand in welchem der 6 Stufen der 8051 die Port-Logik 
evaluiert ?

Gruß

von Peter D. (peda)


Lesenswert?

Was stört Dich denn an der üblichen Methode memory mapped?

Du liest und schreibst dann Deine IO-Erweiterung einfach per MOVX.


Peter

von Marko B. (Gast)


Lesenswert?

Naja im Vergleich zu memory mapped gibts schon ein paar Vorteile, z.B. 
kann man die Pins einzeln setzen. Schneller ist es wohl auch. Aber statt 
den internen 2 Ports die 3 Ports vom 8255 zu haben ist doch eigentlich 
nuetzlicher. Das ist ja gerade der Witz daran, wenn man einen externen 
Bus hat: man kann Peripherie dranhaengen ... z.B. hab ich auf meinem 
8051 Board:

256K Flash, bank switched
32K SRAM
82C55 (3x8 bit I/O)
82C54 (Timer/PWM)
DS12885 (RTC)
MAX158 (8 Kanal ADC)

Z.B. waere es kein Problem, 10 82C55 dranzuhaengen und dadurch 240 I/O 
bits zu haben.

von THaala (Gast)


Lesenswert?

@Peter,

Was mich an movx stört ?
Ist nicht viel - aber man hat die Freiheit einen controller standalone 
einzusetzen oder auf einem Entwicklunssystem mit genug Resourcen ohne 
den Code zu ändern.
Natürlich weiß ich auch das es genug Möglichkeiten mit bedingter 
Kompilierung gibt aber dann ist ja da auch noch das Laufzeitverhalten 
und und und...
Außerdem hab ich im CPLD noch Platz...

Gruß

von Reinhard Kern (Gast)


Lesenswert?

THaala schrieb:
> Was mich an movx stört ?
> Ist nicht viel - aber man hat die Freiheit einen controller standalone
> einzusetzen oder auf einem Entwicklunssystem mit genug Resourcen ohne
> den Code zu ändern.

Hallo,

dafür wäre es am praktischten, ein Derivat wie 80535 einzusetzen, der 
verbraucht auch 2 Ports für den externen Bus, aber es bleiben noch 4 
Ports übrig. Ist zwar auch schon alt, aber der 8051 ist ja noch älter. 
Und unter den unzähligen 51-Derivaten gibt es sicher noch mehr von der 
Art.

Damit kann man leicht ein eigenes Entwicklungsboard bauen, man muss nur 
einen Umschalter von Havard- auf von Neumann-Architektur einbauen. 
Soweit ich mich erinnern kann, ist das eine Diode und ein Widerstand. 
Dann kann der Prozessor Code im externen Ram ausführen.

Gruss Reinhard

von Peter D. (peda)


Lesenswert?

Reinhard Kern schrieb:
> dafür wäre es am praktischten, ein Derivat wie 80535 einzusetzen, der
> verbraucht auch 2 Ports für den externen Bus, aber es bleiben noch 4
> Ports übrig.

Man muß aber nicht das Museum ausrauben, sondern kann auch aktuelle 
Bauteile nehmen.
Z.B. der AT89C51ED2-SMSUM hat auch 6 Ports.


Peter

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.