Ein Atmega328 steuert einen Z80-Computer

Themabewertung:
  • 2 Bewertung(en) - 5 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
Unilein
Fachgebiet Rauchentwicklung
*******

Beiträge: 738
Registriert seit: Apr 2014
Bewertung: 5
#1
08.01.2016, 18:30

Hallo zusammen,

zur Zeit schwirrt in meinem Kopf eine neue Idee herum. Ich möchte einen kleinen Computer bauen, dessen CPU ein Zilog Z80B sein wird. Ziel ist eine möglichst flexible Programmierung dieses Computers, 64 KB Speicher, Nutzung des schon aus einem anderen Thread bekannten VDC MC6847.

Um die flexible Programmierung zu verwirklichen, wird ein Arduino Nano zum Einsatz kommen. dieser wird das Z80-System initialisieren, indem es den Z80 anhält und dann ein Programm von einer SD-Karte liest, welches dann ins RAM des Z80-Computers übertragen wird. Danach soll das Z80-System loslaufen.

Dinge wie Tastaturabfragen, sowie diverse Hardwarekniffe, wie zum Beispiel serielle Datenausgabe, sollen ebenfalls vom Arduino übernommen werden.

Der Arduino wird natürlich über die übliche USB-Schnittstelle programmiert, die Datenausgabe des Arduino erfolgt ebenfalls über diese Schnittstelle. Gut vorstellbar ist hier natürlich die Bedienung diverser Funktionen über die Terminalfunktion des Nano.

Bis jetzt ist es nur eine Idee. Wie ich das umsetze, muss ich noch überlegen. Beispiele gibt es im Netz genügend. Allerdings habe ich ja schon ein wenig Erfahrung mit meinem "kleinen Computer", aufgebaut aus Atmega162, zwei RAM-Bausteinen und dem MC6847 (und natürlich ein paar Logikbausteinen).

Mal sehen, was ich zustande bringe...

Beste Grüße,
Uni
-----

Klopapier beidseitig verwenden und der Erfolg liegt auf der Hand!
(Dieser Beitrag wurde zuletzt bearbeitet: 19.06.2019, 15:34 von Unilein.)
Zitieren
Unilein
Fachgebiet Rauchentwicklung
*******

Beiträge: 738
Registriert seit: Apr 2014
Bewertung: 5
#2
16.01.2016, 20:53

Hallo zusammen,

heute habe ich mal eben ein wenig herum getestet. Ich habe eine Z80B-CPU auf ein Breadboard gepackt, dazu einen kleinen Taktgenerator mit einem NE555. Des Weiteren zwei ULN2803 und 18 LED's.

Ziel war es, festzustellen, ob ich den Z80 takten kann, ohne dafür einen echten Oszilator zu verwenden. Außerdem, ob die CPU mit extrem geringem Takt trotzdem arbeitet.

Ich habe für den Test die Datenleitungen der CPU alle mit einem Pulldown-Widerstand auf GND gelegt. Die 16 Adressleitungen waren mit den ULN2803 verbunden, um LED's einzuschalten, wenn die jeweilige Adressleitung HIGH-Pegel hat.


Die CPU läuft mit einer Taktfrequenz von knapp über 3 Hz Wink
Das Ergebnis ist sozusagen ein zum Binärzähler degradierte Z80-CPU.

Ich habe dazu ein kurzes Video erstellt. Dort kann man den Ansatz visuell verfolgen: https://youtu.be/5dFHENPJxuQ

Die rote LED zeigt den Systemtakt, die grüne LED zeigt an, wenn die CPU das Signal /RD aktiviert (Wird für einen lesenden Speicherzugriff benötigt) und die gelben LED's zeigen die Adressen auf dem Adressbus an.

Gruß,
Uni
-----

Klopapier beidseitig verwenden und der Erfolg liegt auf der Hand!
Zitieren
Unilein
Fachgebiet Rauchentwicklung
*******

Beiträge: 738
Registriert seit: Apr 2014
Bewertung: 5
#3
24.01.2016, 17:59

Hallo zusammen,

heute mal wieder ein paar Überlegungen zu meinem nächsten Projekt. Mein Ziel ist mal wieder ein kleiner Computer. Und wieder sollen Bauteile zum Einsatz kommen, wie sie heute nicht mehr unbedingt "state of the art" sind. Es kommen Bauteile aus den 80ern zum Einsatz.

Gesteuert wird der Z80-Computer von einem Arduino Nano. Dieser soll von einer SD-Karte ein Programm laden, es in Bytes zerlegen und diese in einen RAM-Baustein schreiben. Danach soll der Arduino die Kontrolle weitestgehend an die Z80-CPU abgeben, der dann das zuvor übertragene Programm ausführen soll.

Es kommt auch wieder ein VDC (Video Display Controller) vom Typ MC6847 zum Einsatz, der Daten auf einem Bildschirm sichtbar werden lässt. Dieser Baustein wird einen eigenen Speicherbereich haben, der als Video-RAM dienen soll.

Der Arduino soll, sobald das Programm vom Z80 ausgeführt wird, Tastatureingaben an den Z80 weitergeben. Außerdem soll er gewisse Steuerungen übernehmen, die die Arbeitsweise des unterlagerten Z80-Computers beeinflussen können. Der USB-Anschluss des Arduino dient zur Visualisierung von Informationen in einem Terminalprogramm.

Die Programmierung des Arduino erfolgt in der Arduino-IDE. Es kommen existierende Bibliotheken zum Einsatz. Die Z80-CPU wird in Assembler programmiert.

Angehängt findet Ihr noch ein kleines Blockdiagramm, welches den Aufbau verdeutlichen soll.

Gruß
Uni


   
-----

Klopapier beidseitig verwenden und der Erfolg liegt auf der Hand!
Zitieren
Unilein
Fachgebiet Rauchentwicklung
*******

Beiträge: 738
Registriert seit: Apr 2014
Bewertung: 5
#4
13.02.2016, 16:19

Hallo Forum,

nochmal ein paar Überlegungen zum Projekt. :-)

Der Arduino Nano soll ja, wie bereits beschrieben, den Z80 mit seinen Kumpels drum herum steuern. Dazu mal folgende Gedanken:

Der Nano hat nun mal nicht ganz so viele Pins, die ich verwenden könnte. Es ist also ohne zusätzliche Hilfe nicht möglich, einen 32-KB SRAM-Baustein zu adressieren und dann auch noch 8 Datenbits, die ins RAM sollen, bereit zu stellen. Deshalb werde ich für die Adressierung zwei Binärzähler vom Typ 74HC590 verwenden, die ich in Kaskade schalte. Die Kaskade bekommt seinen Zähltakt vom Nano. An den Ausgängen der Zähler haben wir dann eine 16-Bit-Adresse, die dem RAM-Baustein sagt, welche Adresse gerade gemeint ist.

Zur Adressierung von 32 KB werden lediglich 15 Bit gebraucht. Eine Leitung der Zähler liegt also brach. Aktuell gehe ich davon aus, dass 32 KB ausreichen, um dem Z80 ein "Betriebssystem" zu geben. Prinzipiell wäre aber 64 KB (Also 16 Bit) auch möglich. Vielleicht überlege ich mir das noch.

Ok, zurück zum Zähler: Der Zähler legt eine Adresse auf den Adressbus des RAM-Bausteins. Als nächstes muss ein Datenbyte verfügbar gemacht werden. Darum kümmert sich wieder der Nano. Das von der SD-Karte gelesene Datenbyte (siehe voriger Beitrag) wird in seine Bits zerlegt und auf einen Port des Nano gelegt. Dafür werden also 8 Pins benötigt. Die Datenbits werden auf den Datenbus des RAM-Bausteins gelegt.

Um die Daten in das RAM zu übernehmen sind am Baustein noch weitere Signale erforderlich. Der Speicherbaustein muss ausgewählt werden. Das geschieht mit Chip-Select (/CS). Dieser Pin muss Low sein, damit der Baustein aktiv wird. Außerdem muss dem RAM gesagt werden, dass Daten geschrieben werden sollen. Dafür existiert der Pin Write Enable (/WR). Liegt an diesem Pin ein Low-Signal an, ist das RAM bereit, Daten aufzunehmen. Das Timing spielt auch eine Rolle. Wie das aussehen muss, erzählt mir dann das Datenblatt der Speicherbausteins.

Und ein weiteres Signal wird benötigt, um den Z80-Prozessor ruhig zu stellen. Der darf während der Schreibvorgänge keinesfalls Adressen auf den Bus legen. Auch der VDC muss die Klappe halten. Dieser wird ebenfalls auf TriState gesetzt, während der Nano seine arbeit tut.

Der Schreibvorgang wird sooft wiederholt, bis alle Daten aus der Datei auf der SD-Karte gelesen und ins RAM übertragen wurden.

Das Programm auf dem Nano werde ich der Einfachheit halber in Arduino-C entwickeln. Evtl werde ich noch ein paar Features zur Steuerung des Ladevorgangs einbauen (z.B. zu ladende Datei angeben oder auch Zugriffe auf andere Speicherbereiche).

Den Nano werde ich außerdem dazu benutzen, eine PS/2-Tastatur anzuschließen.

Wie Ihr seht, handelt es sich nicht gerade um ein kleines Vorhaben. Zum Aufbau der Schaltung habe ich mir auch schon Gedanken gemacht und einen Plan gezeichnet. Ich habe den mal beigefügt. Der Schaltplan ist NICHT fertig, die Schaltung so NICHT lauffähig.

Grüße,
Uni

   
-----

Klopapier beidseitig verwenden und der Erfolg liegt auf der Hand!
Zitieren
Unilein
Fachgebiet Rauchentwicklung
*******

Beiträge: 738
Registriert seit: Apr 2014
Bewertung: 5
#5
11.03.2016, 19:39

Hallo zusammen,

momentan bin ich beruflich mal wieder stark eingespannt und habe deshalb wenig Zeit für's Forum. Heute aber habe ich die Gelegenheit genutzt, den aktuellen Stand des Projekts mal auf ein Breadboard zu stecken.

Es ist noch nicht ganz fertig. Der Adressmultiplexer (MUX) ist noch nicht angeschlossen. Der Soundchip ebenfalls nicht. Und die Steuerung über die der Nano die Z80 CPU steuern soll und Daten an den Speicher schickt, ist nur halb angeschlossen (Deshalb liegt das Oder-Gatter noch brach).

Ja und dann wäre da noch der Adresszähler, der die Zieladressen für die Daten, die in den Speicher sollen, hochzählt (getaktet durch den Nano). Der fehlt noch komplett, da ich noch nicht sicher bin, wie ich die beiden 74HC590 kaskadieren muss, damit sie sauber den Speicher adressieren können.

Ich habe ein Foto gemacht und es beigefügt. So könnt Ihr mal sehen, wie das aktuell auf einem Breadboard aussieht. Den aktuellen Schaltplan (der immer noch nicht fertig ist!!) ebenfalls.

Achja... Auf dem Schaltplan ist auch noch ein Verstärker für den Soundchip zu sehen. Der ist ebenfalls nicht auf dem Breadboard. Und die Elektronik für das Videosignal, was ebenfalls ein Verstärker ist, ist auch nicht da. Es sind also noch einige Kabel zu erwarten.

Gruß,
Uni

   
   
-----

Klopapier beidseitig verwenden und der Erfolg liegt auf der Hand!
Zitieren
Unilein
Fachgebiet Rauchentwicklung
*******

Beiträge: 738
Registriert seit: Apr 2014
Bewertung: 5
#6
13.03.2016, 18:53

Hallo zusammen,

heute bin ich wieder einen kleinen Schritt weiter. Und zwar insofern, dass der auf dem Bild im vorigen Beitrag gezeigte OR-Gatter falsch ist. Es muss ein NOR-Gatter sein.

Warum? Ganz einfach. Das Gatter ist mit /MS vom VDC MC6847 verbunden. Dieses Signal zwingt den Chip auf TriState, wenn dort ein Low-Signal anliegt. Und das bekommen wir nicht mit einem OR-Gater. Mit einem NOR-Gatter aber schon. Statt SN74HC32 kommt deshalb SN74HC02 zum Einsatz.

Ich muss die Signale noch einmal durchgehen, da ich mir noch nicht so ganz sicher bin, ob das alles so stimmt.

Weiteres in Kürze

Grüße,
Uni
-----

Klopapier beidseitig verwenden und der Erfolg liegt auf der Hand!
Zitieren
Unilein
Fachgebiet Rauchentwicklung
*******

Beiträge: 738
Registriert seit: Apr 2014
Bewertung: 5
#7
13.03.2016, 21:45

So....

jetzt bleibt das Gatter erstmal weg. Meine Logik haut so nicht hin.
Sobald ich den Schaltplan fertig habe, stelle ich ihn hier ein.

Gruß,
Uni
-----

Klopapier beidseitig verwenden und der Erfolg liegt auf der Hand!
Zitieren
Unilein
Fachgebiet Rauchentwicklung
*******

Beiträge: 738
Registriert seit: Apr 2014
Bewertung: 5
#8
26.03.2016, 19:32

Kurz ein aktuelles Bild

[Bild: 1aa866c11064cdf99566f6a0348a0a12.jpg]

Gesendet von meinem SM-N910F mit Tapatalk
-----

Klopapier beidseitig verwenden und der Erfolg liegt auf der Hand!
Zitieren
Unilein
Fachgebiet Rauchentwicklung
*******

Beiträge: 738
Registriert seit: Apr 2014
Bewertung: 5
#9
12.06.2016, 11:17

Hallo zusammen,

zuletzt hatte ich sehr wenig Zeit für mein Hobby, da ich beruflich gerade viel auf Reisen bin. Dennoch mal ein kurzer Zwischenstand:

Die Idee mit dem Uno ist prinzipiell nicht schlecht, ich habe es aber bislang nicht zum Laufen gebracht. Die beiden Zähler, die ich für die Adressierung nutzen wollte, sind derart empfindlich, dass ein sauberes Durchzählen in der momentanen Fassung der Schaltung nicht möglich scheint. Die vorigen Bilder zeigen ja den Wust an Kabeln. Das sind natürlich wahre Antennen und die fangen jede noch so kleine Veränderung in der Luft auf, was zu komischen Nebeneffekten führt.

Also habe ich die Idee mit dem Uno jetzt erst einmal verworfen und versuche mein Glück entweder mit einem etwas grösseren AVR (Atmega 162 oder Atmege 8515 oder Atmega 32...). Diese haben 40 Pins und davon könnte ich 16 (also 2 Ports) ganz prima als Zähler verwenden. Oder ich verwende einen Arduino2560. Das bedeutet zwar, dass ich mit Kanonen auf Spatzen schieße, ich hätte aber jede Menge freie Ports und könnte die USB-Schnittstelle fürs Debugging nutzen.

Vorerst komme ich aber nicht dazu, meine Idee umzusetzen.

Gruß
Uni
-----

Klopapier beidseitig verwenden und der Erfolg liegt auf der Hand!
Zitieren
Unilein
Fachgebiet Rauchentwicklung
*******

Beiträge: 738
Registriert seit: Apr 2014
Bewertung: 5
#10
12.07.2016, 21:50

Hallo zusammen,

wie schon im vorigen Beitrag erwähnt, gestaltet sich die Umsetzung meiner Idee mit einem Arduino Uno eher schwierig. Ich habe es nicht geschafft, den Uno und die asynchronen Zähler so in den Entwurf zu integrieren, dass diese den Adressbus und den Datenbus des SRAM ordentlich versorgen können. Sicher wäre es mit etwas mehr Gehirnschmalz und Geduld möglich gewesen, es dennoch so umzusetzen, ich habe die Idee dennoch verworfen.

Ich habe mich dann doch für einen AVR mit etwas mehr Beinchen entschieden und es ist mal wieder ein AtMega162 geworden (Nur weil ich den sowieso da hatte). Es wäre auch ein AtMega32 vorstellbar oder auch ein AtMega8515. Nunja....

Herausgekommen ist jetzt erst mal ein neuer Schaltplan mit einem neuen Design. Insgesamt wesentlich komplexer als ursprünglich gedacht. Die Steuerung vom AtMega aus muss berücksichtigen, dass bestimmte Signale sonst vom Z80 kommen. Der AtMega bedient bestimmte Steuersignale: /WR, /MREQ, /RESET und natürlich die Adressleitungen und den Datenbus. Der Atmega und der Z80 dürfen sich nicht in die Quere kommen. Allso muss der Z80 ruhig gestellt werden, wenn der AtMega aktiv ist und umgekehrt.

Soweit erstmal meine Gedanken dazu. Meinen Schaltplan füge ich bei. Ob dieser funktioniert, weiß ich noch nicht. Mein Breadboard reicht nicht, um das Zeug aufzubauen :-). Heute ist allerdings meine Breadboard-Bestellung eingetroffen, sodass ich bald mal testen kann.

VG
Uni


   
-----

Klopapier beidseitig verwenden und der Erfolg liegt auf der Hand!
Zitieren


Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste