Forum: Mikrocontroller und Digitale Elektronik [Z80] Einzelschritt Takterzeugung, langt da ein Knopf an _CLK?


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Markus S. (bastetfurry)


Lesenswert?

Wie im Betreff, kann ich für eine Einzelschrittfunktion einfach einen 
Knopf an _CLK anschließen der bei jedem drücken _CLK nach VCC zieht?
Oder muss da was gescheiteres her?

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Naja, ein "Knopf" wird prellen. Den solltest Du also entsprechend 
hardwaremäßig entprellen, sonst wird mit jedem Druck eine annähernd 
beliebige Anzahl von Takten ausgeführt.

von (prx) A. K. (prx)


Lesenswert?

Achtung: CLK.low <= 2µs, nur CLK.high ist nicht begrenzt, bei Zilog 
Original.

von Bernhard R. (barnyhh)


Lesenswert?

Willst Du die Clock-Impulse einzeln auf die CPU loslassen oder willst Du 
die CPU im Einzelschrittbetrieb laufen lassen? Das sind zwei völlig 
unterschiedliche Dinge; der Z80 benötigt eine variable Anzahl Clocks für 
die einzelne Instruktion.

Bernhard

von Wilhelm F. (Gast)


Lesenswert?

Muß das unbedingt per Hardware sein?

Am Z80 kann man möglicherweise einen Single-Step per Software im 
Interrupt implementieren, so daß man an die Clock-Leitung evtl. 
überhaupt nicht ran muß.

Bei Standard-8051 geht ein Single-Step in Software (ist per Hardware 
überhaupt nicht möglich, da CPU nicht statisch), da zwischen Interrupts 
immer mindestens ein einziger Befehl des Hauptprogrammes abgearbeitet 
wird. Dazu ist noch nicht mal eine Hardware-Entprellung des Tasters 
nötig, da man die in Software ausführen kann.

Wenn da keine integrierte Peripherie (z.B. Timer o.ä.) auf dem Z80 
läuft, müßte man das mal nachschauen, ob der da mitspielt.

von (prx) A. K. (prx)


Lesenswert?

Die Z80 ist erstaunlicherweise statisch.

von Reinhard Kern (Gast)


Lesenswert?

Bernhard R. schrieb:
> ... der Z80 benötigt eine variable Anzahl Clocks für
> die einzelne Instruktion.

Hallo,

variabel ist beim Z80 stark untertrieben: normale Befehle brauchen 4 bis 
23 Taktzyklen, Blockbefehle wie LDIR bis zu ca. 1,4 Millionen.

Gruss Reinhard

von Wilhelm F. (Gast)


Lesenswert?

Na, dann sollte es ein Monoflop o.ä. am Clock-Eingang tun.

von Reinhard Kern (Gast)


Lesenswert?

A. K. schrieb:
> Achtung: CLK.low <= 2µs, nur CLK.high ist nicht begrenzt, bei Zilog
> Original.

Hallo,

Zitat aus Zilog Handbuch von 1979:

"Although static by design, testing guarantees tw (Phi H) of 200 µs 
maximum"

Ich habe auch geglaubt, der Z80 wäre nicht statisch, ist er aber nach 
dieser Aussage doch - allerdings ist für Clk Low tatsächlich 2000 ns max 
angegeben, das wird aber nicht begründet. Also statisch by Design, real 
aber dynamisch? Es lohnt sich wohl nicht mehr, das Rätsel zu lösen. Bei 
den CMOS-Versionen ist sowieso DC erlaubt.

Gruss Reinhard

von Michael J. (jogibaer)


Lesenswert?

Hallo Markus,

das grenzt ja schon an Leichenfledderei was Du da treibst ;-).




Ok OK, ich gebe ja zu daß so eine CPU z.B. in meiner
Melodieklingel breitmacht.
Bauteile des Z80 Systems habe ich auch noch.


Aber trotzdem, was hast Du eigentlich vor ?


Jogibär

von Bernhard R. (barnyhh)


Lesenswert?

Die alten Dokumentationen enthalten Schaltungsvorschläge für 
Single-Step-Betrieb. Da sollte man fündig werden.

Bernhard

von Jens (Gast)


Lesenswert?

Zu DDR-Zeiten gab es ein Z80-System, welches Polycomputer-880 hieß und 
so einen Hardware-Einzelschritt drin hatte. Wenn ich mich recht 
erinnere, haben die das über den Wait-Eingang der CPU realisiert. Leider 
kann ich nicht mehr in die Unterlagen schauen, da ich sie mitsamt dem 
Gerät schon vor vielen entsorgt habe, aber vielleicht findet ds große G 
noch was.

von Michael J. (jogibaer)


Lesenswert?

Jens schrieb:
> Zu DDR-Zeiten gab es ein Z80-System, welches Polycomputer-880 hieß und
> so einen Hardware-Einzelschritt drin hatte. Wenn ich mich recht
> erinnere, haben die das über den Wait-Eingang der CPU realisiert. Leider
> kann ich nicht mehr in die Unterlagen schauen, da ich sie mitsamt dem
> Gerät schon vor vielen entsorgt habe, aber vielleicht findet ds große G
> noch was.

Hallo,

wie kann man sowas nur wegwerfen ?!?

Jogibär

von spess53 (Gast)


Lesenswert?

HI

www.kc85-museum.de/books/poly880/bedienhandbuch/0008index.html

Dort findest du die Schaltung vom DDR-Polycomputer. Bei dem ließen sich 
sogar die einzelnen M-Zyklen durchsteppen.

MfG Spess

von Hermann-Josef M. (hermann-josef)


Lesenswert?

Hallo,

ganz im Sinne der 'Leichenfledderei', bei meinem inzwischen teilweise 
entsorgten 8080-System wurde Single-Step durch 'geschicktes' Verbinden 
von WAIT und RDYIN erreicht, man konnte dann sehen, was auf dem Bus los 
ist.

Aus beim Z80 schein das zu gehen, aber nicht, wenn man dynamische RAMs 
betreibt. Wie es mit CMOS-Z80 aussieht, weiß ich auch nicht, siehe auch: 
http://www.vias.org/mikroelektronik/b2_02_z80_pins.html

Viel Spass
Hermann-Josef

von Bernhard R. (barnyhh)


Lesenswert?

Single-Stepping geht per BUSREQ- / BUSACK-Signal recht einfach:

BUSREQ := 0 ---> CPU geht nach der laufenden Instruktion in den TRISTATE 
Zustand und signalisiert das per BUSACK = 0.

BUSREQ = 1 bei steigendem Clock: dienächste Instruktion startet.

Bernhard

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Jens schrieb:
> Wenn ich mich recht
> erinnere, haben die das über den Wait-Eingang der CPU realisiert.

Ja, mit sowas habe ich meinen CP/M-Computer auch in Betrieb genommen.

Ich bin mir nur gerade nicht ganz sicher, ob während wait der dRAM-
Refresh noch gewährleistet ist.  Aus dem Bauch raus würde ich sagen,
dass das nicht der Fall ist, da der ja in der Befehlsdekodierphase
eines jeden M1 erfolgt.

von (prx) A. K. (prx)


Lesenswert?

Mit WAIT für Single-Step geht Refresh natürlich nicht. Kein Single-Step 
in Hardware kann das, weil der Bus stehenbleibt. Nur irgendwelche Sachen 
mit NMI aus M1 oder so und folglich Single-Step in Software mit 
Monitor-Programm.

von Markus S. (bastetfurry)


Lesenswert?

Michael Jogwich schrieb:
> das grenzt ja schon an Leichenfledderei was Du da treibst ;-).

Ich wollt mir ein klassisches System selber bauen um eben mal den 
Lerneffekt auszunutzen.
Z80schs gibts halt in DIL, sind also uneingeschränkt Lochrastertauglich, 
die anderen reinen CPUs die man so im Handel bekommt sind ja alle 
mittlerweile nur noch SMD oder schlimmer.

Mein Projektaufbau sieht halt vor das sich das nachher jeder auf 
Lochraster nachbauen kann, derzeit hängt die Hardware aber eher in der 
Planungsphase.

Derzeit strick ich übrigens Softwaremäßig mit Meka rum, das ist ein 
Master System Emulator mit super genialem Live Debugger.

von Wilhelm F. (Gast)


Lesenswert?

Markus Stehr schrieb:

>Michael Jogwich schrieb:
>>das grenzt ja schon an Leichenfledderei was Du da treibst ;-).

>Ich wollt mir ein klassisches System selber bauen um eben mal den
>Lerneffekt auszunutzen.
>Z80schs gibts halt in DIL, sind also uneingeschränkt
>Lochrastertauglich, die anderen reinen CPUs die man so im Handel
>bekommt sind ja alle mittlerweile nur noch SMD oder schlimmer.

Der Zweck heiligt immer die Mittel. Hatte vor einigen Jahren selbst noch 
so ein altes System mit dem 8085 nachgebaut, mit Draht 0,4mm sauber zum 
Kabelbaum gebunden auf der Bestückungsseite einer Lochrasterplatte 
verdrahtet. Dem Ding hatte ich noch 32k SRAM und 32k EPROM spendiert, 
einen Portbaustein 8255, ebenfalls einen Timerbaustein 8253, wobei ein 
Timer eine Zeitbasis für den Prozessor darstellt. Die niedrige 
Taktfrequenz und die Verdrahtungsart waren auch nicht kritisch.

Der Lerneffekt war groß, ich hatte viel Spaß, und Z80 und 8085 leben ja 
heute noch, und werden auch noch neuere Entwicklungen überleben...

von J. V. (janvi)


Lesenswert?

lies mal beim Anschluss M1 nach. Der signalisiert beim Z80 den 
"Maschinenzyklus 1" wo der Opocode Fetch gemacht wird. Mit einem FF 
kannst du da Single Step unabhängig von der Anzahl der Takte für einen 
Befehl machen. Wenn du Wait anstelle Busreq oder Clock schaltest, dann 
geht der Refresh für DRAM auch wenn die Kiste (scheinbar) steht.

von (prx) A. K. (prx)


Lesenswert?

Wie soll ein DRAM-Refresh funktionieren, wenn ein Buszyklus durch Wait 
mittendrin ad infinitum angehalten wird?

von Bernhard R. (barnyhh)


Lesenswert?

Für DRAM-Refresh gibt es 2 Möglichkeiten:

1. Refresh vom Z80 aus
2. "Stand Alone Refresh"

zu 1:
Der Refresh vom Z80 aus ist blockiert, sobald WAIT oder BUSREQ aktiv 
ist, bei stehendem Clock natürlich auch.

zu 2:
Wenn der Speicher AUTO-Refresh besitzt, dann verhindert WAIT den 
Refresh, denn die CPU greift während des WAIT weiter auf den Speicher 
(oder manchmal auch auf I/Os) zu.
Wenn die CPU per BUSREQ angehalten ist, dann kann der Speicher sein 
AUTO-Refresh ausführen.

Das dürfte allerdings alles recht theoretisch sein, denn heute steht 
statischer Speicher dieser Größe und Geschwindigkeit billig zu 
Verfügung, während entsprechend kleine DRAMS inzwischen rechtr 
"exotisch" sind.

Bernhard

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Bernhard R. schrieb:
> Das dürfte allerdings alles recht theoretisch sein, denn heute steht
> statischer Speicher dieser Größe und Geschwindigkeit billig zu
> Verfügung

Ja, anfangs war nur nicht klar, ob es um einen alte Kiste oder einen
Neuaufbau geht.

von Reinhard Kern (Gast)


Lesenswert?

J. V. schrieb:
> lies mal beim Anschluss M1 nach. Der signalisiert beim Z80 den
> "Maschinenzyklus 1" wo der Opocode Fetch gemacht wird. Mit einem FF
> kannst du da Single Step unabhängig von der Anzahl der Takte für einen
> Befehl machen. Wenn du Wait anstelle Busreq oder Clock schaltest, dann
> geht der Refresh für DRAM auch wenn die Kiste (scheinbar) steht.

Das wird nicht klappen. Wenn M1 kommt,, hat ja der nächste Instruction 
Fetch schon begonnen - zu spät um anzuhalten, jedenfalls wenn man 
einzelne Befehle steppen will.

Gruss Reinhard

von (prx) A. K. (prx)


Lesenswert?

Keineswegs zu spät. Mit Wait kannst du ihn mitten in M1 anhalten. Eine 
Auswirkung hat der darin noch nicht fertig geladene Befehl naturgemäss 
noch nicht.

von golem23 (Gast)


Lesenswert?

Das Problem bei einem Einzelschritt über das WAIT-Signal ist, dass Wait 
nur für kurze Zeit deaktiviert werden darf, damit der nächste 
Maschienenzyklus wieder im Wait-Zustand landet. Gleiches gilt für 
BUSREQ. Es gibt da recht aufwändige Schaltungen: Ein FlipFlop, Q an Wait 
und /Q an Busrequest. Nehmen wir an der Prozessor bzw. das Flipflop 
befindet sich im Wait Zustand. Wenn das Flipflop jetzt (durch eine 
Taste) den Zustand wechselt, wird WAIT inaktiv und BUSREQ aktiv = der 
Prozessor saust vom Waitzustand in den Busrequestzustand, da beide 
Zustände während einem Maschienenzyklus zu verschiedenen Zeiten 
abgefragt werden. Wechselt das FlipFlop wieder den Zustand, landet man 
im nächsten Waitzustand/Maschienenzyklus. Damit kann man mit einem 
FlipFlop mit dem Z80 EInzelschrittbetrieb machen. Geht natürlich wie 
schon beschrieben nur mit statischen RAM's - ist aber unübertroffen 
einfach, denn ein FlipFlop hat man immer in der Bastelkiste... :)

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Angehängte Dateien:

Lesenswert?

Hier eine real benutzte Schaltung von vor > 25 Jahren.

von (prx) A. K. (prx)


Lesenswert?

Mir leuchtet dabei nicht ein, weshalb man WAIT und BUSRQ verwenden 
sollte. Genauso kann man mit der fallenden Flanke von M1 oder MREQ ein 
D-FF und damit WAIT aktivieren. Taste setzt das FF zurück und weiter 
geht's.

Geht man auf M1 kriegt man die Befehle einzeln, geht man auf MREQ (oder 
MREQ&IORQ), dann die Buszyklen einzeln.

WAIT alleine bietet gegenüber BUSRQ den Vorteil, dass man auf dem Bus 
Adresse/Daten beobachten kann, LEDs/7segment dran oder so. Single-Step 
ist ja kein Selbstzweck.

Edit: Jörg war schneller.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

A. K. schrieb:
> WAIT alleine bietet gegenüber BUSRQ den Vorteil, dass man auf dem Bus
> Adresse/Daten beobachten kann, LEDs/7segment dran oder so.

Genau das habe ich damals damit gemacht.  Dann so lange single-step,
bis ich gefunden haben, wann der gelesene Wert nicht mehr dem im
ROM entspricht -- und die Lötbrücke gefunden.

von golem23 (Gast)


Lesenswert?

A. K. schrieb:
> Mir leuchtet dabei nicht ein, weshalb man WAIT und BUSRQ verwenden
> sollte. Genauso kann man mit der fallenden Flanke von M1 oder MREQ ein
> D-FF und damit WAIT aktivieren. Taste setzt das FF zurück und weiter
> geht's.

Wenn man nur Wait verwendet, darf man das Signal nur für kurze Zeit (< 
Maschienenzyklus) deaktivieren um den nächsten Zyklus zu "fange". 
Aktiviert man aber Wait und Busreq alternierend, so wechselt der 
Prozessor wegen der verschiedenen Zeiten in denen diese Signale 
abgefragt wird, vom Wait- in den Busrequest-Zustand und wieder zurück. 
Man braucht also nur ein Flipflop mit Q an Wait und /Q an Busreq, um mit 
einem Switch an S und R, um von einem Maschienenzyklus zum nächsten zu 
wechseln. Einfacher geht wirklich nicht mehr, und da man immer im 
Wait-Zustand landet, kann man natürlich den Buszustand super per LED's 
anzeigen.

von Michael_ (Gast)


Lesenswert?

>Autor: Bernhard R. (barnyhh)
>Datum: 05.02.2010 17:35

>Willst Du die Clock-Impulse einzeln auf die CPU loslassen oder willst Du
>die CPU im Einzelschrittbetrieb laufen lassen? Das sind zwei völlig
>unterschiedliche Dinge; der Z80 benötigt eine variable Anzahl Clocks für
>die einzelne Instruktion.

>Bernhard
Diese Frage muß als erstes beantwortet werden. Jeder Praktiker weiß, 
wenn ein Quarz o.ä. angeschlossen ist, muß es an den Adressleitungen 
"wackeln". Damit ist die Frage nach D-RAM/Refresh geklärt. Einzelschritt 
der Befehle ist weiterhin  mit obiger Hardware bzw. Soft möglich.
Anfängern würde ich zu AVR/DIL raten.

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.