Ein Atmega328 steuert einen Z80-Computer
Unilein Fachgebiet Rauchentwicklung ![]() ![]() ![]() ![]() ![]() ![]() ![]() Beiträge: 741 Registriert seit: Apr 2014 Bewertung: 5 |
02.01.2019, 20:08
Hallo zusammen,
allen noch ein frohes neues Jahr! Und weil ich ein paar Tage frei habe, habe ich mich auch wieder mit meinem Projekt beschäftigt. Das im vorigen Beitrag erwähnte neue Design lasse ich erst mal ruhen. Jetzt stelle ich erst einmal das bestehende Design fertig. Die IDE-Schnittstelle habe ich aufgebaut. Und wenn ich sie anschließe, wir sie sogar initialisiert. Ob sie aber wirklich funktioniert, habe ich noch nicht testen können. Ich muss das zugehörige Programm noch umschreiben. Ich habe mich dann mal wieder auf mein Tastaturinterface fokussiert. Da habe ich ja bereits so einiges an Zeit investiert und bin regelmäßig gescheitert. Ich habe alle alten Ideen verworfen und habe mir überlegt, das Ganze in Arduino-manier umzusetzen. Für den Arduino gibt es die PS2Keyboard-Lib. Sie benötigt nicht sehr viel Speicher und kann mit verschiedenen Tastaturlayouts umgehen. Ich hatte mir überlegt, dafür den sowieso verbauten Atmega328 zu verwenden. Der hat noch Speicher frei. Allerdings benötigt die Lib einen echten Interrupt-Pin für das Clock-Signal der Tastatur. Beim Arduino Nano sind die Pins 2 und 3 für INT0 und INT1 zuständig. Leider sind diese beiden Pins aber auch Bestandteil des Ports D, über den der Atmega den RAM-Baustein des Z80Ardu mit dem Programm versorgt. Und leider würde ich diesen Port auch für die Übertragung der Tastaturdaten benötigen. Das funktioniert also nicht. Am Z80Ardu hätte ich das Platinendesign ein wenig anpassen müssen. Ein paar Steuerleitungen hätten anders angeschlossen werden müssen. Auf dem Board sind noch Gatter frei, die ich dann für die Steurung hätte verwenden können.... Aber geht halt nicht... Also neue Idee entwickeln. Die neue Idee sieht wie folgt aus. Sie ist leider etwas komplizierter. Zum Einsatz kommt ein Atmega 168 oder Atmega 8 oder Atmega 328. Die sind alle Pinkompatibel; mal sehen, welcher sich vom Speicher her am besten eignet. Man könnte also sagen Arduino Nano oder Uno. Da auch hier Port D verwendet werden müsste um die Daten parallel an den Z80Ardu zu übertragen, ich aber einen der beiden Interrupt-Pins von dem Port benötige, kann also keine parallele Datenübertragung erfolgen. Stattdessen müssen die Daten seriell bereit gestellt werden. Dazu käme dann ein SN74HC595 Schieberegister zum Einsatz. Dieser stellt die seriell zugeführten Daten parallel zur Verfügung. An den Ausgängen des Schieberegisters wir ein SN74HCT573 Latch nachgeschaltet. Dieser nimmt die Daten vom Schieberegister an und gibt diese an den Datenbus des Z80Ardu weiter. Um auf dem Z0Ardu nicht unnötig Rechenleistung zu verschwenden, würde das Tastaturinterface auf dem Z80Ardu einen NMI (Non Maskable Interrupt) auslösen. Der Z80Ardu würde daraufhin eine Datenanfrage an das Interface schicken. Das Latch würde die Daten dann auf den Datenbus legen. Soweit mal zur Theorie.... Bislang noch nicht aufgebaut. Lediglich ein kleines Testprogramm mit der PS2Keyboard-Lib habe ich probiert. Dieses gibt die auf der Tastatur eingegebenen Buchstaben über die serielle Schnittstelle aus. Das funktioniert einwandfrei. Falls jemand noch eine andere Idee hat, dann gerne her damit. Das ist nämlich so ziemlich viel Aufwand für so ein einfaches Interface. LG Uni |
||
|
Unilein Fachgebiet Rauchentwicklung ![]() ![]() ![]() ![]() ![]() ![]() ![]() Beiträge: 741 Registriert seit: Apr 2014 Bewertung: 5 |
03.01.2019, 15:06
Zitat:Da auch hier Port D verwendet werden müsste um die Daten parallel an den Z80Ardu zu übertragen, ich aber einen der beiden Interrupt-Pins von dem Port benötige, kann also keine parallele Datenübertragung erfolgen. Stattdessen müssen die Daten seriell bereit gestellt werden. Dazu käme dann ein SN74HC595 Schieberegister zum Einsatz. Dieser stellt die seriell zugeführten Daten parallel zur Verfügung. An den Ausgängen des Schieberegisters wir ein SN74HCT573 Latch nachgeschaltet. Dieser nimmt die Daten vom Schieberegister an und gibt diese an den Datenbus des Z80Ardu weiter. Ich werde das heute mal aufbauen und probieren. Mir ist bei der Durchsicht des Datenblatts zum 74HC595 aufgefallen, dass dieser auch einen /OE-Pin (Output Enable) hat. Wenn ich das richtig interpretiere, könnte ich auf das Latch verzichten. Ein Bauteil weniger. Muss ich aber erst einmal überprüfen. LG Uni |
||
|
Unilein Fachgebiet Rauchentwicklung ![]() ![]() ![]() ![]() ![]() ![]() ![]() Beiträge: 741 Registriert seit: Apr 2014 Bewertung: 5 |
03.01.2019, 18:43
Hallo zusammen,
ich habe die Theorie heute mal in die Praxis umgesetzt. Zunächst lediglich mit dem Atmega328P (Arduino Nano) und dem Schieberegister 74HC595. Den Schaltplan habe ich unten angehängt. Natürlich baue ich das Ganze wieder mit "nackten Chips" und nicht mit dem Arduino, da ich das Ganze ja in meinen Z80Ardu integrieren möchte. Ich habe im ersten Schritt auf das Latch verzichtet und es sieht so aus, als würde das auch gehen. Zumindest mit LED's an den Ausgängen des Schieberegisters passt es. Da es sich beim 74HC595 um die CMOS-Variante des IC's handelt, könnte es sein, dass die Signalpegel nicht zum Z80Ardu passen, da die CMOS-Pegel von TTL-Pegel abweichen. Die Lösung wäre ein 74HC T 595. Der liefert TTL-Pegel oder alternativ einen Pegelwandler. Aber ich probiere es zunächst mal ohne. Hier ist der Code, der sich auf dem Atmega befindet. Entwickelt in der Arduino IDE, würde also auch mit einem Nano funktionieren. Der Code ist sogar so kompakt, dass es auch mit einem Atmega 8 oder Atmega 168 funktionieren würde. Code: /* Z80Ardu Keyboard Interface und hier ist der Schaltplan: Grüße Uni
(Dieser Beitrag wurde zuletzt bearbeitet: 03.01.2019, 19:10 von Unilein.)
|
||
|
Unilein Fachgebiet Rauchentwicklung ![]() ![]() ![]() ![]() ![]() ![]() ![]() Beiträge: 741 Registriert seit: Apr 2014 Bewertung: 5 |
05.01.2019, 17:02
Läuft!!
Heute habe ich es endlich geschafft. Eine PS/2-Tastatur arbeitet mit dem Z80Ardu zusammen. Wie zuvor beschrieben unter Zuhilfenahme des Atmega328 und eines Schieberegisters. Der reine Test mit den LED's als Datenanzeige hat gestern schon funktioniert. Als ich heute mit dem Z80Ardu getestet habe, musste ich zwei Delays ins Arduinoprogramm einbauen (zumindest vermutet ich, dass das nötig war). Außerdem ist die Spannungsversorgung des Z80Ardu zu schwach, um die Tastatur adäquat zu versorgen. Mit einer externen Spannungsversorgung und gemeinsamer Masse ging es dann. Ich werde die Konstruktion mal auf eine kleine Platine löten um das Z80-Programm entsprechend entwickeln zu können. Denn mit einer Tastatur wird einiges einfacher! Wenn das so funktioniert, werde ich wieder passende Platinen entwerfen und bestellen. Allerdings werde ich den Platz, der dort noch zur Verfügung steht, für weitere Dinge nutzen. Zum Beispiel für den Soundchip und evtl. auch für die serielle Schnittstelle. Das Ergebnis habe ich Euch als Youtube-Video eingefügt. (Bitte entschuldigt das verwackelte Bild, tippen mit einer Hand und gleichzeitig mit dem Handy filmen, sowie jeden Buchstaben mit SHIFT eingeben, ist nicht so einfach ![]() Grüße Uni ![]()
-----
Klopapier beidseitig verwenden und der Erfolg liegt auf der Hand!
(Dieser Beitrag wurde zuletzt bearbeitet: 05.01.2019, 17:09 von Unilein.)
|
||
|
Unilein Fachgebiet Rauchentwicklung ![]() ![]() ![]() ![]() ![]() ![]() ![]() Beiträge: 741 Registriert seit: Apr 2014 Bewertung: 5 |
05.01.2019, 20:03
Hallo zusammen,
und weil's auf dem Breadboard funktioniert hat, habe ich das gleich mal als Prototyp auf eine Platine gelötet: ![]() Jetzt muss ich noch die Scancodes im Keyboardprogramm auf dem AtMega anpassen, da der VDG 6847 keinen echten ASCII-Code kennt. Ich lege die Codes dort quasi mundgerecht ab, denn dann muss ich das auf dem Z80 nicht programmieren. Das spart jede Menge Speicherplatz. Das Programm auf dem AtMega ist übrigens 2350 Byte groß... Da könnte man also noch jede Menge Kram rein packen. Gruß Uni
-----
Klopapier beidseitig verwenden und der Erfolg liegt auf der Hand!
(Dieser Beitrag wurde zuletzt bearbeitet: 05.01.2019, 20:10 von Unilein.)
|
||
|
Titanes Member ![]() ![]() ![]() Beiträge: 75 Registriert seit: Aug 2015 Bewertung: 0 |
06.01.2019, 20:18
Hallo,
ich finde es immer toll Deine Fortschritte zu sehen ![]() ![]() Gruß Titanes Gesendet von meinem SM-T800 mit Tapatalk |
||
|
Unilein Fachgebiet Rauchentwicklung ![]() ![]() ![]() ![]() ![]() ![]() ![]() Beiträge: 741 Registriert seit: Apr 2014 Bewertung: 5 |
06.01.2019, 21:54
Zitat:Du mußt echt eine Engelsgeduld und viel Wissen haben. Bin schon gespannt wie es weiter geht. Geduld... ähm... Sagen wir mal so: zwischendurch muss ich hin und wieder durchatmen, weil's einfach nicht klappt. An dem drecks Tastaturding habe ich lange geknabbert. Und auch das Zusammenspiel zwischen Prozessorboard und Grafikkarte war echt nervenzermürbend. Was mein Wissen anbelangt: Es wird natürlich mehr. Aber ich hatte es ja schon einmal erwähnt, vor ca 4 Jahren hatte ich davon überhaupt noch keine Ahnung. Was die weiteren Schritte im Projekt angeht, werde ich zunächst einmal die Scancodes für die Tastatur soweit klar machen, dass ich alle Zeichen des MC6847 darstellen kann. Der Chip kann nur Großbuchstaben (standardmäßig), diese aber in normal und invertiert. Außerdem gibt es einen Satz "Grafikzeichen" bei dem die Zeichen jeweils aus 4 kleinen Blöcken bestehen. Der Hintergrund ist dabei immer schwarz, der sichtbare Teil der Blockgrafik kann je eine von 8 Farben annehmen. Diese Zeichen müssen auf jeden Fall alle über die Tastatur erreichbar sein. Wenn das dann passt, werde ich eine kleine Routine für den Z80 schreiben, mit der ich Daten auf dem Schirm ausgeben kann. Dabei soll berücksichtigt werden, dass am Ende des Bildschirms der Inhalt um eine Zeile nach ober geschoben werden muss. Eine weitere kleine Routine nimmt Tastatureingaben an und reagiert entsprechend. Das dürfte eine Kleinigkeit sein, denn im ersten Schritt werde ich nur einzelne Tasten abfragen. Tja... Und dann kommt die IDE-Schnittstelle. Ich habe bereits ein kleines Programm, welches Daten über die IDE-Schnittstlele lädt. Dafür benötige ich aber die Bildschirmausgabe und die Tastatureingabe. Nur damit kann ich das Programm bedienen... Ansonsten würde das über eine serielle Schnittstelle laufen. Die habe ich aber momentan nicht parat. Und dann werde ich weiter am BASIC-Interpreter arbeiten und dort die IDE-Schnittstelle "einflechten"... ...noch ein langer weg dorthin. Gruß, Uni |
||
|
Unilein Fachgebiet Rauchentwicklung ![]() ![]() ![]() ![]() ![]() ![]() ![]() Beiträge: 741 Registriert seit: Apr 2014 Bewertung: 5 |
31.01.2019, 16:14
Hallo zusammen,
hab mich ja schon wieder ein Weilchen nicht mehr zum Projekt geäußert. Also wird es wieder Zeit für ein kurzes Update. Aktuell findet keine Hardware-Entwicklung statt. Der Rechner funktioniert, die Grafik klappt, die Tastatur tut was sie soll. Die IDE-Schnittstelle liegt fertig aufgebaut auf meinem Basteltisch. Jetzt muss ich, um einen sauberen Test der IDE-Schnittstelle fahren zu können, ein Testprogramm entwickeln, welches die Funktionen der IDE -Schnittstelle aufruft und dann Feedback auf dem Bildschirm gibt. Ich habe also damit angefangen, Bildschirm- und Tastaturroutinen in Maschinensprache zu entwickeln, die mir helfen sollen, besser testen zu können. Aktuell arbeite ich primär an der Bildschirmausgabe (Einzelne Zeichen ausgeben, Zeichenketten ausgeben, Bildschirmscrolling usw). Die Routinen stehen soweit und sind aus meiner Sicht geeignet, entsprechende Bildschirmausgaben zu generieren. Die Routine habe ich einfach mal eingefügt. Der interessierte Leser kann ja mal rein schnuppern. Ein paar Kleinigkeiten sind mir im Nachhinein noch eingefallen, es handelt sich dabei aber um reine Kosmetik bei der Bildschirmausgabe. Wichtig ist, dass der Code so, wie er dargestellt ist, prinzipiell individuell einsetzbar ist (auf einem Z80-Prozessor mit einer Grafikeinheit mit Video-RAM, welches im 64K Adressraum gemapped ist). Der genutzte MC6847 stellt allerdings keine ASCII-Codes dar. Das "A" ist im ASCII-Code mit der Nummer 65 versehen. Auf dem MC6847 ist der zugehörige Code "1". Da muss also ein wenig umgerechnet werden. Gruß Uni
(Dieser Beitrag wurde zuletzt bearbeitet: 31.01.2019, 16:20 von Unilein.)
|
||
|
Unilein Fachgebiet Rauchentwicklung ![]() ![]() ![]() ![]() ![]() ![]() ![]() Beiträge: 741 Registriert seit: Apr 2014 Bewertung: 5 |
05.02.2019, 14:06
Hallo zusammen,
die Ausgaberoutine habe ich noch einmal überarbeitet. Jetzt kann sie auch Zeilenschaltungen und vollständiges Bildschirmscrolling, wenn der Bildschirm voll ist. Auf dem Bildschirm sieht das dann so aus (Ich habe das Programm auf dem VZEMU-Emulator getestet. Der emuliert den MC6847 und ist auch sonst dem Z80Ardu nicht unähnlich): Gruß Uni
(Dieser Beitrag wurde zuletzt bearbeitet: 05.02.2019, 14:07 von Unilein.)
|
||
|
Titanes Member ![]() ![]() ![]() Beiträge: 75 Registriert seit: Aug 2015 Bewertung: 0 |
06.02.2019, 23:15
(05.02.2019, 14:06)Unilein schrieb: Hallo zusammen,Hi Uni, schön zu sehen wie es mit der Textausgabe voran geht. Gruß Titanes Gesendet von meinem SM-T800 mit Tapatalk |
||
|
|
Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste