^

Die asynchrone Datenübertragung der seriellen Schnittstelle

 

    Eine Kurzzusammenstellung von W.Hennig 04.07.1997.  Es wird keine Gewähr für die Richtigkeit übernommen.
    Ich habe mir erlaubt, diesen DOS-Text, der sich den Programmen comx.com und com_test.com in einem zip-Archiv befand, nach HTML zu konvertieren. Ich habe lediglich ein Inhaltsverzeichnis ergänzt und minimale Anpassungen vorgenommen. Falls seitens des Autors Einwände gegen die Veröffentlichung bestehen, werde ich die Seite sofort löschen. Das wäre allerdings sehr schade, denn es gibt kaum vergleichbares in Netz (zumindest nicht in deutscher Sprache). Frank Steinberg am 27.12.2001


INHALT:
-------
 
1.  RS 232 C Schnittstelle beim PC
 
2.  Datenübertragung mit Handshake
 
3.  Kopplung zweier Datenendgeräte mit Handshake
 
4.  Kopplung zweier Datenendgeräte mit vereinfachten Handshake
 
5.  Kopplung zweier Datenendgeräte ohne Handshake
 
6.  Asynchrone, serielle Datenübertragung
 
7.  Int 14h - BIOS Routinen für die serielle Schnittstelle
     
7.1  Funktion 0 - initialisiere SCC
     
7.2  Funktion 1 - sende Zeichen
     
7.3  Funktion 2 - lese Zeichen
     
7.4  Funktion 3 - get Status
 
8.  Direkte Programmierung des SCC
 
9.  Senden
10.  Empfang
11.  Interrupt-Gate
12.  Baud-Rate
13.  Handshake
14.  Timing
15.  Die Register des SCC
     
15.1  Baudraten-Teiler Low Byte
     
15.2  Baudraten-Teiler High Byte
     
15.3  Transmit-Holding
     
15.4  Received Data
     
15.5  Interrupt Enable
     
15.6  Interrupt Pending
     
15.7  Line Control
     
15.8  Modem Control
     
15.9  Line Status
     
15.10 Modem Status
     
15.11 Scratch
     
15.12 FIFO Control
16.  8250 SCC
17.  Signale von der/zur CPU
18.  weitere Ein-/Ausgänge
19.  Signale vom Schnittstellentreiber zum SCC
20.  Signale vom SCC zum Schnittstellentreiber
21.  Logische Pegel nach dem Einschalten des PC
22.  Weitere Hinweise

1.  RS 232 C Schnittstelle beim PC

Im PC wird eine serielle Schnittstelle nach der RS 232 C Norm verwendet. Diese Schnittstelle wurde ursprünglich für den Datenaustausch zwischen einem Datenendgerät (DTE = Data Terminal Equipment) und einem Datenübertragungsgerät (DCE = Data Communication Equipment) definiert.

Untenstehende Übersicht zeigt die Beschaltung einer RS 232 C Schnittstelle. Die RS 232 C Schnittstelle kann für synchrone oder asynchrone Übertragungen verwendet werden. Definiert ist auch ein Rückkanal.

+--------+                 +-----+                                 +-----+
|       2|------ TxD ----->|     |                                 |     |
|      15|<----- TxC ------|     |                                 |     |
|      24|------ TxC ----->|     |                                 |     |
|       4|------ RTS ----->|     |                                 |     |
|       5|<----- CTS ------|     |                                 |     |
|        |                 |     |                                 |     |
|       3|<----- RxD ------|     |-------------------------------->|     |
|  DTE 17|<----- RxC ------| DCE |     Line (Telefonleitung)       | DCE |
|       8|<----- DCD ------|     |<--------------------------------|     |
|      22|<------ RI ------|     |                                 |     |
|        |                 |     |                                 |     |
|      20|------ DTR ----->|     |                                 |     |
|        |------ BUSY ---->|     |                                 |     |
|       6|<----- DSR ------|     |                                 |     |
|       7|------ GND ------|     |                                 |     |
|       1|---- CHASSIS ----|     |                                 |     |
|       9|---- + 12V       +-----+                                 +-----+
|      10|---- - 12V       (Modem)                                 (remote
+--------+                                                          Modem)
+--------+                 +-----+                                 +-----+
|      14|----- 2.TxD ---->|     |         Rückkanal               |     |
|      19|----- 2.RTS ---->|     |                                 |     |
|      13|<---- 2.CTS -----|     |********************************>|     |
|  DTE   |                 | DCE |     Line (Telefonleitung)       | DCE |
|      16|<---- 2.RxD -----|     |<********************************|     |
|      12|<---- 2.DCD -----|     |                                 |     |
+--------+                 +-----+                                 +-----+
(Computer)

Bei den im PC üblicherweise eingesetzten Schnittstellenkarten entfallen die oben mit Sternen gezeichneten Signale. Die PC-Schnittstelle kann somit nur asynchron übertragen.

Die Signale auf der Schnittstelle haben keine TTL-Pegel. Es werden spezielle RS 232 Treiber und Empfänger verwendet. Eine logische 1 entspricht einer Spannung von -3V bis -24V. Eine logische 0 wird repräsentiert durch eine Spannung von +3V bis +24V. Im PC wird +/- 12V verwendet.

Mit RS 232 kompatiblen Treibern können bei 19200 Baud ca. 15 m überbrückt werden. Für größere Entfernungen kann die Baud-Rate verringert werden. Für weite Entfernungen werden Modems verwendet. Modems wandeln die logischen Pegel in Frequenzen um, die dann über eine Telefonleitung übertragen werden.

Leitungen für den Sendetakt TxC und den Empfangstakt RxC werden nur für eine synchrone Übertragung benötigt. Es gibt durchaus Modems mit synchroner RS 232 C Schnittstelle. Zur Ansteuerung solcher Modems gibt es auch  spezielle PC-Einsteckkarten. Bei einer synchronen Übertragung wird der Schiebetakt immer vom sendenden Teilnehmer erzeugt und synchron mit den Daten gesendet. Da im Modem ohnehin ein Baud-Rate Generator integriert ist, übernimmt das Modem oft auch die Erzeugung von TxC.

Bei den üblichen COMx-Ports im PC wird nur eine RS 232 C Schnittstelle  mit asynchronem Übertragungsprotokoll und ohne Rückkanal verwendet. Üblich sind 25 polige oder 9 polige SUB-D 9 Stecker (jeweils Stifte am PC).

Anmerkung: Früher waren am PC-XT durchweg 25polige SUB-D Stecker (Stifte) und am PC-AT 9polige SUB-D Buchsen üblich.

+------------+                          +----------+
|           2|------> TxD               |         3|------> TxD
|           4|------> RTS               |         7|------> RTS
|           5|<------ CTS               |         8|<------ CTS
|            |                          |          |
|   SUB-D   3|<------ RxD               |  SUB-D  2|<------ RxD
|    25     8|<------ DCD               |    9    1|<------ DCD
| Stecker  22|<------ RI                | Stecker 9|<------ RI
|            |                          |          |
|          20|------> DTR               |         4|------> DTR
|           6|<------ DSR               |         6|<------ DSR
|           7|------- GND               |         5|------- GND
|           1|------- CHASSIS           +----------+
|           9|------- +12V                 PC-AT
|          10|------- -12V
+------------+
    PC-XT

Den einzelnen Signalen wird bei der            GND       Masseleitung
Kopplung mit einem Datenübertragungs-          CHASSIS   Abschirmung
gerät folgende Bedeutung zugeordnet:           +12V      Testspannungen
                                               -12V      (oft nicht vorhanden)
TxD       Sende-Daten vom PC zu Modem
RxD       Empfangs-Daten von Modem zu PC
DTR       PC signalisiert dem Modem, daß er betriebsbereit ist
DSR       Modem signalisiert dem PC, daß es betriebsbereit ist
RTS       PC zeigt dem Modem an, daß er senden möchte
CTS       Modem signalisiert dem PC, daß er senden darf
DCD       Modem signalisiert dem PC mit, daß Daten empfangen werden
RI        Klingelzeichen von Gegenstation

Zurück zum Inhalt

2. Datenübertragung mit Handshake

Die serielle Schnittstelle wird zunehmend zur Kopplung zwischen PC und Peripheriegeräten oder einem anderen PC verwendet. Meist wird auf einen Handshake verzichtet, oft wird ein vereinfachter oder abgewandelter Handshake verwendet.

Problemstellung: Der Handshake soll sicherstellen, daß ein Teilnehmer erst sendet, wenn der andere Teilnehmer bereit ist zum Empfang.

Ideal:  Die Hardware des Empfängers gibt ein Signal aus "bereit zum Empfang"
        Dieses wird weggenommen, sobald ein Zeichen eingelesen wurde, und
        erst wieder freigegeben, wenn das Zeichen vom PC aus dem RxD-Buffer
        abgeholt wurde. Dieses Signal geht auf CTS der anderen Seite. CTS
        unterbindet auf hardwareebene das Senden.
        --> ein solches Signal gibt es jedoch bei den im PC verwendeten
            Controllern nicht. CTS wirkt nicht direkt auf die Hardware.

Real:   Die Steuersignale müssen vom PC per Software gesetzt werden. Wurde ein
        Zeichen empfangen muß das Zeichen ausgelesen werden, bevor das nächste
        Zeichen kommt. Um "bereit zum Empfang" nach dem Empfang eines Zei-
        chens wegzuschalten muß erst der Empfangs-Interrupt betreten werden.
        Das Senden des nächsten Zeichens darf nicht schneller erfolgen als
        beim PC der Empfangs-Interrupt längstens gesperrt ist. Bei einem PC
        ohne seriellen Controller mit FIFO ist deßhalb übe 38 kBaud Schluß.

Dennoch gibt es verschiedene Anwendungen, in denen die Steuersignale der seriellen Schnittstelle verwendet werden. Zum einem zur Kopplung mit einem Modem. Hier besitzen die Steuersignale die in der Norm beschriebenen Eigenschaften.

Zurück zum Inhalt

3. Kopplung zweier Datenendgeräte mit Handshake

+--------+            +--------+    DTR und DSR besitzen hier eine andere
|     TxD|----------->|RxD     |    Funktion als in der Norm festgelegt.
|     RxD|<-----------|TxD     |
|        |            |        |    RTS fungiert als Anforderung zum Sen-
|     RTS|----------->|DCD     |    den. Der andere Teilnehmer empfängt
|     CTS|<---+-------|DTR     |    dies an seinem DCD Eingang als Meldung,
|     DSR|<---+       |        |    daß Daten empfangen werden sollen.
|        |            |        |
|     DCD|<-----------|RTS     |    Wenn er zum Empfang bereit ist, setzt
|     DTR|-------+--->|CTS     |    er sein DTR. Der erste Teilnehmer er-
|        |       +--->|DSR     |    hält dadurch die Sendeerlaubnis an CTS
+--------+            +--------+    und DSR.

DTR, DSR und DCD haben hier nicht die in der Norm festgelegte Funktion.

!!!
Die BIOS-Routinen des Int 14h unterstützen die Übertragung zu einem Modem. Zum Senden wird RTS gesetzt und CTS überprüft. Die BIOS-Funktionen können bei dieser Beschaltung verwendet werden.

Zurück zum Inhalt

4. Kopplung zweier Datenendgeräte mit vereinfachtem Handshake

Unter  Abwandlung der Signaldefinitionen der RS 232 C Norm kann eine Datenübertragung zwischen zwei Endgeräten mit vereinfachtem Handshake erfolgen.

+--------+            +--------+           +--------+            +--------+
|     TxD|----------->|RxD     |           |     TxD|----------->|RxD     |
|     RxD|<-----------|TxD     |           |     RxD|<-----------|TxD     |
|        |            |        |           |        |            |        |
|     DTR|----------->|DSR     |           |     DTR|--+      +->|DSR     |
|     DSR|<-----------|DTR     |           |     DSR|<-+      +--|DTR     |
|        |            |        |           |        |            |        |
|     RTS|----------->|CTS     |           |     RTS|----------->|CTS     |
|     CTS|<-----------|RTS     |           |     CTS|<-----------|RTS     |
+--------+            +--------+           +--------+            +--------+

    DSR = Betriebsbereitschaft                 DSR kurzgeschlossen
      vom anderen Gerät


!!!
Die BIOS-Routinen des Int 14h unterstützen nicht die  Übertragung mit vereinfachten Handshake.    Zur Übertragung mit vereinfachten Handshake ist eine eigene Routine zu verwenden

!!!
RTS erhält hier abweichend von der Norm die Bedeutung von "Empfänger bereit, Gegenstation darf senden".


Mit einer eigenen Definition ergibt sich folgende interessante Lösung:
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   Vereinbart wird, daß ein Teilnehmer nur senden darf, wenn sein Eingang
   CTS den gleichen Pegel hat wie sein Ausgang DTR.
   Hat ein Teilnehmer ein Zeichen in TxD geschrieben, toggelt er seinen
   Ausgang DTR. Der andere Teilnehmer empfängt das DTR auf seinen DCD. Und
   wenn er bereit zum Empfang eines Zeichens ist, setzt er seinen Ausgang
   RTS auf denselben Pegel wie DCD.
   Mit diesem Handshake ist ein überschreiben des Empfangsbuffers nicht
   möglich. Allerdings wird die Übertragung langsammer, da erst das nächste
   Zeichen gesendet werden kann, wenn das erste auf der anderen Seite ange-
   kommen ist.

Zurück zum Inhalt

5. Kopplung zweier Datenendgeräte ohne Handshake

Wird ganz auf einen Handshake verzichtet, so werden minimal nur drei Leitungen benötigt (TxD, RxD und GND). Es empfiehlt sich auch hier DTR mit DSR kurzzuschließen.

           +--------+            +--------+
           |     TxD|----------->|RxD     |
           |     RxD|<-----------|TxD     |
           |        |            |        |
           |     DTR|--+      +--|DTR     |
           |     DSR|<-+      +->|DSR     |
           |     DCD|<-+      +->|DCD     |
           |        |  |      |  |        |
           |     CTS|<-+      +->|CTS     |
           |     RTS|            |RTS     |
           +--------+            +--------+


CTS und DCD werden ebenfalls aktiv geschaltet, indem sie mit DTR verbunden werden. Dies hat seinen Grund darin,  daß die BIOS-Routine des Int 14 bevor sie ein Zeichen sendet, überprüft, ob DSR und CTS gesetzt sind, das heißt sie wartet auf die Sendeerlaubnis vom Modem. Durch den Kuzschluß von RTS mit CTS wird dies vorgetäuscht.

Da  ohne  Handshake  gesendet  wird,  muß der Anwender durch ein geeignetes Software-Handshake Protokoll den Erhalt der Daten sicherstellen.

Zurück zum Inhalt

6. Asynchrone, serielle Datenübertragung

Die einzelnen Zeichen werden seriell,  das heißt bitweise  übertragen.  Die Übertragung erfolgt assynchron. Das heißt, der vom Sender verwendete Schiebetakt wird nicht synchron mitübertragen. Im Empfänger muß der Takt aus den Daten zurückgewonnen werden. Dies geschieht mit einem Digital Phase Loocked Loop (DPLL), das mit den Flanken aus RxD synchronisiert wird.

Es wird zeichenweise übertragen.  Zwischen den Zeichen wird kein Synchronisiersignal gesendet. Bei jedem Zeichen muß das DPLL im Empfänger deshalb neu synchronisiert  werden.  Dies wird durch Start- und Stopbits sichergestellt.

In Ruhe (kein Zeichen wird gesendet) ist TxD high (entspricht TxD = -12V an der Schnittstelle).  Wird ein Zeichen übertragen, so wird zunächst als Startbit  eine 0 ausgegeben (der Empfänger erkennt nun eine Flanke und synchronisiert seinen Empfänger-Schiebetakt darauf).  Darauf folgen die Datenbits (5 bis 8 Bits,  je nach Mode). Den Datenbits kann noch ein Paritätsbit folgen (außer bei none Parity). Am Schluß werden 1,  1,5 oder 2 Stopbits gesendet. Danach kann sofort das nächste Zeichen folgen. Die Stopbits sind nötig, damit TxD vor dem nächsten Startbit eine minimale Zeit high ist, um das Startbit erkennen zu können.


     ---|---+    +---------+         +----+    +----+    +---------|-----
            |    |         |         |    |    |    |    |         |
TxD         |    |         |         |    |    |    |    |         |
            |    |         |         |    |    |    |    |         |
            +----+         +---------+    +----+    +----+         |

            |    | d0 | d1 | d2 | d3 | d4 | d5 | d6 | p  |    |    |
            |    |                                  |    |         |
            Start          7 Datenbits              Parity  2 Stop

Beispiel für Übertragung des Zeichens 'S' mit 7 Datenbits,  even Parity und 2 StopBits (an der Schnittstelle liegen bei einer logischen 1 in TxD -12V).

Das Low-Bit des Zeichens wird zuerst übertragen. Werden nur Zeichen des Standart-ASCI Codes übertragen, so genügt es, mit 7 Datenbits zu senden. Beim erweiterten ASCI Code sind 8 Datenbits nötig. 5 und 6 Datenbits werden beim PC kaum verwendet.

Zurück zum Inhalt

7. Int 14h - BIOS Routinen für die serielle Schnittstelle

Vom BIOS werden bis zu vier Schnittstellen unterstützt. Während der Initialisierung sucht das BIOS der Reihe nach bei den für serielle Schnittstellen reservierten Port-Adressen nach dem Vorhandensein einer Schnittstelle. Der ersten gefundenen seriellen Schnittstelle wird der Device-Name COM1 zugeteilt, das heißt sie wird in die Tabelle des BIOS für die Port-Adressen der seriellen Schnittstelle (40:000) an erster Stelle eingetragen. Das BIOS eines IBM-XT sucht zumeist nur nach zwei seriellen Schnittstellen. Beim XT sind ja auch nur noch zwei Interrupt-Request Eingänge frei. Aber auch im BIOS eines XT ist Platz für vier Einträge.

Folgende Adressen sind üblich:

        COM1:           3F8h...3FFh             IRQ4
        COM2:           2F8h...2FFh             IRQ3
        COM3:           3E8h...3EFh             IRQ10 (nur AT)
        COM4:           2E8h...2EFh             IRQ11 (nur AT)

Die BIOS-Funktionen des INT 14h arbeiten ohne Hardware-Interrupt  vom  SCC. Der SCC besitzt allerdings nur ein Empfangsregister, beim Empfang eines Datenbytes muß dieses deßhalb sofort ausgelesen werden, ansonsten wird es vom nächsten Zeichen überschrieben (Fehler: overrun). Ein Anwenderprogramm muß also genügend oft (abhängig von der Baudrate) den INT 14h aufrufen.

Das BIOS stellt mit dem INT 14h vier Funktionen zur Zugriff auf den SCC bereit. Ist dabei eine Schnittstelle nicht vorhanden, oder eine falsche Funktionsnummer angegeben, so wird kein spezieller Fehlercode zurückgegeben. Der Wert in AX bleibt dann unverändert.

Beim Senden und Empfang eines Zeichens,  versucht dies die BIOS-Routine nur eine bestimmte Zeit, danach kehrt die Funktion mit einem Timeout-Fehler zum aufrufenden Programm zurück. Die Timeoutzeit ist vom BIOS festgelegt. Dazu halten neuere BIOS-Versionen im RAM eine Tabelle mit den TimeOut-Werten für jede serielle Schnittstelle: (bei 40:007Ch...40:007Fh je COM-Port ein Byte). Die TimeOut-Zeit ergibt sich damit zu:

                TimeOut-Wert * 10000h * 50 Clocks.

Die TimeOut-Zeit ist vom  Prozessor-Takt  abhängig  (beim  orginal  XT  mit 4.31818 MHz beträgt die TimeOut-Zeit ca.: timeOut-Wert * 0.76 sec). Die minimale TimeOut-Zeit ergibt sich bei einem TimeOut-Wert von 1 (ein Wert von 0 entspricht 256).

Zurück zum Inhalt

7.1 Funktion 0 - initialisiere SCC

Aufruf:
   AH = 0
   DX = SchnittstellenNr:       [0 für COM1, 1 für COM2, ...]

    Bit   7   6   5   4   3   2   1   0
        +---+---+---+---+---+---+---+---+
   AL = | b | b | b | p | p | s | d | d |
        +---+---+---+---+---+---+---+---+
          |   |   |   |   |   |   0   0   ----> 5 Bits pro Zeichen
          |   |   |   |   |   |   0   1   ----> 6 Bits pro Zeichen
          |   |   |   |   |   |   1   0   ----> 7 Bits pro Zeichen
          |   |   |   |   |   |   1   1   ----> 8 Bits pro Zeichen
          |   |   |   |   |   0  -------> 1 Stopbit
          |   |   |   |   |   1  -------> 1« Stopbits bei 5 Bit/Zeichen
          |   |   |   |   |         2 Stopbits bei 6,7 oder 8 Bit/Zeichen
          |   |   |   x   0  -----> none Parity
          |   |   |   0   1  -----> odd Parity (ungerade)
          |   |   |   1   1  -----> even Parity (gerade)
          0   0   0  ------->  110 Baud
          0   0   1  ------->  150 Baud
          0   1   0  ------->  300 Baud
          0   1   1  ------->  600 Baud
          1   0   0  -------> 1200 Baud
          1   0   1  -------> 2400 Baud
          1   1   0  -------> 4800 Baud
          1   1   1  -------> 9600 Baud

Rückgabe:
   AX = Statusbyte  (siehe Funktion 3)

Das BIOS unterstützt nur Baud-Raten bis 9600 Baud.  Dies liegt  daran,  daß ältere XT's bei höheren Übertragungsraten Schwierigkeiten hatten,  über den MSDOS Interrupt 21h (Funktion 03) noch schnell genug empfangene Zeichen auszulesen.

Zurück zum Inhalt

7.2 Funktion 1 - sende Zeichen

Die Funktion setzt zuerst DTR und RTS, danach prüft sie DSR und CTS ab. Nur wenn beide gesetzt sind,  wird das Zeichen gesendet (erfüllt den Handshake für ein Modem nach der Norm).

Aufruf:
   AH = 1
   AL = ASCI Code des zu sendenden Zeichens
   DX = SchnittstellenNr:    [0 für COM1, 1 für COM2, ...]

Rückgabe:
   AL = ASCI Code des Zeichens

    Bit   7   6   5   4   3   2   1   0
        +---+---+---+---+---+---+---+---+
   AH = | t | 0 | 0 | x | x | x | x | x |
        +---+---+---+---+---+---+---+---+
          0  ---> Zeichen wurde gesendet
          1  ---> Time-Out Fehler, Zeichen nicht gesendet da entweder CTS
                  oder DSR nicht gesetzt (Handshake) oder Transmit-Holding
                  Register noch voll war

Zurück zum Inhalt

7.3 Funktion 2 - lese Zeichen

Die Funktion setzt zuerst DTR und prüft dann, ob DSR gesetzt ist. Nur dann wird versucht ein Zeichen zu empfangen.

Aufruf:
   AH = 2
   DX = SchnittstellenNr:    [0 für COM1, 1 für COM2, ...]

Rückgabe:
   AL = ASCI Code des empfangenen Zeichens (wenn vorhanden - siehe AH)

    Bit   7   6   5    4    3    2    1    0
        +---+---+---+----+----+----+----+----+
   AH = | T | 0 | 0 | BE | FE | PE | OE | DR |
        +---+---+---+----+----+----+----+----+
          0   0   0   ?    ?    ?    ?    1  ---> empfangenes Zeichen in AL
          1   0   0   x    x    x    x    x  ---> timeOut - kein Zeichen
                                                  oder DSR nicht gesetzt

Ist  ein Zeichen empfangen worden ("T"=0 so geben die anderen Bits Auskunft über das empfangene Zeichen: "BE"  (breakError),  "FR"  (frameError),  "PE" (parityError), "OE" (overrunError). Ein Zeichen ist nur gültig, wenn keines dieser Fehlerbits gesetzt ist.  Ist das Overrun-Bit gesetzt,  so ist dieses Zeichen zwar gültig, jedoch wurde das Zeichen davor überschrieben.

Zurück zum Inhalt

7.4 Funktion 3 - get Status

Aufruf:
   AH = 3
   DX = SchnittstellenNr:     [0 für COM1, 1 für COM2, ...]

Rückgabe:

    Bit   7    6     5     4    3    2    1    0
        +---+-----+-----+----+----+----+----+----+
   AH = | 0 | THE | TSE | BE | FE | PE | OE | DR |    Line Status
        +---+-----+-----+----+----+----+----+----+
               |     |    |    |    |    |    +--- 1,dann Zeichen empfangen
               |     |    |    |    |    +---- 1, dann Overrun-Error
               |     |    |    |    +---- 1, dann Parity-Error
               |     |    |    +---- 1, dann Frame-Error
               |     |    +---- 1, dann Break-Error
               |     +---- 1, dann Transmit-Shifting Register leer
               +----- 1, dann Transmit-Holding Register leer

    Bit    7     6    5     4      3      2      1      0
        +-----+----+-----+-----+------+------+------+------+
   AH = | DCD | RI | DSR | CTS | dDCD | teRI | dDSR | dCTS |   Modem Status
        +-----+----+-----+-----+------+------+------+------+

Das Modem Status Register gibt den Zustand der Handshake-Leitungen wieder. DCD, RI,  DSR und CTS zeigen an, ob die jeweilige Leitung aktiv ist. dDCD, dDSR und dCTS zeigen an, ob sich der logische Zustand der jeweiligen Leitung seit dem letzten Auslesen des Modem Status geändert hat. teRI zeigt an, ob seit dem letzten Auslesen des Modem-Status  eine  positive  Flanke am Pin /RI auftrat (d.h. Klingelzeichen war da, und ist gerade zu Ende).

Achtung: die Funktionen "sende Zeichen" und "lese Zeichen" lesen  auch  den Modul  Status,  so  daß bei einem folgenden Lesen des Status dDCD,teRI,dDSR und dCTS = 0 sind.

Zurück zum Inhalt

8. Direkte Programmierung des SCC

Der INT 14h unterstützt mit seinen Funktionen nicht alle Möglichkeiten der seriellen  Schnittstelle.  Dies läßt sich nur durch eine direkte Register-Programmierung des SCC (seriell Communication Controller) erreichen.

Der SCC im PC ist ein UART (Universal Asynchron Receive Transmit) des  Typs NS 8250 von NSC (National Semiconductor Corporation).  Ein IBM-AT verwendet meist einen NS 16450. Dieser Typ ist abwärtskompatibel zum NS 8250. Neuerdings kommt der Typ NS 16550 zum Einsatz. Er ist wiederum abwärtskompatibel, besitzt aber Receive- und Transmit-FIFO-Register für je 16 Byte.

Das folgenden Bild zeigt eine Übersicht der wichtigsten Anschlüsse und Register des 8250. Anschlüsse wie Takteingänge sind nicht eingezeichnet. Alle Anschlüsse führen TTL-Pegel.

                              8250 SCC
             +---+------------------+-------------------------+
/sccCS ----->|<->|(3F9) Teiler High |                         |
    A0 ----->|   +------------------´ ---> Baud Rate Clock    |
    A1 ----->|<->|(3F8) Teiler Low  |                         |
    A2 ----->|   +------------------+----+   +----------------+
 /IOWR ----->|-->|(3F8) Transmit Holding |-->| Transmit Shift |-----> TxD
 /IORD ----->|   +-----------------------´   +----------------+
             |<--|(3F8) Received Data    |<--| Receive Shift  |<----- RxD
             |   +-----------------------´   +----------------+
    D0 <---->|<->|(3F9) Interrupt Enable |                    |
    D1 <---->|   +-----------------------++                   |
    D2 <---->|<--|(3FA) Interrupt Pending |                   |
    D3 <---->|   +-------------------+----+                   |
    D4 <---->|<->|(3FB) Line Control |                  +-----|-----> /OUT2
    D5 <---->|   +-------------------++                 +-----|-----> /OUT1
    D6 <---->|<->|(3FC) Modem Control |-----------------+-----|-----> /DTR
    D7 <---->|   +------------------+-+                 +-----|-----> /RTS
             |<--|(3FD) Line Status |                         |
             |   +------------------++                     +--|<----- /CTS
             |<--|(3FE) Modem Status |<--------------------+--|<----- /DSR
 IntRQ <-----|   +-------------------+---+                 +--|<----- /RI
             |<->|(3FF) Scratch Register |                 +--|<----- /DCD
             +---+-----------------------+--------------------+

Die  Signale links werden von der CPU zur Kommunikation mit dem SCC verwendet, und die Signale rechts werden auf die serielle Schnittstelle geschaltet. Dies erfolgt über spezielle RS 232 C - Treiber.  Eine logische 1 wird dabei durch eine Spannung von -15V..-3V repräsentiert,  und eine logische 0 durch +3V..+12V.  Die Signale an der Schnittstelle sind so invertiert gegen den Ausgängen des SCC. Im Ruhezustand sind alle Ausgäng zur Schnittstelle inaktiv, das heißt high.

Zurück zum Inhalt

9. Senden

Schreibt die CPU ein Zeichen in das Transmit-Holding Register, so übernimmt der SCC das Zeichen in das Transmit-Shift Register (sobald dieses leer ist) und beginnt mit der Übertragung an TxD. Das Transmit-Holding Register kann nun schon wieder von der CPU mit dem nächsten Zeichen geladen werden, während der SCC noch mit Senden beschäftigt ist.

Zurück zum Inhalt

10. Empfang

Empfängt  der  SCC  an  RxD  Daten,  so  überträgt er diese zunächst in das Receive-Shift Register.  Wenn dieses voll ist, wird das Zeichen in das Received-Data Register übertragen.  Der Übertrag in das Received-Data Register erfolgt immer ohne Rücksicht darauf,  ob sich darin noch das vorhergehende (eventuell noch nicht von der CPU gelesene) Zeichen befindet.

Zurück zum Inhalt

11. Interrupt-Gate

Im  PC  sind /OUT1 und /OUT2 nicht mit dem Schnittstellenstecker verbunden. /OUT2 wird jedoch als Gate für IntRQ verwendet.

          +-------+                Ohne gesetztem /OUT2 (nach Reset) liegt
 IntRQ ---|       |                der IRQ-Eingang des Interrupt-Ctrl. auf
          |  OR   |--- IRQ         +5V (=aktiv). Da die Maske in Int-Ctrl.
 /OUT2 ---|       |                nicht gesetzt ist, passiert nichts.
          +-------+                Wird vergessen /OUT2 zu setzen, so kommt
                                   nach dem Setzen der Maske ein Interrupt.
                                   Da der Int-Ctrl. flankengetriggert ist,
                                   geschieht dann aber gar nichts mehr.

Zurück zum Inhalt

12. Baud-Rate

Der SCC verfügt über einen eigenen Baudraten Generator, der den Schiebetakt für die serielle Übertragung erzeugt. Der Schiebetakt wird erzeugt über einen Teiler (Zähler mit Vorladewert von 1 bis 65536) und einen 16 stelligen Zähler für Transmit und ein 16 stelliges DPLL für Receive:

            +---------------+                   Zur Rückgewinnung des Em-
            |programierbarer|                   pfangs-Schiebetaktes wird
SCC-CLK --->|     Teiler    |                   ein Digital Phase Locked
1,8432 MHz  | 1 ... 65536   |                   Loop benötigt. Dabei wird
            +------+--------+                   ein 16 stelliger Zähler
                   |                            mit den empfangenen Flan-
                   |    +------+                ken synchronisiert.
                   +--->| ö 16 |---> TxCLK
                   |    +------+                Die maximale Baudrate ist
                   |                            damit 1,8432 MHz ö 1 ö 16
                   |    +------+                = 115 200 Baud.
                   +--->| ö 16 |---> RxCLK
  Flanke in RxD ------->| DPLL |
                        +------+

Zurück zum Inhalt

13. Handshake

/RTS,  /CTS,  /DTR,  /DSR /CTS und /RI werden im PC als Handshakeleitungen verwendet. Die Handshake-Leitungen  haben keinen Einfluß auf TxD und RxD. Sie beeinflussen lediglich das Modem-Status Register und können einen Interrupt auslösen. Ein Handshake muß durch eine geeignete Anwender-Software erfüllt werden, wobei die Software den Zustand der Leitungen überprüft.

Zurück zum Inhalt

14. Timing

Bei 115 000 Baud muß das Receive-Register mindestens alle 87 µs ausgelesen werden. Langsammere Rechner hatten schon über 9600 Baud Schwierigkeiten dies unter Verwendung des MSDOS Systemaufrufs INT 21h Funktion 03 sicherzustellen (das ist auch der Grund, warum nur Baud-Raten bis 9600 Baud von DOS unterstützt werden). Der Betrieb mit hohen Baudraten läßt sich nur unter Verwendung des BIOS INT 14h oder über direkte Registerprogrammierung bewerkstelligen.

Im PC-XT wird der NS 8250 und im PC-AT meist der schnellere  Typ  NS  16450 oder NS 16550 verwendet. Beim 8250 darf nur alle 755 ns ein Zugriff erfolgen, der schnellere Typ 16450 erlaubt 360 ns. Bei 8086 kompatiblen CPU's dauert ein OUT-Befehl 11 CLOCKs. Die Dauer eines CLOCK hängt vom CPU-Takt ab: 200 ns bei 5 MHz und 25 ns bei 40 MHz. Probleme kann es nur bei Befehlsfolgen wie die untenstehende und schnellen CPU's geben:

              CLOCKs/Zeit      5 MHz 8088    40 MHz 80386    150 MHz 80586
   IN AL, DX                   12/2400 ns      13/325 ns       14/ 93 ns
   NOP                               -              -           3/ 20 ns
   AND AL, 1                   13/2600 ns       6/150 ns        2/ 13 ns
   OUT DX, AL                  14/2800 ns      10/250 ns       16/106 ns

Beim 8088 dürfte es selbst mit dem 8250 keine Schwierigkeiten geben. Auf den schnelleren 386 wird ohnehin der schnellere 16450 verwendet. Lediglich bei sehr schnellen 486 muß geprüft werden, ob NOP's einzusetzen sind.

Zurück zum Inhalt

15. Die Register des SCC

Die IO-Adressen werden bis auf die Adressen A0...A2 decodiert und den  Chip Select  Eingang  des  SCC zugeführt.  Der SCC wird somit aktiv für folgende IO-Adressen:

        3F8h...3FFh          bei der ersten seriellen Schnittstelle
        2F8h...2FFh          bei der zweiten seriellen Schnittstelle
        3E8h...3EFh          bei der dritten seriellen Schnittstelle
        2E8h...2EFh          bei der vierten seriellen Schnittstelle

Die einzelnen Register des SCC lassen sich über A0...A2 auswählen. Als Beispiel wird im folgenden immer die Adresse für die erste serielle Schnittstelle angegeben.

Zurück zum Inhalt

15.1 Baudraten-Teiler Low Byte    3F8h (Offset 0) / DLAB=1   READ/WRITE
15.2 Baudraten-Teiler High Byte   3F9h (Offset 1) / DLAB=1   READ/WRITE

Um auf das Teiler-Register zuzugreifen muß zuvor im "Line-Control" Register das Bit 7 (DLAB = Divisor Latch Access Bit) auf 1 gesetzt werden. Das Teiler-Register kann mit neuen Werten beschrieben oder zurückgelesen werden. Beispiel für Teiler-Werte:
                                                     1 --> 115200 Baud
       2 --> 57600 Baud       3 --> 38400 Baud       6 -->  19200 Baud
      12 -->  9600 Baud      24 -->  4800 Baud      48 -->   2400 Baud
      96 -->  1200 Baud     192 -->   600 Baud     384 -->    300 Baud
     768 -->   150 Baud    1047 -->   110 Baud    1536 -->     75 Baud

Zurück zum Inhalt

15.3 Transmit-Holding   3F8h (Offset 0) / DLAB=0   WRITE

Dieses Register kann nur beschrieben werden (Lesezugriff betrifft Received-Data Register). Das Bit 7 im "Line-Control" Register (DLAB) muß zuvor auf 0 gesetzt werden.  Der Anwender sollte dieses Bit immer defaultmäßig auf 0 halten, und nur zum Zugriff auf das "Teiler" Register auf 1 setzen, anschließend aber wieder zurücksetzen.

Ein  neues Zeichen sollte erst dann in das Transmitter-Holding Register geschrieben werden, wenn das Bit 5 (THE = Transmit Holding Empty) im "Line-Status" Register auf 1 ist. Beim Schreiben in Transmit-Holding wird THE gelöscht. THE wird vom SCC wieder gesetzt, wenn das Zeichen aus dem Transmit-Holding ins Transmit-Shift Register übertragen wurde.

Zurück zum Inhalt

15.4 Received Data   3F8h (Offset 0) / DLAB=0   READ

Dieses Register kann nur gelesen werden (Schreibzugriff betrifft Transmit-Holding Register). Das Bit 7 im "Line-Control" Register (DLAB) muß zuvor auf 0 gesetzt werden. Der Anwender sollte dieses Bit immer defaultmäßig auf 0 halten, und nur zum Zugriff auf das "Teiler" Register auf 1 setzen, anschließend aber wieder zurücksetzen.

Received-Data muß ausgelesen werden, bevor das nächste Zeichen empfangen wird. Es ist dann mit einem empfangenen Zeichen geladen, wenn das Bit 0 (DR = Data Received) in "Line-Status" Register auf 1 ist. Ob das gelesenen Zeichen fehlerhaft ist, kann über die anderen Bits im "Line-Status" Register überprüft werden. DR wird beim Lesen von Received-Data gelöscht.

Zurück zum Inhalt

15.5 Interrupt Enable   3F9h (Offset 1) / DLAB=0   READ/WRITE

Der SCC generiert einen Interrupt an die CPU, wenn eines der folgenden Bits im Interrupt Enable Register gesetzt ist:

    Bit   7   6   5   4    3      2      1     0
        +---+---+---+---+-----+------+------+-----+
        | x | x | x | x | Mod | RErr | THEi | DRi |
        +---+---+---+---+-----+------+------+-----+
                           |     |      |      +---- Data Received
                           |     |      +----- Transmitter-Holding Empty
                           |     +----- Receiver Error
                           +---- Modul-Status Changed

Ein "Data Received" Interrupt wird erzeugt,  wenn im "Line-Status" Register DR = 1 ist.

Ein "Transmitter-Holding Empty" Interrupt wird erzeugt,  wenn THE im "Line-Status" Register von 0 auf 1 wechselt.  Er wird auch generiert,  wenn  THEi enabled wird und zu diesem Zeitpunkt THE = 1 ist.

Ein  "Receiver  Error" Interrupt wird erzeugt,  wenn eines von "BE",  "FE", "PE" und "OE" im "Line-Status" Register von 0 auf 1 wechselt.

Ein "Modul-Status Changed" Interrupt wird erzeugt,  wenn eines von  "dDCD", "dDSR", "dCTS" und "teRI" im "Modem-Status" Register gesetzt ist.

Der  Anwender  hat  neben diesem "Interrupt Enable" Register natürlich noch das entsprechende Bit in der Interrupt Maske des Interrupt-Controllers zu löschen,  und seine Interrupt-Service Routine in die Interrupt Tabelle einzutragen. Außerdem ist unbedingt /OUT2 = IntGate im "Modem Control" Register zu setzen.

Zurück zum Inhalt

15.6 Interrupt Pending   3FAh (Offset 2)   READ

Das Interrupt-Pending Register zeigt nur den höchsten pending Interrupt an, auch  wenn  noch  andere Interrupts  anstehen. Ein Interrupt muß dazu im "IntEn" Register freigegeben sein. IntPend kann nur gelesen werden.

Bit  7     6    5   4    3     2     1     0
  +-----+-----+---+---+-----+-----+-----+-----+
  | FEn | FEn | x | x | FTO | iP2 | iP1 | iP0 |
  +-----+-----+---+---+-----+-----+-----+-----+
                               x     x     1  ---> kein Interrupt pending
                               1     1     0  ---> RErr pending
                               1     0     0  ---> DRi pending
                               0     1     0  ---> THEi pending
                               0     0     0  ---> Mod pending

Die Flags FEn und FTO sind nur beim 16550 belegt (beim 16450 und 8250 stehen hier Nullen). Sie haben folgende Bedeutung:

     FEn beide 1  --> FIFO ist enabled,  FEn beide 0 --> FIFO nicht aktiv
     FTO  FIFO Time-Out Interrupt

Die Interrupt-Quellen beim SCC besitzen eine Priorität in folgender Reihenfolge:

        RErr    Receiver Error
        DRi     Data received
        THEi    Transmitter-Holding Empty
        Mod     Modul-Status Changed

Ein pending Interrupt wird zurückgesetzt, wenn die CPU
   *  das "Line-Status" Register bei einem RErr Interrupt,
   *  das "Received-Data" Register bei einem DRi Interrupt oder
   *  das "Modul-Status" Register bei einem Mod Interrupt ausließt.
   *  bei einem THEi Interrupt wird der Interrupt schon dadurch zurück-
      gesetzt, daß das "Interrupt Pending" Register ausgelesen wurde, oder
      wenn das "Transmitter-Holding" Register beschrieben wurde.

Anmerkung 1:
Ist THE und es ist nichts zu senden, braucht nicht der TxD Interrupt disabled zu werden. Nach dem Auslesen des Interrupt Pending Registers liegt kein Interrupt mehr an. Es kann sogar zu Problemen führen, wenn andauernd der TxD Interrupt enabled und disabled wird.

Anmerkung 2:
Da  der  Interrupt-Controller  des PC flankengetriggert arbeitet, sollte die Interrupt Service Routine  erst wieder  verlassen  werden, wenn  kein Interrupt mehr pending ist.  Dann ist der Interrupt-Request Ausgang des SCC erst wieder low. Bei Nichtbeachten bleibt der IntRQ Ausgang high und die CPU erhält keinen Interrupt mehr vomn SCC.

Anmerkung 3:
Wird ein Zeichen empfangen und es liegt ein Receiver-Fehler vor, kommt nach dem RecvErr Interrupt immer auch noch ein Receiv Interrupt. Also bei einem RecvErr Interrupt ist bei einem gesetzten Bit "Zeichen empfangen" mmer auch gleich das Receive Register auszulesen.

Anmerkung 4:
Es gibt Contoller, die folgenden Fehler aufweisen: Wurden der niederprioreste Interrupt abgearbeitet (lag an) und danach wird noch einmal die Schleife angesprungen, die das Interrupt Pending Register ließt, so werden später auftretende IRQ sporadisch nicht mehr pending.

Zurück zum Inhalt

15.7 Line Control   3FBh (Offset 3)   READ/WRITE

Mit dem "Line-Control" Register wird die Betriebsart festgelegt. Daneben enthält es noch Steuerbits (DLAB, Brk).

 Bit     7     6     5    4    3   2    1    0
     +------+-----+----+----+----+---+----+----+
     | DLAB | Brk | P2 | P1 | P0 | S | D1 | D0 |
     +------+-----+----+----+----+---+----+----+
        |      |    |    |    |    |   0    0   ----> 5 Bits pro Zeichen
        |      |    |    |    |    |   0    1   ----> 6 Bits pro Zeichen
        |      |    |    |    |    |   1    0   ----> 7 Bits pro Zeichen
        |      |    |    |    |    |   1    1   ----> 8 Bits pro Zeichen
        |      |    |    |    |    0  -----> 1 Stopbit
        |      |    |    |    |    1  -----> 1,5 Stopbits bei 5 Bit/Zeichen
        |      |    |    |    |                2 Stopbits bei 6,7,8 Bit/Zeich.
        |      |    x    x    0  -----> none Parity
        |      |    0    0    1  -----> odd Parity (ungerade)
        |      |    0    1    1  -----> even Parity (gerade)
        |      |    1    0    1  -----> stick Parity --> Paritätsbit = 1
        |      |    1    1    1  -----> stick Parity --> Paritätsbit = 0
        |      +---- Break: wenn 1, dann wird TxD = 0 gesetzt, die Über-
        |            tragung wird unterbrochen.
        +----- Divisor Latch Accsess Bit: wenn 1, dann Zugriff über 3F8h
               und 3F9h nicht auf Transmitter-Holding, Received-Data und
               Interrupt-Enable Register sondern auf Teiler Register

Bei none Parität enthält der Frame kein Paritätsbit. Beim Empfänger erfolgt keine Paritäts-Prüfung.

Bei stick Parity wird als Paritätsbit eine 0 bzw. eine 1 eingesetzt. Im Empfänger wird die Richtigkeit dieses Bits überprüft.

Bei odd Parity wird das Paritätsbit so gesetzt, daß die Summe über die Datenbits und das Paritätsbit ungerade ist.

Bei even Parity wird das Paritätsbit so gesetzt, daß die Summe über die Datenbits und das Paritätsbit gerade ist.

Stimmen die Baudrate (siehe Teiler Register), Parity, und Bits/Zeichen im Sender und Empfänger nicht überein, so gibt es Fehler beim Empfang: siehe "Line Status" Register.

DLAB (Divisor Latch Access Bit) sollte immer auf 0  gehalten  werden,  wenn auf das Receive Register,  das Transmit-Holding Register und das Interrupt-Enable Register zugegriffen werden soll.  Nur für den Zugriff auf das Divisor Latch (Teiler) ist DLAB=1 zu setzen, dann wieder zurück.

Zurück zum Inhalt

15.8 Modem Control   3FCh (Offset 4)   READ/WRITE

Hiermit können bestimmte Ausgangsleitungen gesetzt werden:

Bit 7   6   5    4       3      2     1     0
  +---+---+---+------+------+------+-----+-----+
  | x | x | x | LOOP | OUT2 | OUT1 | RTS | DTR |
  +---+---+---+------+------+------+-----+-----+
                 |       |            |    +- DTR-Leitung der Schnittstelle
                 |       |            +---- RTS-Leitung der Schnittstelle
                 |       +-------- !!! Interrupt Gate im PC !!!
                 +----- wenn 1, dann Loop Mode

DTR und RTS sind ohne Auswirkung auf TxD und RxD.  Hiermit können lediglich durch die CPU die entsprechenden Bits auf der Schnittstelle gesetzt werden.

Der Ausgang OUT1 ist im PC ohne Hardwarefunktion (not connected).

Der Ausgang OUT2 ist im PC über ein OR-Gatter mit IntRQ verknüpft. Ist OUT2 = 0 gesetzt (elektischer Ausgang ist dann /OUT2 = 1),  so ist der Interrupt gesperrt. Die Interruptleitung zum PC ist dabei aber konstant high. Das heißt eigentlich,  daß ein Interrupt anliegt (auch wenn im IntPending Register 0001 steht, also keiner pending ist). Wird die Maske im Interrupt-Controller enabled, so ergibt dies einen Einsprung in die Interrupt-Routine. Aus diesem Grund sollten OUT2 = 1 und die Interrupt-Vektoren gesetzt werden, bevor die Maske freigegeben wird.

Im Loop Mode werden durch den SCC die Eingänge RxD,  /DCD,  /DSR,  /RI  und /CTS  abgeklemmt. Die ankommenden Signale bleiben ohne Wirkung.  Auch die Ausgangspins /DTR, /RTS, /OUT1 und /OUT2 werden abgeklemmt und die entsprechenden Ausgangspins inaktiv (high) gesetzt. Sodann werden die Eingangssignale intern mit folgenden Signalen verbunden:

        RxD   mit   TxD                    DSR   mit   DTR
        CTS   mit   RTS                    DCD   mit   OUT2
                                           RI    mit   OUT1.

LOOP Mode ist zum Testen der Übertragung durch die CPU gedacht. Ein gesendetes Zeichen wird im eigenen Received Data Register wieder empfangen. Seltsammerweise wirkt im LOOP Mode weiterhin OUT2 als Interrupt Gate.

Zurück zum Inhalt

15.9 Line Status   3FDh (Offset 5)   READ

Das Line-Status Register gibt Auskunft über den Zustand der Line-Ein- und -Ausgänge. Es darf nur gelesen werden! Der Schreibzugriff wurde vom Hersteller für interne Testzwecke reserviert.

 Bit   7    6     5     4    3    2    1    0
     +---+-----+-----+----+----+----+----+----+
     | 0 | TSE | THE | BE | FE | PE | OE | DR |
     +---+-----+-----+----+----+----+----+----+
            |     |    |    |    |    |    +--- Zeichen empfangen
            |     |    |    |    |    +---- Overrun-Error
            |     |    |    |    +---- Parity-Error
            |     |    |    +---- Frame-Error
            |     |    +---- Break-Error (Empfang unterbrochen)
            |     +---- Transmitter-Holding Register leer
            +----- Transmitter-Shifting Register leer

Wenn ein Zeichen aus dem Receive-Shift Register in das Received-Data Register übertragen wurde, wird DR gesetzt. Zurückgesetzt wird es durch Lesen des Received-Data Registers durch die CPU.

Wenn ein Zeichen aus dem Receive-Shift Register in das Received-Data Register übertragen wurde, und das vorige Zeichen von der CPU noch nicht gelesen wurde, so wird OE gesetzt. OE zeigt an, daß ein oder mehrere Zeichen überschrieben wurden. Zurückgesetzt wird OE, nachdem das Line-Status Register ausgelesen wurde.

PE, FE und BE werden gesetzt, wenn während des Empfangs ein Fehler auftrat. Zurückgesetzt werden sie, nachdem das Line-Status Register ausgelesen wurde.

THS und TSE sind gesetzt, wenn die entsprechenden Register leer sind. Ist das THE Bit gesetzt,  so darf die CPU das nächste zu sendende Byte in das Transmitter-Holding Register schreiben. Ist TSE gesetzt, so ist die Datenübertragung an TxD beendet, TxD ist inaktiv (high = -12V an Schnittstelle).

Zurück zum Inhalt

15.10 Modem Status   3FEh (Offset 6)   READ

Das Modem-Status Register gibt Auskunft über  den  Zustand  der  Handshake-Eingänge.

 Bit    7     6    5     4      3      2      1      0
     +-----+----+-----+-----+------+------+------+------+
     | DCD | RI | DSR | CTS | dDCD | teRI | dDSR | dCTS |
     +-----+----+-----+-----+------+------+------+------+
        |    |     |     |     |      |      |      +-- delta Clear To Send
        |    |     |     |     |      |      +---- delta Data Set Ready
        |    |     |     |     |      +---- tralling Edge of Ring Indicator
        |    |     |     |     +----- delta Data Carrier Detect
        |    |     |     +----- Clear To Send
        |    |     +----- Data Set Ready
        |    +----- Ring Indicator
        +----- Data Carrier Detect

DCD, RI, DSR und CTS zeigen an, ob die jeweilige Leitung aktiv ist.

dDCD, dDSR und dCTS zeigen an, das sich der logische Zustand der jeweiligen Leitung seit dem letzten Auslesen des Modem Status geändert hat. Nach dem Auslesen des Modem-Status Registers werden sie zurückgesetzt.

teRI zeigt an, daß eine positive Flanke am Pin /RI des SCC auftrat. Das heißt RI war 1 und ist auf 0 gegangen --> das Klingelzeichen lag an und ist gerade vorrüber. teRi wird zurückgesetzt nach dem Auslesen des Modul-Status Registers.

Zurück zum Inhalt

15.11 Scratch   3FFh (Offset 7)   READ/WRITE

Das Scratch Register hat keine Funktion. Hier kann der Anwender Werte zwischenspeichern. Allerdings fehlt dieses Register bei einigen billigen Ausführungen des 8250.

Zurück zum Inhalt

15.12 FIFO Control   3FAh (Offset 2)   WRITE

Dieses  Register ist nur beim 16550 vorhanden und kann nur beschrieben werden. Der Lesezugriff betrifft das Interrupt-Pending Register. Gleichwohl stehen im Interrupt-Pending Register Intormationen über FIFO enabled/disabled.

 Bit   7   6   5   4      3       2       1      0
     +---+---+---+---+--------+-------+-------+-----+
     | T | T | x | x | pinMod | resTx | resRx | FEn |
     +---+---+---+---+--------+-------+-------+-----+
       |   |             |        |       |      +-- FIFO enable, wenn 1
       |   |             |        |       +------- reset Receive FIFO
       |   |             |        +------------ reset Transmit FIFO
       |   |             +----------- RxRdy/TxRdy pin Mode (normal = 0)
       0   0  ----- Interrupt, schon wenn 1 Byte im FIFO
       0   1  ----- Interrupt, wenn 4 Bytes im FIFO
       1   0  ----- Interrupt, wenn 8 Bytes im FIFO
       1   1  ----- Interrupt, wenn 14 Bytes im FIFO

Für Receive und Transmit gibt es im 16550 je ein FIFO mit einer Tiefe von 16 Byte. FEn muß auf 1 gesetzt werden, um den FIFO-Mode zu enablen. Ansonsten verhält sich der 16550 wie ein 8250 und 16450. Es können so 16 Zeichen empfangen werden, bevor ein Overrun auftritt.  Und es können 16 Zeichen gesendet werden, bevor Transmit-Holding Not Empty angezeigt wird.

resRx = 1 löscht das Receive FIFO.
resTx = 1 löscht das Transmit FIFO.

Für den Betrieb im Interrupt-Mode kann festgelegt werden, ob ein Interrupt schon erfolgen soll, nachdem 1, 4, 8 oder 14 Zeichen empfangen wurden. Die Interrupt-Routine wird dann nicht so oft aufgerufen. Dies spart Rechenzeit.

Bei Setzen von 4, 8 oder 14 Zeichen für die Interrupt-Auslösung wird auch bereits nach Empfang eines Zeichens und Ablauf einer internen Timeout-Zeit ein Interrupt generiert. In diesem Fall ist im Interrupt-Pending Register (3F9h) das Bit FIFO-Timeout gesetzt.

Zurück zum Inhalt

16. 8250 SCC

Ergänzend ist die Pinbelegung des 8250 SCC angegeben:

                ----------------
        D0     -| 1          40|- VCC
        D1     -| 2          39|- /RI
        D2     -| 3          38|- /DCD
        D3     -| 4          37|- /DSR             VCC = + 5V
        D4     -| 5          36|- /CTS             GND = 0V
        D5     -| 6          35|- RES
        D6     -| 7          34|- /OUT1
        D7     -| 8          33|- /DTR
        RCLK   -| 9          32|- /RTS
        RxD    -|10          31|- /OUT2
        TxD    -|11          30|- IntRQ
        CS0    -|12          29|-
        CS1    -|13          28|- A0
        /CS2   -|14          27|- A1
        TCLK   -|15          26|- A2
        CLK    -|16          25|- ALE
        CLKout -|17          24|- CSout
        /IOWR  -|18          23|- /RDout
        IOWR   -|19          22|- IORD
        GND    -|20          21|- /IORD
                ----------------

       Seriell Communication Controller
                    NS 8250
     (National Semiconductor Corporation)

Zurück zum Inhalt

17. Signale von der/zur CPU

CS0     i    Chip Select aktiv high           nur wenn CS0 und
CS1     i    Chip Select aktiv high           CS1 beide 1 und
/CS2    i    Chip Select aktiv low            CS2 0 sind, dann Chip aktiv
CSout   o    Chip aktiv                       wird im PC nicht verwendet

A0..A2  i    Adressleitungen                  zur Auswahl des SCC-Registers
ALE     i    Adress Latch Enable              wenn 0, dann A0..A2 durchver-
                                              bunden, sonst gelatched

/IOWR   i    Schreibsignal aktiv low          das nicht benutzte wird auf
IOWR    i    Schreibsignal aktiv high         einen inaktiven Pegel gelegt
/IORD   i    Lesesignal aktiv low             beim PC: IOWR auf GND und
IORD    i    Lesesignal aktiv high            IORD auf GND
/RDout  o    Daten lesen (D0..D7 = Ausgang)   wird im PC nicht verwendet

D0..D7  i/o  Datenleitungen

IntRQ   o    Interrupt Request aktiv high

i = Eingang, o = Ausgang

Zurück zum Inhalt

18. Weitere Ein-/Ausgänge

/OUT1   o    Modem-Ausgang       beim PC: keine Hardware-Funktion
/OUT2   o    Modem-Ausgang       beim PC: dient als Interrupt-Gate

CLK     i    Takteingang oder XTAL1          beim PC: 1.8432 MHz Oszillator
CLKout  o    Taktausgang oder XTAL2          alternativ auch Quarz zwischen
                                             XTAL1 und XTAL2

TCLK    o    Transmitter-Takt                beim PC: RCLK mit TCLK ver-
RCLK    i    Receiver-Takt                   bunden

Zurück zum Inhalt

19. Signale vom Schnittstellentreiber zum SCC

RxD     i    Received Data
/RI     i    Ring Indikator
/DCD    i    Data Carrier Detect
/DSR    i    Data Set Ready
/CTS    i    Clear To Send

Zurück zum Inhalt

20. Signale vom SCC zum Schnittstellentreiber

TxD     o    Transmit Data
/DTR    o    Data Terminal Ready
/RTS    o    Request To Send

Unter Berücksichtigung der invertierenden Steuerausgänge des SCC und der Schnittstellentreiber ergeben sich folgende Verhältnisse:

logischer Wert:         SCC-Ausgang:            Schnittstellen-Stecker:

TxD = high    -->       TxD  = +5 V    -->      TxD* = -12 V
DTR = high    -->       /DTR =  0 V    -->      DTR* = +12 V
RTS = high    -->       /RTS =  0 V    -->      RTS* = +12 V

RxD = high    <--       RxD  = +5 V    <--      RxD* = -12 V
DSR = low     <--       /DSR = +5 V    <--      DSR* = -12 V
DCD = low     <--       /DCD = +5 V    <--      DCD* = -12 V
CTS = low     <--       /CTS = +5 V    <--      CTS* = -12 V
RI  = low     <--       /RI  = +5 V    <--       RI* = -12 V

Zurück zum Inhalt

21. Logische Pegel nach dem Einschalten des PC

  In Ruhe ist                           TxD = 1         TxD* = -12 V
  Nach dem Einschalten sind die
  Steuerausgänge                        DTR = 0         DTR* = -12 V
                                        RTS = 0         RTS* = -12 V
  die Eingänge sind bestimmt durch die Gegenseite.
  Ein nicht gesteckten Stecker liefert nach RS232 einen nicht definierten
  Pegel, wird im PC aber als
                RxD = 1, DSR = 0, DCD = 0, CTS = 0 und RI = 0
  gelesen.


22. Weitere Hinweise

Die Ausgangstreiber können keinen allzu großen Strom treiben. Schon bei ca. 2,5 mA bricht die Spannung zusammen. Im allgemeinen sind sie jedoch so ausgelegt, daß sie einen höheren positiven Strom treiben können (bis c. 5 mA), bevor die Spannung merklich einbricht. Der Grund liegt darin, daß die Steuerleitungen DTR und RTS für die Spannungsversorgung von Mäusen verwendet werden.

Maustreiber setzen DTR und RTS auf 1. Somit stehen 2 mal ca. +10..12V für die Stromversorgung der Maus zur Verfügung. Über TxD wird bei einer Maus nicht gesendet. Es liegt also andauernd auf -10V. Diese Hilfsspannung wird zur Datenübertragung über RxD benötigt. Anmerkung: Da nur ca. 2 mA (negative Hilfsspannung) zum Umladen der Kapazitäten an RxD zur Verfügung stehen, kann nur mit einer niederen Baudrate übertragen werden. Bei Mäusen üblich ist 1200 Baud.

Zurück zum Inhalt


Zur Startseite

 

Haftungsausschluss    Datenschutzerklärung    Impressum

© Frank Steinberg