Protokoll zum Z80-Projekt. Andreas Amann, Alexander Zahn

Protokoll zum Z80-Projekt Andreas Amann, Alexander Zahn 27. August 2006 INHALTSVERZEICHNIS Inhaltsverzeichnis 1 Vorwort 1.1 Ziel des Projekts . . ....
Author: Imke Dittmar
0 downloads 2 Views 170KB Size
Protokoll zum Z80-Projekt Andreas Amann, Alexander Zahn 27. August 2006

INHALTSVERZEICHNIS

Inhaltsverzeichnis 1 Vorwort 1.1 Ziel des Projekts . . . . . . . . . . . . . . . . . . . . . . . . . 1.2 Was ist der Z80 . . . . . . . . . . . . . . . . . . . . . . . . . . 1.3 Problemstellung . . . . . . . . . . . . . . . . . . . . . . . . . .

2 2 2 2

2 Versuchsaufbau 2.1 Einzelschritt-Generator 2.2 Adressierung . . . . . . 2.3 Interrupts . . . . . . . . 2.4 Eingabe-Interface . . . . 2.5 PIO . . . . . . . . . . .

3 3 3 4 5 5

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

3 Implementierung

5

4 Hinweise zur Erweiterung

7

5 Quellen

7

6 Anh¨ ange 6.1 Quellcode Adressdecoder . . . . . . . . . . . . . . . . . . . . . 6.2 Quellcode Z80 Programm . . . . . . . . . . . . . . . . . . . .

8 8 8

Seite 1

1

1

VORWORT

Vorwort

1.1

Ziel des Projekts

Ziel des Projekt ist die Vermittlung der wesentlichen Konzepte eines Mikroprozessorsystems wie z.B. das Zeitverhalten, Kennenlernen der verschiedenen Adressierungsarten, die Befehlsausf¨ uhrung, das Interruptsystem und Verwendung von Periphere und Systembauelemente.

1.2

Was ist der Z80

Der Z80 ist ein 8-Bit Mikroprozessor der Firma Zilog, diese entstand durch einen abgewanderten Intel-Entwickler. Der Z80 kam 1976 auf den Markt und eroberte diesen schlagartig. Seine Vorteile liegen klar auf der Hand: • Bin¨ arkompatibilit¨ at zum Intel 8080 • einfachere Spannungsversorgung (+5V statt +-5V, +12V) • eingebaute Refreshsteuerung f¨ ur DRAM • bessere Interruptfunktionen • echte 16-Bit-Register • einfachere Mnemonics • g¨ unstiger Preis Wir verwenden in unserem Versuchsaufbau nicht den orginalen Z80, sondern den popl¨ aren Nachbau U880. Neben dem Prozessor steht uns eine ParalleleInput-Output-Einheit (PIO), eine Serielle-Input-Output-Einheit (SIO) und eine Z¨ ahl/Timer-Einheit (CTC) zur Verf¨ ugung. Der Z80/U880 verf¨ ugt u ¨ber gute Zug¨anglichkeit zum Bus und der M¨oglichkeit in den sogenannten Einzelschritt-Modus zu gelangen. Somit ist er die ideale Versuchsplattform um die Funktionsweise eines Computer-Systems zu beobachten und zu verstehen. Die dabei vermittelten Grundkonzepte lassen sich auch auf die heutigen modernen Konzepte reflektieren.

1.3

Problemstellung

Als konkretes Problem gilt es ein Schrittmotor aus einem 5,25 Zoll Diskettenlaufwerk anzusteuern. Hierbei generieren wir Signale, die vom Motor als Vollschritt erkannt werden. Es gibt jeweils eine Taste f¨ ur einen Links- bzw. einen Rechtsschritt. Zusammengefasst: Seite 2

2

VERSUCHSAUFBAU

• Feste Schrittgeschwindigkeit • Links- / Rechtsschritt Als Eingabe-Interface f¨ ur unsere Projekt wollen wir entprellte Taster verwenden.

2 2.1

Versuchsaufbau Einzelschritt-Generator

Um den Prozessor in den sogenannten Einzelschritt-Modus zu bringen, ben¨otigen wir ein /WAIT - Signal (¨ ahnlich dem HWP3 Versuch: POST-Karte).

2.2

Adressierung RAM (2K) ROM (4K) PIO (Daten) PIO2 (Steuerung)

Speicheraufteilung 8000h bis 87FFh (g¨ ultiger Speicherbereich, weil vorhanden) 0000h bis 0FFFh (g¨ ultiger Speicherbereich, weil vorhanden) XXX1h XXX3h

Damit wir die einzelnen Komponenten gezielt ansteuern k¨onnen, ben¨otigen ¨ wir einen Adressdecoder. Uber diesen geben wir Signale auf die entsprechenden Leitung zur Aktivierung des bestimmten Bausteins. Zur Unterscheidung von RAM und ROM w¨ ahlen wir die unvollst¨andige Dekodierung. D.h. wir werten aus dem Adressbereich nur A15 f¨ ur die Auswahl von ROM bzw. RAM aus. Nach dem Einschalten der CPU greift diese auf die Adresse 0000h zu. Somit ist es sinnvoll A15 f¨ ur die Auswahl des ROMs und /A15 f¨ ur die Auswahl des RAMs zu verwenden. Sobald der Prozessor Daten lesen will wird RD = 0 und MEMRQ = 0 wenn auf den Speicher zugeriffen werden soll. Somit gilt f¨ ur die Generierung des CS des ROMs: !CS = !MEMRQ und !RD und !A15 Und f¨ ur das CE des RAMs gilt: !CE = !MEMRQ und A15

Seite 3

2

VERSUCHSAUFBAU

Anzumerken ist noch, dass bei der Decodierung der Adressen nicht nur die g¨ ultigen Speicherbereiche angesprochen werden, die mit RAM-Speicher hinterlegt sind. Der Bereich der durch unseren Adressdecoder generiert wird umfasst zus¨ atzlich zum g¨ ultigen Adressraum von 8000h bis 87FFh auch noch einen ung¨ ultigen Adressraum von 87FFh bis FFFFh, der u ¨berhaupt nicht mit RAM hinterlegt ist. Die PIO wird mit der Adresse XXX1h (A0 = 1) angesprochen. A0 wird bei der PIO f¨ ur die Auswahl des Kanals A bei A0 = 0 und Kanal B bei A0 = 1 genutzt. Somit kann bei unserer Adressierung immer nur Kanal B angesteuert werden. Da wir sowieso nur Kanal B benutzen wollten, ist dies kein Nachteil. Jedoch ist die PIO-Adressierung bei der Erweiterung des Projekts nochmals zu u ¨berdenken, da diese den Projektausbau einschr¨ankt. Das Problem ist n¨ amlich, dass PIO, SIO und CTC die Adressen A0 und A1 zur Steuerung verwenden. Konsequenz w¨are dann z.B. wenn ich das CS f¨ ur die CTC u ¨ber A3=1 generiere und dann ein Steuerwort an die CTC sende, das A1 = 1 beinhaltet, wird auch die PIO f¨alschlicherweise angesprochen. Besser ist es die Low-Bytes A7 bis A2 f¨ ur die Auswahl zu verwenden. Somit k¨onnte man z.B. das entsprechende CS f¨ ur PIO bei A2=1, SIO bei A3=1 und CTC bei A4=1 generieren. Den Stackpointer initialisieren wir mit der Adresse FFFFh. Sinnvoller w¨are es gewesen, den Stackpointer auf das Byte unmittelbar u ¨ber den Stack befindliche Byte zu setzen. Da Z80 erst den Stackpointer dekrementiert und dann erst das Byte in den Speicher schreibt.

2.3

Interrupts

Ein Mikroprozessor-System kann aus mehreren Hardware-Komponenten bestehen. Die meisten externen Hardware-Komponenten ben¨otigen die CPU nur zu bestimmten Zeiten. Die Hardware fordert die CPU nur an, wenn sie gebraucht wird. Eine solche Anforderung bezeichnet man als InterruptAnfrage. Wir verwenden f¨ ur unseren Versuchsaufbau den Interrupt-Modus 2 des Z80, d.h. wir arbeiten mit vektorisierten Interrupts. F¨ ur die Interrupt-Behandlung mittels vektorisierter Interrupts ben¨otigen wir die Basisadresse der Interruptvektortabelle und einen Interruptvektor, welcher nur einen Offset zur Basisadresse darstellt. Die Basisadresse wird beim Aufsetzen des Z80 in den Interrupt-Modus 2 in das Interrupt-VektorRegister geladen. Nach dem Einschalten und der Initialisierung unseres Systems befindet sich die CPU im Hauptprogramm. In unserem Hauptprogramm wird nichts ausgef¨ uhrt, somit befindet sich die CPU in einer Art Haltezustand. Seite 4

3

IMPLEMENTIERUNG

Mittels der von uns angeschlossenen Taster l¨osen wir u ¨ber die PIO eine Interrupt-Anfrage aus. Nachdem die Interrupt-Anfrage best¨atigt wurde, wird der Interruptvektor auf den Datenbus gelegt. Der von der PIO u ¨bergebene Interruptvektor wurde bei derer Programmierung festgelegt. Aus der Basisadresse und dem Interruptvektor wird eine 16-Bit-Adresse gebildet, diese verweist auf einen bestimmten Eintrag der Interruptvektortabelle. Dort befindet sich die absolute Speicheradresse der Interrupt-ServiceRoutine (ISR), welche jetzt ausgef¨ uhrt wird. Nachdem die CPU die ISR abgearbeitet hat, befinden wir uns wieder im Hauptprogramm.

2.4

Eingabe-Interface

F¨ ur den Versuchsaufbau ben¨otigen wir • 1 Reset-Taster • 1 Einzelschritt-Taster • 1 Taster f¨ ur Linksschritt • 1 Taster f¨ ur Rechtsschritt Um einen st¨ orungsfreien Betrieb zu garantieren, m¨ ussen alle Taster entprellt werden. Dies l¨ osen wird hardwarem¨aßig u ber eine Schmitt-Trigger¨ Schaltung. Wir verwenden hierf¨ ur einen 4093-Baustein, welcher 4 NANDSchmitt-Trigger beinhaltet. Alternativ besteht auch die M¨oglichkeit die Taster softwarem¨ aßig zu entprellen.

2.5

PIO

Wir verwenden in unserem Projekt die PIO. Dies ist ein programmierbarer I/O-Baustein, der speziell f¨ ur die Zusammennschaltung mit dem Z80 entwickelt wurde. Zum Initialisieren der PIO schickt man ihr spezielle Steuerw¨ orter. Durch diese kann man die PIO entsprechend der Anforderungen programmieren/initialisieren. Um der PIO mitzuteilen, dass wir ein Steuerwort auf den Datenbus legen, wird die Adresse XXX3h (siehe Adressierung, PIO2) verwendet. F¨ ur einen lesenden oder schreibenden Zugriff auf die Datenbytes des Datenports B wird die Adresse XXX1h (siehe Adressierung, PIO) verwendet. Wir setzen die PIO im Modus 3 ein, da wir sie in einer Nicht-Handshake-Umgebung einsetzen. Die acht Bits des Ports B k¨onnen somit in beliebiger Anordnung als Eingabe- oder Ausgangleitungen dienen.

3

Implementierung

Wir verwenden f¨ ur unsere Schrittmotorsteuerung Kanal B der PIO. Diese stellt uns 8 Ein/Ausg¨ ange zur Verf¨ ugung. 4 Pins definieren wir als Ausgang Seite 5

3

IMPLEMENTIERUNG

(an dieser Stelle wird der Treiber f¨ ur den Schrittmotor angeschlossen) und 4 Pins definieren wir als Eingang, wobei jedoch nur zwei f¨ ur das Interruptbehandlung maskiert sind.

Diese beiden Pins sind High-Aktiv und mittels Oder-Logik (Intern in der PIO) verbunden. Im konkreten heisst dies, falls einer der beiden Taster (Links oder Rechts) gedr¨ uckt wurde, springen wir in die selbe ISR. Erst ¨ dort findet mittels Shift-Operationen und dem Carry-Flag eine Uberpr¨ ufung statt welche Taste gedr¨ uckt wurde. Falls beide Taster gedr¨ uckt werden, wird der zuerst gedr¨ uckte ausgewertet.

Je nachdem ob das Carry-Flag gesetzt wurde oder nicht (entspricht der Auswahl des Tasters) laufen dann getrennte Routinen ab, welche den Schrittmotor in die eine oder in die andere Richtung laufen lassen. Da wir den Motor im Vollschrittmodus betreiben, heisst dies, dass wir jeweils nur eine Spule des Schrittmotors gleichzeitig benutzen. Zustand Zustand Zustand Zustand

1 2 3 4

Spule 1 1 0 0 0

Spule 2 0 1 0 0

Spule 3 0 0 1 0

Spule 4 0 0 0 1 Seite 6

5

QUELLEN

Somit reicht es aus, wenn wir ein einzelnes Bit (dies muss nat¨ urlich eine 0 3 2er Potenz zwischen 2 und 2 sein) setzen. Durch den Tastendruck shiften wir dieses Bit eine Stelle h¨ oher oder niedriger.

Abk¨ urzung Erl¨auterung Links Steigende Flanke, durch Tastendruck der Linkentaste Steigende Flanke, durch Tastendruck der Rechtentaste Rechts Gleich Taste bleibt gedr¨ uckt oder kein erneuter Tastendruck Das somit erzeugte Bitmuster wird durch die PIO eins zu eins an den Treiber angelegt, von diesem verst¨arkt und dem Schrittmotor zugef¨ uhrt.

4

Hinweise zur Erweiterung

Bei der oben beschriebenen Implementierung entspricht eine Bet¨atigung eines Tasters f¨ ur Links- bzw. Rechtsschritt einem Vollschritt. Bei zus¨atzlicher Einbindung der CTC w¨ are es m¨oglich durch diese mehrere Schritte pro Tastendruck generieren zu lassen. Jedoch sollte man hierbei das Zeitverhalten, mit der die Vollschritte aufeinander folgen, bedenken. Wird eine maximale Schrittgeschwindigkeit u ¨berschritten hat dies zu Folge, dass der Motor die Signale nicht mehr ordungsgem¨aß verarbeiten kann.

5

Quellen • http://de.wikipedia.org/wiki/Schrittmotor (Stand 11.5.2006) • http://www-users.rwth-aachen.de/thorsten.ostermann/ (Stand 11.5.2006) • http://de.wikipedia.org/wiki/Z80 (Stand 17.8.2006) • http://www.z80.info/ (Stand 17.8.2006) • http://www.zilog.com/ (Stand 17.8.2006) Seite 7

6

¨ ANHANGE

• James W. Coffron, Z80 Anwendungen, SYBEX-Verlag GmBH, D¨ usseldorf 1985

6 6.1

Anh¨ ange Quellcode Adressdecoder

module az1 declarations cs,memrq,rd,a15,ce,pioce,a0 pin 19,2,3,4,18,17,5;

equations !cs = !memrq & !rd & !a15; !ce = !memrq & a15; !pioce = a0;

test_vectors ([memrq, rd,a15] -> cs) [ 0,0,0 ] -> 0

;

end az1;

6.2

Quellcode Z80 Programm

;Konstanten STACK .equ FFFFh RAM .equ 8000h ;2K RAM ROM .equ 0000h ;4K ROM PIO .equ 0001h PIO2 .equ 0003h ISRPIO .equ 0200h ;#################################################################### .org 0000h ;PC auf Null IM LD LD LD LD

2 ; Interrupt Modus 2 A, 03h ; Highteil des Interruptvektors I, A SP, (STACK) ;Lade Stackpointer A,03h ; Sperren Interrupt Mode 3 Seite 8

6

¨ ANHANGE

DI ; Sperren OUT (PIO2),A ; Unsere PIO sperren LD a,0CFh out (PIO2),a ; Bitbetrieb Port A ld a, 11110000B out (PIO2),a ; Maske was Ein/ausgabe ist LD A, 02H OUT (PIO2),a ; Interrupt-Vektor 02 LD A,10110111b ; INT, OR,High, Maske Folgt,... OUT (PIO2),a LD A,00111111b ; Bit 0 (Rechter Taster),1 sind nicht maskiert Out (PIO2),a EI ; Freigeben des Interrupts ld d,01h ; Maske fr PIO eingabe ld b,1 ; init fr ausgabe ;#################################################################### main: ld a,a jp main ;#################################################################### .org 0302h ;Intertupt-Vektor-Tabelle .word ISRPIO ;#################################################################### .org ISRPIO ;Interrupt-Service-Routine DI in a,(PIO) ;wert aus der pio lesen RLA ;eingelesenen wert von ausgabebits bereinigen jp C, AndererTaster rrc b jp M ,rechts1 jp ausgabe ; Wert an PIO schreiben ;#################################################################### AndererTaster: rlc b ;links shift ld a,b sub 16 ;prfen ob zu viel geschiftet wurde jp z, links1 jp ausgabe ;#################################################################### links1: ld b,1 jp ausgabe ;#################################################################### rechts1: Seite 9

6

¨ ANHANGE

ld b,8 jp ausgabe ;#################################################################### ausgabe: ld a,b out (PIO),a ;aktuelles a ausgeben EI RETI ;#################################################################### .END ...

Seite 10