Ein Atmega328 steuert einen Z80-Computer

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

Beiträge: 734
Registriert seit: Apr 2014
Bewertung: 5
#31
28.11.2017, 22:35

Aber wieder zurück zum Projekt....

Ich habe jetzt noch MC6850 Schnittstellebausteine besorgt, um dem Compi eine serielle Schnittstelle verpassen zu können. Dazu werde ich dann wieder eine eigene Platine bauen. So richtig mit RS232-Schnittstelle in 9-polig (braucht heute kein Mensch mehr).

Außerdem arbeite ich immer noch an der "Grafikkarte". Da Timing ist wieder mal (wie schon ganz oft in meinen Projekten) ein großes Problem.

Und was auch noch fehlt, ist eine Steuerung für Ein-/Ausgabegeräte. Dazu wird, vermutlich auf der Grundplatte, noch ein Demultiplexer seinen Platz finden, der über die Adressen A0-A2 bis zu 8 externe Geräte ansteuern kann. So zum Beispiel die serielle Karte, die ich oben erwähnte.

Auf die Ergebnisse werdet Ihr aber mal wieder ein wenig warten müssen. Meine Zeit ist mal wieder knapp. Außerdem hat es bei mir im Haus gebrannt (Schornsteinbrand), sodass ich nun leider noch ein paar weniger elektronische Baustellen habe.

Gruß
Uni
-----

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

Beiträge: 734
Registriert seit: Apr 2014
Bewertung: 5
#32
30.12.2017, 21:14

Ich habe mein Projekt ja inzwischen "modularisiert". Also die einzelnen Bestandteile auf eigene Platinen gelötet. Das Ergebnis war ja in den vorigen Beiträgen bereits zu sehen. Ich benutze für meine Aufbauen ja meist Streifenrasterplatinen. Den korrekten Aufbau da unterzubringen ist schon eine komplexe Arbeit. Schließlich sind schon bei der Z80-Karte ca 150-200 Lötpunkte zu setzen und ca. 75-100 Kabel unterzubringen.

Ich habe deshalb jetzt meine Prozessorkarte wieder mal bei Easyeda gezeichnet und fertige Platinen bestellt. Die sind jetzt unterwegs. Dauer aber sicher noch bis ca. Ende Januar, bis die eintreffen. Die Karte werde ich dann aufbauen und dann auch die anderen Bestandteile, wie die "Grafikkarte" und die serielle Schnittstelle auch zeichnen und über Easyeda bestellen.

Aktuell löte ich noch eine Z80-Karte für Messungen und Tests. Die wird dann vermutlich nur für Programmiertests genutzt werden. Nunja... Morgen vielleicht noch ein wenig basteln, wenn meine Frau keine anderen Pläne für mich hat...

Gruß
Uni
-----

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

Beiträge: 734
Registriert seit: Apr 2014
Bewertung: 5
#33
27.01.2018, 22:49

Hallo zusammen,

hier mal wieder ein kleines Update zu meinem "never ending" Computerprojekt. Heute sind meine Platinen aus Singapur eingetroffen. Da musste ich natürlich gleich mal anfangen, meinen Z80Ardu zusammenzubauen. Nach nur ca 60 Minuten war ich mit dem Löten fertig.

Leider sitzt der Quarzoszillator ein wenig schief, weil ich nicht bedacht hatte, dass der ISP-Programmierstecker des Atmegaetwas breiter ist. Auf der einen Seite ragt er ein wenig über dem Platinenrand hinaus und auf der anderen Seite drückt er gegen die Fassung vom Oszillator. Naja... Egal, da überlege ich mir noch eine Lösung. So ein Oszillator hat ja nur 4 Pins. Evtl eine kleine Huckepackplatine oder so.

Getestet habe ich mein Werk noch nicht. Das werde ich morgen angehen. Das wird mal wieder spannend denn man glaubt gar nicht, was man so alles für logische Fehler beim Planen einer solchen Schaltung (die eigentlich nicht allzu komplex ist) machen kann.

Natürlich habe ich diesem Beitrag wieder Bilder beigefügt :-)

Achja... Der Atmega328 (Der Chip, der auch auf dem Arduino Nano sitzt) sitzt links unten auf der Platine. Das Programm wurde für den Nano geschrieben und mit Atmel Studio Kompiliert. Das Ergebnis, eine HEX-Datei, habe ich mit dem ISP-Programmer auf den Chip übertragen. Danke der ISP-Schnittstelle kann das Programm jederzeit austauschen. Der 328er hat auch noch Platz für weitere Programmteile. Und es sind auch noch 7 freie Pins verfügbar, die ich auch auf der Platine als kleine Steckleiste bereit gestellt habe..

Grüße
Uni


           
(Dieser Beitrag wurde zuletzt bearbeitet: 27.01.2018, 23:00 von Unilein.)
Zitieren
Unilein
Fachgebiet Rauchentwicklung
*******

Beiträge: 734
Registriert seit: Apr 2014
Bewertung: 5
#34
28.03.2018, 13:23

Hallo Leute,

heute ist die neue Version meiner Z80Ardu-Platine gekommen. Das ist jetzt die dritte Version der Platine.

Zu erkennen ist gemäß der Beschriftung der Atmega328, welcher dem Chip auf dem Arduino Nano entspricht (links unten). Da drüber drei Latches, die die Adresse und die Datenbytes für das SRAM zur Verfügung stellen. Rechts dann der Z80 zusammen mit etwas Steuerlogik.

Gruß
Uni

[Bild: 550f05dc7eef14b02985a730d22b20c2.jpg]

Gesendet von meinem SM-G930F mit Tapatalk
-----

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

Beiträge: 734
Registriert seit: Apr 2014
Bewertung: 5
#35
28.03.2018, 15:16

und weil ich Urlaub habe, habe ich auch gleich mal eine Version zusammengelötet...
Gegenüber der vorigen Version ein leicht verbessertes Platinendesign. Außerdem einige zusätzliche Signalleitungen, sowohl vom Atmega als auch vom Z80 um diese für zukünftige Planungen verwenden zu können (z.B. Tastaturabfrage oder Ähnliches).

Achja... Und wie man sieht, habe ich bei einigen ICs auf Fassungen verzichtet. Erstens hatte ich keine passenden mehr und zweitens funktioniert das Teil ja grundsätzlich bereits. :-)

Gruß
Uni

[Bild: 39d393195fb2ab090e02eae56ce655b4.jpg]
-----

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

Beiträge: 734
Registriert seit: Apr 2014
Bewertung: 5
#36
28.03.2018, 15:53

Für meine Platinen habe ich mir noch eine Bus-Platine gebastelt auf die man die Karte aufstecken kann. Die ist auch noch für weitere Karten vorgesehen. Da ist auch schon eine Stromversorgung mit verbaut (klassisch mit 7805 Spannungsregler), die dann die Karten alle mit Saft versorgt. Vorsorglich habe ich einen kleinen Kühlkörper am Spannungsregler angeschraubt, damit es dem Kleinen nicht ganz so warm wird. 1,5 Ampere sollte das Teil aber an Last vertragen können. Aktuell bin ich, wenn der 16550 und ein Taktgenerator für denselben, sowie die Prozessorkate angeschlossen sind, bei 250 mA. Da geht also noch was.

Der PC16550 ist übrigens ein UART für serielle Datenübertragung. Ich versuche den gerade zur Kommunikation zu überreden Dodgy


Demnächst mehr aus diesem Theater...

Gruß
Uni



[Bild: 118a278707ea220cd1cfb7000b8181d6.jpg]

[Bild: 6cb5e58cf83e8e04e4d9364118b540e5.jpg]
-----

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

Beiträge: 734
Registriert seit: Apr 2014
Bewertung: 5
#37
30.03.2018, 20:44

Hallo zusammen,

kurzes Update zum aktuellen Geschehen... Mein Plan war es ja, eine serielle Schnittstelle an meinen Z80Ardu anzuschließen. Dazu hatte ich einen PC16550 UART auf mein Breadboard gepackt und diesen mit dem Z80Ardu verdrahtet. Zunächst tat sich da überhaupt nichts. Im Terminalprogramm keinerlei Regung. Es hat eine ganze Weile gedauert, bis ich heraus gefunden hatte, dass der Oszillator (18,432 MHz), mit dem ich den Takt für den UART erzeugte, kein ordentliches Signal lieferte. Daraufhin habe ich den Oszillator um einige Treiberstufen erweitert, um das Signal entsprechend zu verbessern. Hat leider nix gebracht.

Mein nächster Versuch war ein 1,8432 MHz Quarz (Also nur noch ein Zehntel vom ursprünglichen Oszillator), den ich mit einer Pierce-Schaltung zum Schwingen gebracht habe. Der Takt war daraufhin stabil und ich hatte ein sauberes Rechtecksignal. Also Testprogramm umgeschrieben und erneute Versuche --> Tja... Tatsächlich kam jetzt auch etwas im Terminalprogramm an.... Allerdings nur Schrott. Ich weiß nicht, wie oft ich mein Programm überprüft habe.

Ich hatte dann den Verdacht, dass mein Z80Ardu vielleicht nicht ordentlich funktioniert. Also Logic-Analyzer ausgepackt und ewig Signale überprüft. Sah aber alles gut aus.

Tja... Am Ende war ich natürlich leicht genervt. Kann doch nicht so schwer sein!! Jetzt habe ich einen neuen Verdacht: Ich benutze einen UART nach USB-Konverter (aus China). Vielleicht verursacht der das Problem. Leider habe ich keine andere Möglichkeit zu testen, ob das Teil spinnt. Also muss eine neue Idee her. Und die Idee ist ziemlich nahe liegend. Ich nehme einfach einen Arduino und füttere ihn an einem Port mit den 8 Bit aus meinem Z80Ardu (also die Daten, die eigentlich über die serielle Schnittstelle raus sollten). Den Arduino verbinde ich mit meinem PC und gebe die 8 Bit einfach über die serielle Schnittstelle aus.

Heute wird das sicher nix mehr, aber wenn meine Frau mich lässt ( Big Grin ), dann kann ich das morgen mal umsetzen.

Gruß
Uni
Zitieren
Unilein
Fachgebiet Rauchentwicklung
*******

Beiträge: 734
Registriert seit: Apr 2014
Bewertung: 5
#38
01.04.2018, 12:10

Hallo zusammen,

ich hab meinen Plan noch einmal grob überschlagen und ein paar Fakten geprüft. Mit einem Atmega328 (also einem Arduino Nano) geht der Plan nicht auf. Zumindest nicht ohne größeren Programmieraufwand. Das liegt daran, dass lediglich EIN kompletter Port vorhanden ist (Port D). Den würde man idealerweise komplett nutzen um 8 Bit Daten direkt über die Eingänge PD0 - PD7 zu empfangen. Das geht aber nur solange, bis man auf die Idee kommt, den seriellen Port (UART) des Bausteins zu nutzen. Dieser liegt nämlich ebenfalls auf Port D und nimmt einem somit zwei Pins (RXD und TXD) weg.

Es ist dadurch also nötig, 8 Bit Daten in zweimal 4 Bit zu teilen und diese auf zwei halbe Ports zu legen. Das ist natürlich möglich, jedoch ist der Programmieraufwand dafür entsprechend größen und es macht das Programm langsamer.

Wenn ich das Ganze dennoch mit dem Atmega 328 umsetze, dann in Maschinensprache, da die Arduino IDE zu viel Overhead erzeugt und das Programm dadurch langsam wird. DA muss ich mir aber erstmal wieder meine Unterlagen herauskramen.... Ich habe schon eine Weile kein Assembler auf den Atmel Chips benutzt, weil ich mich doch recht starkt mit dem Z80 beschäftigt habe. Big Grin Vielleicht hilft mir ja dieser Beitrag: https://micro-dev.de/showthread.php?tid=317

Gruß
Uni
-----

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

Beiträge: 734
Registriert seit: Apr 2014
Bewertung: 5
#39
01.04.2018, 21:23

Moin!

Ich habe heute noch einmal ein wenig herum probiert und es dann tatsächlich geschafft 16 Zeichen seriell zu übertragen. Danach kam immer nur Salat im Terminalprogramm an.

Ich hab 1000 mal mein Programm überprüft. Auch alle Signale noch einmal mit dem Oszilloskop geprüft. Nix! Alles ok!

Also noch einmal das Datenblatt vom Pc16550 gelesen und dabei nicht schlauer geworden.

Ich wollte eben schon aufgeben, als ich die Idee hatte, mal die Taktfrequenz vom Z80Ardu von 3.57 MHz auf wenige KHz herunter zu schrauben. Und siehe da, es funktioniert. Bild vom Ergebnis hängt an.

Jetzt muss ich entweder mein Programm entsprechend anpassen, damit sich der PC16550 nicht verschluckt oder ich muss einen anderen Baustein benutzen.

Gruß
Uni
[Bild: 075020920d0ef6af6c84d232977678fd.jpg]

Gesendet von meinem SM-G930F mit Tapatalk
-----

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

Beiträge: 734
Registriert seit: Apr 2014
Bewertung: 5
#40
02.04.2018, 14:40

Und es war doch ein Fehler im Programm. Genau EIN Bit war falsch... Mit verheerenden Auswirkungen
Nunja... Jetzt funktioniert es Big Grin

Die nächsten Schritte werden nun folgende sein:

* Ich hätte gerne ein "Betriebssystem" für den Z80 Ardu (CP/M?? oder Basic??)
* Die serielle Schnittstelle muss vollendet werden - Also Platine gestalten und bestellen
* Ich benötige noch eine Ausgabeeinheit für den Bildschirm (Grafikkarte)
* Eine Tastatur am System wäre hilfreich Big Grin (Hab ich da. Eine alte PC-XT Tastatur mit seriellem Ausgang)
* Irgendwo Daten speichern wäre ja auch nicht schlecht. Eine CF-Karte als "Festplatte" wäre auch nett


Die Systeme der 70er und 80er hatten oft Basic als "Betriebssystem". Es war meist direkt nach dem Einschalten verfügbar. Also könnte ich Basic implementieren. Ein entsprechendes Programmlisting liegt mir vor. Ich muss es "nur mal eben" portieren.

Im Rahmen der Überlegungen bezüglich des Betriebssystems muss natürlich geklärt werden, wo die Ausgaben hin sollen: Serielle Schnittstelle oder doch lieber über eine Grafikeinheit? Ich würde das eigentlich gerne über eine Grafikeinheit erledigen. Ich muss mir allerdings noch überlegen, welchen Baustein ich dazu verwenden möchte. Ich hatte vor Monaten TMS9981-Bausteine in China bestellt, aber die sind leider auf dem Postweg verloren gegangen. Eine Alternative wäre der MC6847 (hab ich da). Mit dem kenne ich mich bereits aus. Allerdings sind dessen Fähigkeiten begrenzt.

Sofern ich mich für die Bildschirmausgabe mit einem Grafikchip entscheide, könnte ich die serielle Schnittstelle mit einer ESP8266 pimpen und den Z80Ardu Wlan-tauglich machen. Die Idee finde ich persönlich recht spannend.

Tja und was die Speicherung (und natürlich das Laden) von Daten angeht, wäre eine CF-Karte geeignet. Alternativ ginge natürlich die SD-Karte, die sowieso am Z80Ardu hängt. Da aktuelle Design der Schaltung macht die Kommunikation allerdings schwieirg, da die eingesetzten Latches ja nur in EINE Richtung funktionieren. Fürs Speichern wäre aber die andere Richtung (Also Z80 zum Atmega) erforderlich.

Mal sehen... Habt Ihr vielleicht Ideen?  Ein wenig Feedback wäre mal interessant.

Gruß
Uni


Ausgabe auf dem Terminalprogramm:
[Bild: ec3eeec9276961e98831a2c44f85a70c.jpg]


Hier ist übrigens das Programm für die Ausgabe des Textes:
 
;***********************************
;*  UART Test Program              *
;*                                 *
;***********************************
 
                   ORG 0000H
 
;******************************************************************
;INIT_UART
;Function: Initialize the UART to BAUD Rate 9600 (1.8432 MHz clock input)
;DLAB  A2 A1 A0 Register
;Dez    4  2  1
;0      0  0  0  Receiver Buffer (read),         = 0  = $00
;                Transmitter Holding
;                Register (write)
;0      0  0  1  Interrupt Enable                = 8  = $08
;X      0  1  0  Interrupt Identification (read) = 16 = $10
;X      0  1  0  FIFO Control (write)            = 16 = $10
;X      0  1  1  Line Control                    = 24 = $18
;X      1  0  0  MODEM Control                   = 32 = $20
;X      1  0  1  Line Status                     = 40 = $28
;X      1  1  0  MODEM Status                    = 48 = $30
;X      1  1  1  Scratch                         = 56 = $38
;1      0  0  0  Divisor Latch                   = 0  = $00
;                (least significant byte)
;1      0  0  1  Divisor Latch                   = 8  = $08
;                (most significant byte)
 
;******************************************************************
 
; --< Globale Variable >-------------------------------------------
stack:             equ 0CFFFH
LCR:               equ 003H + 20H        ; Line Control Register
LSR:               equ 005H + 20H        ; Line Status Register
DLL:               equ 000H + 20H        ; Divisor Latch LSB
DLM:               equ 001H + 20H        ; Divisor Latch MSB
RBR:               equ 001H + 20H        ; Receive Buffer Register
THR:               equ 000H + 20H        ; Transmitter Holding Register
FCR:               equ 002H + 20H        ; FiFo Control Register
_8N1:              equ 00000011B         ; 8 Datenbits, ein Stopbit, keine Parität
 
                             
;******************************************************************
;Main Program
;Function: Display A->Z then a new line and loop
;******************************************************************
                  ld sp,stack           ; Stackpointer setzen
                  ld      b, 0FFH       ;
wait1:             nop
                  nop
                  nop
                  nop
                  nop
                  nop
                  nop
                  nop
                  nop
                  nop
                  djnz    wait1
 
_again:            call    _inituart    ; Serielle Schnittstelle initialisieren
 
                  ld      hl,_init     ; Text adressieren
                 
 
_mainloop:         nop
                  nop
                  nop
                  in      A,(LSR)      ; Line-Status-Register lesen
                  bit     5,A          ; Teste BIT 5. Es ist gesetzt, wenn UART bereit.
                  jr      Z,_mainloop  ;
             
                   
                  ld      a, (hl)      ; Nächsten Buchstaben im Text
                  cp 0
 
                  jr      z,ende     ; Dann von Vorne
                  out     (THR),a      ; Buchstabe ausgeben
                  inc     hl           ; nächster Buchstabe
                 
                  jr      _mainloop
 
ende:             halt
                 
 
; --< UART initialisieren >---------------------------------------------------------
_inituart:         ld     a,01H         ; FIFO anschalten
                  out    (FCR),a      
                  ld     A,80H         ; DLAB-Flag maskieren -- Divisor Latch
                  out    (LCR),A
                  ld     A,1EH         ; 38400 bps und 18,432 Mhz Takt
                  out    (DLL),A       ; Setze BAUD Rate auf 38400
                  ld     A,00H
                  out    (DLM),A       ; Setze BAUD Rate auf 38400
                  ld     A,_8N1        ;
                  out    (LCR),A       ; 8 Datenbits, 1 Stopbit, DLAB Flag zurücksetzen
                  or     a
                  out    (LCR),a       ; Und normale Funktion
                  ret
 
; --< Texte >---------------------------------------------------------
_init:             defm    1bh,"[0;34mZ80Ardu Homebrew Computer^[[0m",0dH,0ah
                  defm    "64K Byte RAM. ",0dh,0ah
                  defm    0dh,0ah
                  defm    "Powered by Atmega 328 & Z80",0dh,0ah
                  defm    0dh,0ah
                  defm    "© 2018 by Unilein@micro-dev.de",0dh,0ah
 
-----

Klopapier beidseitig verwenden und der Erfolg liegt auf der Hand!
(Dieser Beitrag wurde zuletzt bearbeitet: 02.04.2018, 15:00 von Unilein.)
Zitieren


Gehe zu:


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