Das eBook Angewandte Mikroelektronik wurde von Hans Lohninger zur Unterstützung verschiedener Lehrveranstaltungen geschrieben. Weitere Informationen finden sie hier.


Programmierung des DART

Die beiden Kanäle des DART sind identisch und werden auch durch die gleichen Kommandos programmiert. Welcher Kanal angesprochen wird, hängt alleine vom Signal am Pin 'A/B' ab. Einzige Ausnahme stellt das Register für den Interruptvektor dar, da dieser nur für Kanal B geladen wird, aber für beide Kanäle gilt. Die folgende Beschreibung behandelt daher nur die Programmierung von Kanal B.

Zur Programmierung stehen fünf Register zum Schreiben zur Verfügung und drei Register, die gelesen werden können. Das bedeutet, dass man (bis auf das Interruptvektorregister) Register, die beschrieben werden, nicht wieder lesen kann. Zur Behandlung von speziellen Situationen (z.B. Steuerung der Handshake-Leitungen) muss man also im Programm den jeweiligen Zustand der Register mitführen.

Da für jeden Kanal nur eine Adressleitung zur Verfügung steht, ist von außen nur das Register Null erreichbar. Alle anderen Register werden angesprochen, indem man zuerst die Nummer des gewünschten Registers ins Register Null schreibt. Dadurch wird intern der Baustein vorbereitet, so dass der nächste Wert, der hineingeschrieben wird, in das spezifizierte Register gelangt. Die untenstehende Tabelle führt alle Register eines Kanals an:

Leseregister

Register

Bit

Bedeutung

RR0:

0

Empfänger enthält Zeichen

1

Interrupt wartet auf Bearbeitung (nur Kanal A)

2

Sendepuffer ist leer

3

Zustand der Leitung DCD

4

Zustand der Leitung RI

5

Zustand der Leitung CTS

6

nicht verwendet

7

Break

RR1:

0

alle Zeichen gesendet

1-3

nicht verwendet

4

Parity-Fehler

5

Empfängerüberlauf

6

Protokollfehler

7

nicht verwendet

RR2:

0-7

Interruptvektor für Z80-Interruptmodus IM2

Schreibregister

Register

Bit

Bedeutung

WR0:

0-2

Registerauswahl:

000 = Register 0

001 = Register 1

010 = Register 2

011 = Register 3

100 = Register 4

101 = Register 5

3-5

Reset/Interrupt:

000 = keine Aktion

001 = nicht verwendet

010 = Status-Interrupt rücksetzen

011 = Kanal initialisieren

100 = Interrupt bei nächstem Zeichen

101 = wartenden Sender-Interrupt rücksetzen

110 = Fehlerflags zurücksetzen

111 = Software-RETI (nur Kanal A)

6-7

nicht verwendet

WR1:

0

Externen Interrupt erlauben

1

Transmitter-Interrupt erlauben

2

Status beeinflusst Interruptvektor (nur Kanal B)

3-4

Interruptmodi:

00 = Empfänger-Interrupt abschalten

01 = Empfänger-Interrupt beim ersten Zeichen

10 = Interrupt bei jedem empfangenen Zeichen (Parity beeinflusst Interruptvektor)

11 = Interrupt bei jedem empfangenen Zeichen (Parity beeinflusst Interruptvektor nicht)

5

Wait/Ready on R/T

6

Wait/Ready-Funktion

7

Wait/Ready erlauben

WR2:

0-7

Interruptvektor für Modus IM2 (nur Kanal B)

WR3:

0

Empfänger einschalten

1-4

nicht verwendet (auf null legen)

5

Auto-Modus einschalten

6-7

Zahl der Datenbits im Empfänger:

00 = 5 Bits

01 = 6 Bits

10 = 7 Bits

11 = 8 Bits

WR4:

0

Parity einschalten

1

Parity even/odd (1=even, 0=odd)

2-3

Zahl der Stoppbits:

00 = ungültig

01 = 1 Stoppbit

10 = 1.5 Stoppbit

11 = 2 Stoppbit

4-5

nicht verwendet

6-7

Taktfrequenzfaktor:

00 = x1

01 = x16

10 = x32

11 = x64

WR5:

0

nicht verwendet

1

RTS

2

nicht verwendet

3

Sender einschalten

4

Break senden

5-6

Zahl der Datenbits im Sender

00 = 5 Bits

01 = 6 Bits

10 = 7 Bits

11 = 8 Bits

7

DTR

Da die Möglichkeiten der DART-Programmierung sehr groß sind, sollen hier nur die wichtigsten Steuercodes anhand eines Beispiels erklärt werden. Die Programmierung des DART teilt sich immer in zwei Phasen, die Initialisierung und die Einstellung von Arbeitsparametern. Bei der Initialisierung werden der Interruptmodus, der Interruptvektor, die Betriebsart des DART u.ä. festgelegt. Sie wird im Allgemeinen nur einmal während des Kaltstarts durchgeführt. Die Einstellung der Parameter wird öfter benötigt und sollte davon getrennt programmiert sein.

Initialisierung:

Eine typische Initialisierungssequenz könnte wie folgt aussehen:

;
; Register 2: Interruptvektor, niederwertiges Byte
;
            LD      A,2
            OUT     (DARTB),A   ;Register 2 anwählen
            LD      A,ILOW
            OUT     (DARTB),A   ;Interruptvektor laden
;
; Register 1:       Betriebsart und Interruptmodus.
;                   Wait ein, Ready aus, Status beeinflusst
;                   Interruptvektor, Interrupt bei jedem
;                   empfangenen Zeichen, Senderinterrupt
;                   ein.
;
            LD      A,1
            OUT     (DARTB),A   ;Register 1 anwählen
            LD      A,07CH
            OUT     (DARTB),A   ;Betriebsmodus setzen
;
; Register 3:       Empfänger einstellen
;                   Empfänger ein, 8 Datenbits,
;                   Auto-Modus aus
;
            LD      A,003H
            OUT     (DARTB),A   ;Register 3 anwählen
            LD      A,0C1H
            OUT     (DARTB),A   ;Empfänger einstellen
;
; Register 4:       Stoppbits, Parity und Takt
;                   1 Stoppbit, Parity aus, x16-Modus
;
            LD      A,004H
            OUT     (DARTB),A   ;Register 4 anwählen
            LD      A,044H
            OUT     (DARTB),A   ;Stoppbits und Parity
;
; Register 5:       Sender und Steuerleitungen einstellen
;                   DTR=1, RTS=0, Sender ein, 8 Datenbits
;
            LD      A,005H
            OUT     (DARTB),A   ;Register 5 anwählen
            LD      A,0E8H
            OUT     (DARTB),A   ;Sender einstellen

Einstellung der Parameter:

Die Einstellung der Parameter bezieht sich in erster Linie auf die Einstellung des Übertragungsprotokolls, wobei die Baudrate nur in geringem Maße durch Veränderung des Teilungsfaktors des Vorteilers (x1, x16, x32, x64) innerhalb des DART eingestellt werden kann.

Das folgende Programm zeigt für den Kanal A des DART eine Möglichkeit, das Protokoll einzustellen. Dabei wird angenommen, dass Kanal 2 des CTC den erforderlichen Takt für die Baudrate erzeugt (1.536 MHz). Als Parameter wird ein 8-Bit-Wert im Akkumulator übergeben. Die Kombination dieser acht Bits bestimmt die Einstellung der Schnittstelle (siehe Kommentar im Programm).

;===================================================
;--- setup protocol of DART-A ----------------------
;===================================================
;
;Eingang:   AKKU enthält Steuerzeichen
;Ausgang:   Protokoll von DART-A eingestellt
;
;           8,7,6 ... Baudrate:
;                       OFF OFF OFF = 150 Baud
;                       OFF OFF ON  = 300 Baud
;                       OFF ON  OFF = 600 Baud
;                       OFF ON  ON  = 1200 Baud
;                       ON  OFF OFF = 2400 Baud
;                       ON  OFF ON  = 4800 Baud
;                       ON  ON  OFF = 9600 Baud
;                       ON  ON  ON  = 19200 Baud
;           5 ..... Number of data bits:
;                       OFF = 7 data bits
;                       ON  = 8 data bits
;           4 ..... parity enable:
;                       ON  = parity bit wird erzeugt
;                       OFF = kein parity bit
;           3 ..... parity:
;                       OFF = even
;                       ON  = odd
;           2 ..... Zahl der Stoppbits
;                       ON  = 2 Stoppbits
;                       OFF = 1 Stoppbit
;           1 ..... unbenutzt
;
            .GLOBAL SETPDA
SETPDA:     PUSH    AF
            PUSH    HL
            LD      (PROTBK),A
            SRL     A           ;Baudrate
            SRL     A
            SRL     A
            SRL     A
            AND     0EH
            PUSH    AF          ;speichern für CLK-mode
            LD      HL,BAUDTB
            ADDHLA
;           LD      A,3
;           OUT     (CTC2),A    ;Timer stoppen
            LD      A,(HL)
            OUT     (CTC2),A    ;Modus laden
            INC     HL
            LD      A,(HL)
            OUT     (CTC2),A    ;Zeitkonstante laden
;
            LD      HL,PROTBK   ;Parität
            POP     AF
            CP      4           ;Baudrate <= 300 ?
            LD      A,044H      ;x16 Modus
            JR      NC,$6
            LD      A,0C4H      ;x64 Modus
$6:         BIT     2,(HL)      ;Parität even/odd
            JR      NZ,$1
            SET     1,A
$1:         BIT     3,(HL)      ;Parität aus/ein
            JR      Z,$2
            SET     0,A
$2:         BIT     1,(HL)      ;Zahl der Stoppbits
            JR      Z,$5
            SET     3,A
$5:         PUSH    AF          ;DART register laden
            LD      A,4
            OUT     (DARTAC),A
            POP     AF
            OUT     (DARTAC),A
;
            LD      A,5         ;Sender Datenbits
            OUT     (DARTAC),A
            LD      A,0AAH
            BIT     4,(HL)
            JR      Z,$3
            SET     6,A
$3:         OUT     (DARTAC),A
            LD      (DAREG5),A  ;Register 5 enthält RTS
;
            LD      A,3         ;Empfänger Datenbits
            OUT     (DARTAC),A
            LD      A,041H
            BIT     4,(HL)
            JR      Z,$4
            SET     7,A
$4:         OUT     (DARTAC),A
;
            POP     HL
            POP     AF
            RET
;
            .DATA
PROTBK: DEFB        0           ;Steuerbits
DAREG5:     DEFB    0           ;RTS-Kontrolle Reg.5
            .CODE
;
BAUDTB:     DEFB    47H,160     ; 150 BAUD
            DEFB    47H,80      ; 300 Baud
            DEFB    47H,160     ; 600 BAUD
            DEFB    47H,80      ; 1200
            DEFB    47H,40      ; 2400
            DEFB    47H,20      ; 4800
            DEFB    47H,10      ; 9600
            DEFB    47H,5       ; 19200 Baud


Last Update: 2008-05-31