Forum: Mikrocontroller und Digitale Elektronik Z80 I/O Dekodierung


von Paras (Gast)


Angehängte Dateien:

Lesenswert?

Hey,

ich habe hier eine Schaltung. Die wesentlichen Bauteile sind ein Z80, 
ein EPROM, ein Treiber, ein Audioverstärker und ein Lautsprecher. Das 
sind die Ziele des Projekets
•  Aufbau eines einfachen 8-Bit Piano mit Z80 CPU
•  Erzeugen und Ausgeben von 7 Tönen „Do, Re, Mi, Fa, Sol, La, Si, Do“
•  Steuerung über Tasten
•  Wiedergabe von gespeicherter Tonfolge

Die Töne werden durch Pulsweitenmodulation generiert. Jeder Ton hat eine 
bestimmte Frequenz. Um den Ton zu generieren, wird das Signal immer 
wieder invertiert. Der Zeitabstand von der Invertierung bestimmt die 
Frequenz, somit auch den zu hörenden Ton. Es liegt ein Datenbus an der 
CPU. Der Treiber unterscheidet, ob die Daten von EPROM oder Tasten 
kommen. Die Ausgabe liegt  an D0.

PROBLEM: Die Tonausgabe erfolgt auch, wenn die Daten von EPROM bzw. 
Tasten an D0 anliegen. Heißt ich muss zwischen der Ausgabe von CPU(D0) 
und "Daten lesen" unterscheiden. Also wenn die Daten von EPROM gelesen 
werden, darf der Lautsprecher nicht angesprochen werden. Was kann man da 
machen?

P.S.: Anhang: Schaltbild

von Holger T. (holgert)


Lesenswert?

> Was kann man da
> machen?

Kurzantwort: IORQ und WR verwenden. Damit eine "Ausgabebaugruppe" (kann 
PIO oder ein einfaches Latch sein) ansteuern und dort dran den OPV 
anschließen.

Edit:
Ähhhmmm: Wie soll das mit den Tastern->'541->Datenbus funktionieren?

Edit2:
Resettaster funktioniert so auch nicht.

==> Suche Dir ein kleines schon verifiziertes Projekt (CPU, EPROM, PIO) 
und setzte das um.

von Karl H. (kbuchegg)


Lesenswert?

Normalerweise macht man das so, dass man am Bus mittels MREQ bzw. IORQ 
unterscheidet, ob ein Zugriff auf dem Bus dem Speicher gilt oder eben 
einer I/O Komponente.
Im Programm wird dann mittels den normalen Load-Instuktionen auf den 
Speicher zugegriffen, währen I/O Zugriffe über eigene IN/OUT Befehle 
laufen.

Entweder das, oder man muss die Hardware dann genauso in die 
Adressdekodierung mit einbeziehen wie alles andere. D.h. man braucht 
eine Schaltung, die anhand der anliegenden Adresse (bzw. Teilen dieser 
Adresse) entscheidet, welche Baugruppe bzw. welches IC aktiv werden 
soll. Wenn du mehrere EPROMS oder auch SRAM Bausteine an deinem Z80 
hängen hast, musst du das ja auch machen, damit sich immer nur einer der 
Bausteine angesprochen fühlt. Gerne hat man zu diesem Zweck einen 74138 
genommen, an dem man dann die höherwertigsten Adressleitungen 
angeschlossen hat, und dessen Einzelausgänge zu den diversen Chip-Select 
Eingängen von Speicherbausteinen gehen. Oder eben, bei dir, der 
zusätzlichen Komponente mitteilen, dass sie nicht auf die Bits am 
Datenbus reagieren soll. Ich schätze mal, es wird bei dir auf ein 
vorgeschaltetes Latch irgendwo rauslaufen, welches dann eben nur dann 
Daten übernimmt, wenn vom 138 die entsprechende Chip-Select Freigabe 
kommt.

Sprich: Deine Chip-Selct Generierung links oben im Schaltbild rund um 
IC3 und IC6 ist viel zu schwach um für die Zukunft tragfähig zu sein.
Du könntest vielleicht etwas retten, wenn du mit dem IORQ und einer 
zusätzlichen Verknüpfung in der Datenleitung zum Ausgangstreiber was 
anstellst. Aber das genaue Timing der Signale weiß ich auch nicht mehr 
auswendig.

von Erich (Gast)


Lesenswert?

Hier ist ein einfaches Z80 Schaltbild.

http://www.cs.cornell.edu/~wenzel/z80/
http://www.cs.cornell.edu/~wenzel/z80/schematic.pdf

Baue am Besten das genauso nach, schliesse deinen Sound Chip und Taster 
an den "Pio" Baustein (hier 82C55) an.

32k Eprom + 32k Ram , daher einfache Dekodierung über die Gatter IC7, 
IC8.

Sinn macht auch das Oszillator-IC sowie der Resetbaustein!
http://www.cs.cornell.edu/~wenzel/z80/11_mostlycomplete.jpg

Gruss

von JoergL (Gast)


Lesenswert?

Und irgendwas war da noch mit dem CLK-Eingang beim Z80.
Der 74LS04 liefert TTL-Pegel, und der Z80 erwartet einen symmetrischen 
(MOS?) Pegel an CLK, den der LS04 nicht liefern kann. Lösung war imho 
ein 470R von CLK nach 5V.

von Reinhard Kern (Gast)


Angehängte Dateien:

Lesenswert?

JoergL schrieb:
> der Z80 erwartet einen symmetrischen
> (MOS?) Pegel an CLK, den der LS04 nicht liefern kann. Lösung war imho
> ein 470R von CLK nach 5V.

Fast, nicht ganz. Anbei die Original-Mostek-Empfehlung von 1979. Ich 
nehme an, spätere CMOS-Z80 waren nicht so pingelig, aber da habe ich im 
Moment kein Datenblatt vorliegen.

Gruss Reinhard

von Soul E. (Gast)


Lesenswert?

Später hat dann ein schlauer Mensch 'HC(T) erfunden. Die haben 
symmetrische Endstufen und können genauso schnell ein- wie ausschalten.

von Paras (Gast)


Angehängte Dateien:

Lesenswert?

Ich danke für eure Hilfe.

Ich habe in der Woche die Schaltung überarbeitet. Mein Prof. hat auch 
drüber geschaut und sagt, dass es so funktionieren könnte.

@Holger T.

Es ist ein Studienprojekt und unsere Gruppe hat sich für dieses Projekt 
entschieden und das Projekt ist schon beim Professor eingetragen.

Warum würde RESET nicht funktionieren? Meinst du, dass es entprellt 
werden soll? Die Tasten sind schon entprellt.

Die Tasten müsste man als 8-Bit-Register sehen.


Die CS-Generierung wurde überarbeitet und funktioniert über IORQ und 
MEMRQ.


Zusätzlich wurde ein 8-Bit Register hinzugefügt. Die Beschaltung am 
Lautsprecher wurde auch ersetzt.

von Route_66 (Gast)


Lesenswert?

Paras schrieb:
> Mein Prof. hat auch
>
> drüber geschaut und sagt, dass es so funktionieren könnte.

Hallo!
Der Professor sollte sein Geld an die Uni zurückgeben!
Das Tastaturlesen funktioniert nicht; die Tonausgabe funktioniert nicht; 
das RESET funktioniert nicht!

von (prx) A. K. (prx)


Lesenswert?

... und die LEDs ohne Widerstände, /WAIT in der Luft.

von Paras (Gast)


Lesenswert?

Route_66 schrieb:
> Paras schrieb:
>> Mein Prof. hat auch
>>
>> drüber geschaut und sagt, dass es so funktionieren könnte.
>
> Hallo!
> Der Professor sollte sein Geld an die Uni zurückgeben!
> Das Tastaturlesen funktioniert nicht; die Tonausgabe funktioniert nicht;
> das RESET funktioniert nicht!

Wäre nett, wenn du auch sagen könnte, weshalb es nicht funktionieren 
würde.

Danke

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


Lesenswert?

Paras schrieb:
> Die Tasten sind schon entprellt.

Auf welche Weise denn?

Wenn es sich um irgendeine Form elektronischer Tasten handelt
(Hall-Tasten, Entprellung eines Umschalters über RS-Flipflop),
dann solltest du das im Schaltplan nicht einfach als Taster
einzeichnen, denn dann handelt es sich u. U. um Bauelemente,
die aktiv eine Spannung ausgeben.

von (prx) A. K. (prx)


Lesenswert?

NB: Einem TTL-Oszillator kann man zwar mit einem Pullup zum richtigen 
Pegel verhelfen. Aber ein 74HCU04 macht das auch ohne schon richtig.

von (prx) A. K. (prx)


Lesenswert?

Jörg Wunsch schrieb:
> Auf welche Weise denn?

Ein per Taster hoch und per nix runtergezogener CMOS-Eingang prellt 
nicht (ok, funktionieren tut er auch nicht, aber man kann eben nicht 
alles haben ;-). Jedenfalls nicht aufgrund des Tasters, eher schon 
aufgrund Antenneneffekt.

von (prx) A. K. (prx)


Lesenswert?

War eine der Forderungen eigentlich, möglichst keine 2 Logik-ICs aus der 
gleichen Familie zu verwenden?

von (prx) A. K. (prx)


Lesenswert?

A. K. schrieb:
> /WAIT in der Luft.

Sorry, /HALT.

von Route_66 (Gast)


Lesenswert?

Paras schrieb:
> Wäre nett, wenn du auch sagen könnte, weshalb es nicht funktionieren
>
> würde.

Das habe ich bewußt vermieden. Ich will zum Selberdenken animieren, da 
lernt man besser.

Ein kleiner Tip /IORQ und/WR sind beim Z80 nur ca. 2,5 Takte 
gleichzeitig L. Das wird sehr sehr leise.

von (prx) A. K. (prx)


Lesenswert?

Paras schrieb:
> Wäre nett, wenn du auch sagen könnte, weshalb es nicht funktionieren
> würde.

Der Knubbel am RESET-Pin sagt dir, dass diese Leitung aktiv ist, wenn 
low. Und wie kommt die da hin? Ähnliches bei den übrigen Tastern.

von Ingo W. (Gast)


Lesenswert?

A. K. schrieb:
> A. K. schrieb:
>> /WAIT in der Luft.
>
> Sorry, /HALT.

Passt schon, ist ein Ausgang, der hier nicht benötigt wird.

von (prx) A. K. (prx)


Lesenswert?

Route_66 schrieb:
> Ein kleiner Tip /IORQ und/WR sind beim Z80 nur ca. 2,5 Takte
> gleichzeitig L. Das wird sehr sehr leise.

Das ganze 273er ist so ziemlich sinnfrei, nicht bloss der Sound. Die 
Zeiten, als man wie bei PDP-11en Busleitungen fürs Debugging mit LEDs 
(oder Lämpchen) verzierte, sind vorbei. Eines der beiden Gatter vom 
Sound gehört davor, nicht dahinter, dann wird ein Schuh draus.

von (prx) A. K. (prx)


Lesenswert?

Ingo Wendler schrieb:
> Passt schon, ist ein Ausgang, der hier nicht benötigt wird.

Stimmt - andere CPU andere Namen.

von Jürgen S. (Firma: privat) (jschmied)


Lesenswert?

Warum hängt das Register an CLK?  Das ist völliger Blödsinn ...

Wenn es auf I/O Write reagieren soll, müsste ein Signal aus IORQ und 
WRITE gebildet werden (Gültigkeit der Daten und Flanke beachten) !!

Jürgen

von Jürgen S. (Firma: privat) (jschmied)


Lesenswert?

PS: Da gibts ja schon eine Verknüpfung von IORQ und WRITE für die 
Tonerzeugung. Das Ding müsste eigentlich das Ladesignal (CLK) für das 
Register erzeugen.
Dann ist der Ton auch nicht mehr so leise ;-).

von Jürgen S. (Firma: privat) (jschmied)


Lesenswert?

PSS: Alle Leitungen (RD/WR/MREQ/IREQ) sind negiert d.h. bei Low aktiv. 
Seht euch wirklich noch mal die Bus-Taktdiagramme an und überlegt, was 
bei welcher Signalkombination bzw. Signalflanke passiert. Wann z.B. das 
Register lädt pder gelesen wird. Sind die Daten wirklich bei der Flanke 
gültig?

vg

Jürgen

von (prx) A. K. (prx)


Lesenswert?

Jürgen Schmied schrieb:
> Sind die Daten wirklich bei der Flanke gültig?

War das jetzt eine rhetorische Frage, oder weisst du es selbst nicht? 
Ich hatte nämlich extra reingesehen.

von Jürgen S. (Firma: privat) (jschmied)


Lesenswert?

Habs nicht nachvollzogen, war nur ein Tipp.

von Reinhard Kern (Gast)


Lesenswert?

Hallo,

spätestens beim Programmentwurf wird euch auffallen (hoffentlich 
wenigstens dir, bei deinem Prof habe ich da eher Zweifel), dass man für 
dieses Konstrukt keine Software schreiben kann - im Gegensatz zu 
heutigen Prozessoren hat der Z80 weder Ram noch nennenswerte Register, 
ein Unterprogrammaufruf scheitert also daran, dass es keinen Stack gibt. 
Ganz ultraprimitive Progrämmchen könnte man vielleicht auch ohne Calls 
schreiben, aber der pädagogische Wert dürfte dann bei Null liegen.

Gruss Reinhard

von Route_66 (Gast)


Lesenswert?

Hallo Reinhard!
Du irrst gewaltig. Man kann perfekte Software für den Z80 schreiben, 
ohne RAM zu benötigen. Der prozessor hat genügend Register und einen 
leistungsfähigen Befehlssatz. Das genügt für einfache Anwendungen.
Ich selbst habe vor langer Zeit einen 8-fach EPROM Programmer für 2764er 
gebaut, ohne ein einziges Byte RAM.
Unterprogramme schreibt man einfach nach dem Muster: erst ins 
IX-Register die Rückkehradresse und am Ende der Routine dann anstatt ein 
RET das JMP (IX).

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


Lesenswert?

Route_66 schrieb:
> Man kann perfekte Software für den Z80 schreiben,
> ohne RAM zu benötigen.

Naja, der praktische Nährwert (jenseits von "freaky") ist aber eher
gering.  Für den weiteren Lebensweg im dritten Jahrtausend lernt
man dabei nicht viel.  Selbst die zu Z80-Zeiten gang und gäbe
gewesene (Un-)Sitte, selbstmodifizierenden Code zu schreiben und
so beispielsweise Variablen direkt im Code unterzubringen (als
Operanden eines anderen Befehls) dürfte heutzutage eher ein
Stirnrunzeln denn "Bravo!"-Rufe auslösen.

von Michael_ (Gast)


Lesenswert?

Hurra! Er leb noch, er lebt noch, ....
Hab in diesem Zusammenhang meinen LC-80 hervorgeholt und er piepst mich 
an wie am ersten Tag.
Jedenfalls ist der Ansatz für ein Schulprojekt mit einem angeblich 
schlauen Prof. dilletantisch.
Schon die Grundbeschaltung kann man sich von einfachen Beispielen wie so 
einem LC-80 abgucken.
Und es gibt da auch noch die FuA Melodieklingel. Die ist auch ohne RAM, 
und es sind fast alle wichtigen Funktionen vorhanden. Nur die 
Tasteneingabe muß noch realisiert werden.
Die Tonausgabe geht dort über einen 74LS74. Die Tonausgabe darf nicht 
mit über den Bustreiber laufen.
Das Programm hatte ich reassembliert und auf dem LC-80 zum laufen 
gebracht. Da hat ein Musikexperte noch weitere Melodien einprogrammiert.
http://hc-ddr.hucki.net/wiki/doku.php/elektronik:literatur:fa_86_04_203

von (prx) A. K. (prx)


Lesenswert?

Reinhard Kern schrieb:
> heutigen Prozessoren hat der Z80 weder Ram noch nennenswerte Register,
> ein Unterprogrammaufruf scheitert also daran, dass es keinen Stack gibt.

Der Z80 Prozessor hat nicht so wenig Register wie du annimmst, 
insbesondere wenn du den zweiten Registersatz mitrechnest.

Ich hatte vor langer Zeit mal eine DCF77-Uhr mit LED-Anzeige, die mit 
einem Z80 betrieben wurde. RAM war zwar drin, aber in Form eines 
einzelnen 2114 1Kx4 SRAM. Für den Stack taugte das RAM also nicht.

Bei den PC-BIOSen ist das nicht anders. Der erste RAM-Test arbeitet 
logischerweise ohne eigene Verwendung von RAM.

Unterprogramme sind möglich, indem die Rückkehradresse entweder selbst 
in einem Register steht, oder SP mit eine ROM-Adresse geladen wird, wo 
sie steht. Auf die Art lässt sich auch mehr als ein Stack-Level 
abbilden. Ist natürlich etwas tricky.

von (prx) A. K. (prx)


Lesenswert?

Jörg Wunsch schrieb:
> Selbst die zu Z80-Zeiten gang und gäbe
> gewesene (Un-)Sitte, selbstmodifizierenden Code zu schreiben und
> so beispielsweise Variablen direkt im Code unterzubringen

Bis in die 70er war das auf diversen Mainframes und Minicomputern völlig 
normal und wurde auch nicht als Hack angesehen. Ein Unterprogrammaufruf 
schrieb die Rückkehradresse ins erste Wort des Unterprogramms und 
startete es mit dem Wort dahinter. Je nach Prozessor stand das dort 
direkt als Sprungbefehl, so dass der Return-Befehl einfach nur ein 
Sprung an diese Programmstelle war. Reentrant war das natürlich nicht, 
aber das hat anno FORTRAN und COBOL nicht weiter gestört.

von Reinhard Kern (Gast)


Lesenswert?

A. K. schrieb:
> Auf die Art lässt sich auch mehr als ein Stack-Level
> abbilden. Ist natürlich etwas tricky.

Möglich ist vieles, aber das kann nicht der Ausbildungszweck im Jahr 
2013 sein. Mann kann sowas ja wohl kaum als strukturierte Programmierung 
betrachten.

Das vorliegende Design hat 64k Eprom und 0k Ram, das ist für mich keine 
wirklich brauchbare Hardware. Glaubst du wirklich, man könnte ein 64k 
grosses Programm schreiben ohne Stack?

A. K. schrieb:
> Der Z80 Prozessor hat nicht so wenig Register wie du annimmst,
> insbesondere wenn du den zweiten Registersatz mitrechnest.

Ich weiss wohl wie viele bzw. wenige Register ein Z80 hat. Zeig mir doch 
mal, wie du mit denen einen Befehlsstring von einer seriellen 
Schnittstelle empfängst und auswertest, damit man wenigstens mit einem 
Monitorprogrämmchen sowas Ähnliches wie Debuggen kann.

Gruss Reinhard

von Holm T. (Gast)


Lesenswert?

Der Funktionsumfang der obigen Hardware übersteigt den einer ollen 
Melodietürklingel (Ja, FuA) nicht, demzufolge sollte sich das gestellte 
Ziel auch erreichen lassen.
Kommerzielle Robotron Teile hatten einen Z80 Prozessor ohne RAM, z.B. 
die Bürocomputertastaturen, in der Ausführung K7637 auch noch mit 
Softuart zum Rechner. Der Controller des zum Sparkassensystem gehörenden 
Magnetkartenlesers (konnte auch schreiben) arbeitete mit einer Z80 ... 
ohne RAM.

Es geht also, in wie fern das Zweckmäßig ist, ist eine andere Frage, 
auch ich habe sicher aus Sicht Anderer blöde Ideen (z.B. aus bipolaren 
Bitslices eine eigene CPU zu bauen), aber an einer Uni hätte ich so was 
wohl eher nicht erwartet, maximal im Fachbereich Archäologie...

Gruß,

Holm

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.