Centronics-Schnittstelle
Unter Centronics-Schnittstelle versteht man eine Druckerschnittstelle des nicht mehr existierenden Druckerherstellers Centronics, der diese Schnittstelle bei seinem Drucker verwendete. Ursprünglich entstand die CENTRONICS-Schnittstelle Ende der 1960er Jahre bei der Firma Wang Laboratories, von denen sich kurz danach der Druckerhersteller CENTRONICS abspaltete.
Bis heute ist diese parallele Druckerschnittstelle bei vielen Computern und Druckern noch vorhanden, wird aber zunehmend von der USB-Schnittstelle verdrängt.
Aus der Centronics-Schnittstelle ging im Jahr 1994 der IEEE 1284 Standard für eine parallele Schnittstelle zur bidirektionalen Übertragung von Daten zwischen Computer und unterschiedlichen Peripheriegeräten (meist Drucker, aber auch Scanner und Datenlaufwerke) hervor.
Typische Steckerarten sind:
- Typ A – 25-polige D-Sub-Stecker, welche sich am Computer befindet
- Typ B – 36-polige "Centronics"-Stecker, welche sich in der Regel am Peripheriegerät findet
Da der C64/C128 keine Centronics-Schnittstelle hat, kann man sich mit einem Drucker-Userport-Kabel, angeschlossen am Userport behelfen, was aber entsprechende Unterstützung in Software zur Bedienung der Schnittstelle erforderlich macht. Alternativ gibt es auch ein Druckermodul für die serielle Schnittstelle des C64/128, z.B. von der Firma Wiesemann. In dieser Form kann die Schnittstelle auch ohne Software einfach mit den vorhandenen BASIC-Befehlen genutzt werden.
Die Signale der Centronics-Schnittstelle haben TTL-Pegel (0V für low, 5V für high in einem bestimmten Toleranzbereich) und können typischerweise maximal eine Verbindung bis zu 3,5m (je nach Kabelqualität eventuell sogar bis 5m) Länge überbrücken.
Die Datenübertragung über diese Schnittstelle läuft über ein Handshake-Verfahren, das allerdings in gewissen Details von Geräten unterschiedlich ausgelegt und umgesetzt ist, was leider auch zu typischen Kompatibilitätsproblemen führt. Der klassische Ablaufzyklus sieht (ohne genaue Zeitspezifikation) bei einer Übertragung vom Computer zu einem Gerät folgendermaßen aus:
- Das zu übertragende Byte wird auf die 8 Datenleitungen angelegt, sofern das Signal Busy nicht aktiv ist.
- Das Vorhandensein der Daten wird mit einer kurzen Aktivierung via STROBE angezeigt.
- Mit dem Aktivwerden von Busy zeigt das Gerät nun an, dass die Daten "verarbeitet" werden und vorerst keine weiteren Daten angenommen werden können.
- Durch Aktivieren von ACK meldet das Gerät, dass nun weitere Daten folgen können und Busy wird danach inaktiv.
Inhaltsverzeichnis
Pinbelegung der Stecker[Bearbeiten]
Hinweise:
- Ein Strich über dem Signalnamen bedeutet, dass das Signal Aktiv-Low ist.
Richtung:
- → bedeutet vom Computer zum Gerät
- ← bedeutet vom Gerät zum Computer
- – Signalmasse bzw. Masseleitung (0 V), ohne Datenflussrichtung
Pinbelegung 25-poliger D-Sub-Stecker (Typ A)[Bearbeiten]
Pin | Name | Richtung | Funktion |
---|---|---|---|
1 | STROBE | → | Strobe, zeigt bei fallender Flanke gültige Daten an |
2 | D0 | → | Datenbit 0 |
3 | D1 | → | Datenbit 1 |
4 | D2 | → | Datenbit 2 |
5 | D3 | → | Datenbit 3 |
6 | D4 | → | Datenbit 4 |
7 | D5 | → | Datenbit 5 |
8 | D6 | → | Datenbit 6 |
9 | D7 | → | Datenbit 7 |
10 | ACK | ← | Acknowledge, Bestätigung des Druckers über Empfang der Daten |
11 | BUSY | ← | Busy, wenn nicht aktiv, zeigt die Bereitschaft des Druckers zur Datenübernahme an |
12 | PE | ← | Paper End, Papierende |
13 | SEL | ← | Select, zeigt Druckerstatus (on- oder offline) an |
14 | AUTOFD | → | Autofeed, veranlasst nach Carriage Return (CR) einen Zeilenumbruch (LF) |
15 | ERROR | ← | Error |
16 | INIT | → | Druckerreset |
17 | SELIN | → | Select In, teilt dem Drucker mit, dass er angesprochen ist |
18 | GND | – | Signalmasse |
19 | GND | – | Signalmasse |
20 | GND | – | Signalmasse |
21 | GND | – | Signalmasse |
22 | GND | – | Signalmasse |
23 | GND | – | Signalmasse |
24 | GND | – | Signalmasse |
25 | GND | – | Signalmasse |
Pinbelegungen Peripheriegerät, 36-poliger "Centronics"-Stecker (Typ B)[Bearbeiten]
Pin | Name | Richtung | Funktion |
---|---|---|---|
1 | STROBE | → | Strobe, zeigt bei fallender Flanke gültige Daten an |
2 | D0 | → | Datenbit 0 |
3 | D1 | → | Datenbit 1 |
4 | D2 | → | Datenbit 2 |
5 | D3 | → | Datenbit 3 |
6 | D4 | → | Datenbit 4 |
7 | D5 | → | Datenbit 5 |
8 | D6 | → | Datenbit 6 |
9 | D7 | → | Datenbit 7 |
10 | ACK | ← | Acknowledge |
11 | BUSY | ← | Busy |
12 | POUT | ← | Paper Out (kein Paper mehr) |
13 | SEL | ← | Select |
14 | AUTOFEED | → | Autofeed |
15 | N/C | nicht belegt | |
16 | 0 V | – | Masse |
17 | CHASSIS GND | – | Masse |
18 | +5 V PULLUP | ← | +5 V DC (50 mA max) |
19 | GND | – | Signalmasse (Strobe) |
20 | GND | – | Signalmasse (D0) |
21 | GND | – | Signalmasse (D1) |
22 | GND | Signalmasse (D2) | |
23 | GND | – | Signalmasse (D3) |
24 | GND | – | Signalmasse (D4) |
25 | GND | – | Signalmasse (D5) |
26 | GND | – | Signalmasse (D6) |
27 | GND | – | Signalmasse (D7) |
28 | GND | – | Signalmasse (Acknowledge) |
29 | GND | – | Signalmasse (Busy) |
30 | GNDRESET | – | Signalmasse (Reset) |
31 | RESET | → | Reset |
32 | FAULT | ← | Fehler |
33 | 0 V | – | Masse |
34 | N/C | nicht belegt | |
35 | +5 V | ← | +5 V DC |
36 | SLCT IN | → | Select In |
Anschluss eines Druckers mit Centronics-Schnittstelle an den C64[Bearbeiten]
Es gibt zwei Möglichkeiten, den C64 mit einem Centronics-Drucker zu verbinden:
- Die komfortabelste Möglichkeit ist ein Interface, das an den CBM-Bus angeschlossen wird und die Daten an die Centronics-Schnittstelle des Druckers weiterleitet. Da ein solches Interface im Prinzip ein vollständiger Computer ist, ist es entsprechend teuer. Dafür kann das Interface zusätzliche Aufgaben wie das Konvertieren von PETSCII zu ASCII übernehmen.
- Eine weitaus günstigere Möglichkeit ist der Anschluss des Druckers über ein Userportkabel, allerdings muss dann auf dem C64 ein Treiberprogramm laufen oder die Software diese Schnittstelle explizit unterstützen. Weiters können die zusätzlichen Status- und Steuerleitungen der Centronics (PAPER END, AUTO FEED, SELECT usw.) nicht genutzt werden da der Userport nur die unbedingt zur Datenübertragung nötigen Pins zur Verfügung stellt.
Anschluss über ein Centronics-Userport-Kabel[Bearbeiten]
Verbindungsplan des Userportkabels:
C64 | Drucker | Bemerkung | ||
---|---|---|---|---|
GND | A | GND | 16 | Es können auch andere Masse-Pins sowohl auf Userport-Seite (1, 12, N) als auch auf Druckerseite (19-30, 33) verwendet werden |
Flag2 | B | BUSY/ ACK |
11/ 10 |
je nach Wahl des Pins sind unterschiedliche Routinen zur Datenübermittlung nötig |
PB0 | C | D0 | 2 | |
PB1 | D | D1 | 3 | |
PB2 | E | D2 | 4 | |
PB3 | F | D3 | 5 | |
PB4 | H | D4 | 6 | |
PB5 | J | D5 | 7 | |
PB6 | K | D6 | 8 | |
PB7 | L | D7 | 9 | |
PA2 | M | STROBE | 1 | |
RESET | 3 | INIT | 31 | optional; wenn verbunden, wird bei einem C64-Reset auch der Drucker initialisiert |
Ansteuerung des Druckers[Bearbeiten]
- (nur wenn Flag mit BUSY verbunden ist): Warten, dass am Flag-Eingang von CIA2 LOW signalisiert wird => Drucker ist bereit für Zeichen
- zu übertragendes Zeichen in Register PRB der CIA schreiben
- Bit 2 von PRA der CIA löschen und unmittelbar darauf wieder setzen = STROBE-Signal an Drucker senden
- (nur wenn Flag mit ACK verbunden ist): Warten, dass am Flag-Eingang von CIA2 LOW signalisiert wird => Drucker hat Zeichen verarbeitet
Minimal-Implementation eines Druckertreibers[Bearbeiten]
Der folgende Druckertreiber wird in den Kassettenpuffer geladen und benutzt die Geräteadresse 4. Der Quelltext ist im ACME-Format.
!to "centronics.obj", cbm * = $33C ; assemblieren in den Kassettenpuffer vecCHROUT = $326 vecCHKOUT = $320 CIA2 = $DD00 CIA2_PRA = CIA2 CIA2_PRB = CIA2 + 1 CIA2_DDRA = CIA2 + 2 CIA2_DDRB = CIA2 + 3 CIA2_ICR = CIA2 + 13 Init: ; Aufruf aus Basic mit SYS 828 ; CHROUT-Vektor umbiegen LDA #<newCHROUT STA vecCHROUT LDA #>newCHROUT STA vecCHROUT + 1 ; CHKOUT-Vektor umbiegen LDA #<newCHKOUT STA vecCHKOUT LDA #>newCHKOUT STA vecCHKOUT + 1 ; CIA-Register initialisieren LDA CIA2_PRA ORA #$04 ; STROBE auf HIGH STA CIA2_PRA LDA #$10 STA CIA2_ICR ; IRQ durch CIA2_ICR-Flag ausschalten LDA CIA2_DDRA ORA #$04 ; Datenrichtung für STROBE auf Ausgabe STA CIA2_DDRA LDA #$FF STA CIA2_DDRB ; Datenrichtung für DATA auf Ausgabe LDA #$00 BEQ toCentronics; NULL-Zeichen ausgeben, um BUSY-Flag zu intialisieren newCHROUT: PHA ; Zeichen auf Stack sichern LDA $9A ; aktuelle Gerätenummer lesen CMP #$04 ; auf Ausgabegerät 4 testen BEQ + JMP $F1CB ; wenn nicht, weiter in Originalroutine + - LDA CIA2_ICR AND #$10 BEQ - ; warten, bis BUSY-Flag gesetzt PLA ; Zeichen vom Stack holen toCentronics: STA CIA2_PRB ; auf den Userport legen LDA CIA2_PRA AND #!$04 ; STROBE auf Low ... STA CIA2_PRA ORA #$04 ; und sofort wieder HIGH STA CIA2_PRA CLC ; Fehlerflag löschen RTS ; und fertig newCHKOUT: JSR $F30F ; File-Index ermitteln BEQ + JMP $F701 ; File not open Error + JSR $F31F ; aktuelle File-Parameter in Zeropage hinterlegen LDA $BA ; Gerätenummer des Files ermitteln CMP #$04 ; auf Ausgabegerät 4 testen BEQ + ; wenn nicht, dann CMP #$00 JMP $F25B ; weiter in originaler CHKOUT-Routine + STA $9A ; ansonsten aktuelle Gerätenummer setzen CLC ; Fehlerflag löschen RTS ; und fertig
Links[Bearbeiten]
Wikipedia: IEEE 1284 |