Der Zinker

Chipkarten-Terminal mit seriellem Anschluß

Wissen | Know-how

Die vielen in den 'Smart Cards' verwendeten unterschiedlichen Speicher-Chips und deren Protokolle machen es nicht gerade einfach, aus der Anwendungs-Software heraus Daten von der Karte zu holen oder dort abzulegen. Statt einer proprietären Bastellösung am PC-Druckerport haben wir uns deshalb für ein 'amtliches' Projekt mit eigenem Controller entschieden: Das c't-CardTerminal läuft an jedem Rechner mit serieller Schnittstelle, egal ob PC, Mac, Amiga oder Atari.

Aufmacher

[#CardTerminal-Befehle CardTerminal-Befehle]
[#Stückliste Stückliste]
[#Steckerbelegung Steckerbelegung]

Aufmerksame Leser haben uns gefragt, ob man mit der universellen Microcontroller-Platine zum ADB-Interface aus der letzten c't nicht weitere Projekte realisieren kann. In der Tat ist die Platine auch für den hier vorgestellten Zweck vorgesehen - das großzügige Layout kommt also nicht von ungefähr.

Der Mikrocontroller wickelt für den Anwender transparent die gesamte Kommunikation mit der Karte ab - man braucht sich nicht darum zu kümmern, ob das Modul nun mit dem I(2)C-, Zwei- oder Dreidraht-Bus-Protokoll arbeitet. Gleichwohl sind diese Informationen, sollten sie für den jeweiligen Anwendungsfall relevant sein, auf Befehl abrufbar.

Der Namensbestandteil 'Terminal' deutet es schon an: die Platine kann manuell über ein ganz normales Terminal-Programm (etwa ZTerm auf dem Mac oder Telix auf dem PC, Übertragungsparameter: 9600 8N1) bedient werden - obschon sich der Bedienungskomfort durch eine maßgeschneiderte Applikation erheblich steigern läßt. Für erste Gehversuche und die Analyse der auf einer beliebigen Speicherkarte abgelegten Informationen ist jedoch die Arbeit mit dem Terminal-Prompt sehr hilfreich.

Nebenbei impliziert der >-Prompt auch eine einfache Flußkontrolle: solange er nicht wieder erscheint, ist das CardTerminal beschäftigt - etwa mit dem 'Brennen' einer EEPROM-Speicherzelle auf der Karte, was je nach Typ bis zu 10 ms in Anspruch nehmen kann. Da alle Informationen über alphanumerische Zeichen (insbesondere Hexzahlen) ausgetauscht werden, lassen sich Steuerzeichen (CR, Prompt) leicht aussortieren. In der Tabelle sind alle Funktionen des Terminals aufgeführt; eine Beispiel-Session finden Sie auf den vorhergehenden Seiten. Jeder Befehl wird mit der Return-Taste (CR) abgeschlossen, es sind Groß- und Kleinbuchstaben zulässig.

Verbidnung von PC und Mac mit dem CardTerminal
Vergrößern
So werden PC und Mac mit dem CardTerminal verbunden. Die Schalterstellung wird nur beim Einschalten abgefragt.

Zunächst kann die Karte mit i angefordert werden, wenn die Applikation dies nicht selbst tut - das Display zeigt eine entsprechende Meldung an. Aktiviert wird das Modul erst mit a, was gleichzeitig auch die ATR-Bytes zurückliefert. Die ermittelten ISO-Parameter lassen sich mit p pp,qq 'overriden', falls erforderlich; pp,qq stehen für die ersten beiden ATR-Bytes. Zum Entnehmen der Karte fordert der Befehl o auf; gleichzeitig schaltet er die Betriebsspannung der Karte ab. Befehle zum Ansprechen der bei manchen Modulen vorhandenen Protection- und Security-Funktionen unterstützt das CardTerminal wegen der Vielzahl der unterschiedlichen Implementierungen (noch) nicht.

Bei Telefonkarten adressiert xx übrigens nicht ein bestimmtes Byte, sondern eines der nur 128 Bits. Beim 'Schreiben' (es werden nur Bits gelöscht) gibt man in yy an, wie viele Progammierpulse (01 oder 02) gegeben werden sollen; wie in den Grundlagen erläutert, setzen zwei Pulse nicht nur das angewählte Bit im Gebührenzähler auf '0', sondern auch das nächst niederwertige Byte auf $FF. So wenig sinvoll das Abbuchen auch erscheinen mag: Eine fast leere Telefonkarte läßt sich damit prima 'personalisieren' - ein unrunder Restbetrag, etwa 17 Pfennig, macht sie absolut eindeutig.

Da der Aufbau und die Funktion der Platine bereits in der letzten c't beschrieben wurde, möchte ich näher Interessierte auf diesen Artikel verweisen; der Vollständigkeit halber ist der Schaltplan und die Steckerbelegung hier nochmals abgedruckt. Im Gegensatz zur MacInterface-Anwendung kommt das CardTerminal mit einem billigen ROM-losen 8031 oder einem gebrauchten, maskenprogrammierten 80(C)51 als Controller aus, der sein Programm im externen EPROM findet. Jumper J1 ist deshalb auf jeden Fall zu stecken. Ein programmiertes EPROM bekommen Sie bei eMedia, ebenso das Source-Listing und ein HEX-File zum Selbstbrennen eines 27(C)128. Wie gewohnt legen wir die Software auch auf unserem Server ab. Da das CardTerminal seine Versorgungsspannung nicht wie MacInterface aus den ADB-Leitungen zieht, sind an ST2 fünf stabilisierte Volt zuzuführen (Pin 1 = Masse, Pin 10 = +5V). P1 dient natürlich, das wurde in [[#literatur 1]] nicht erwähnt, zum Einstellen des Display-Kontrastes.

Schaltung
Vergrößern
Die Schaltung aus [[#literatur 1]] wurde für das CardTerminal unverändert übernommen, ebenso die Platine.

Ein kleiner Gimmick ist im Betriebsprogramm noch versteckt: Verbindet man Pin 9 von ST2 (P1.7) mit Masse (ein Schalter tut's auch), wird aus dem Kartenterminal ein Standalone-Telefonkarten-Checker, der alle Daten analysiert und auf dem Display formatiert ausgibt, sobald man eine Karte einsteckt - unabhängig vom Rechner. Wenn Sie für Controller und EPROM CMOS-Versionen einsetzen, ist auch der Batteriebetrieb aus einem 9V-Block möglich; der dafür nötige Spannungsregler kann samt seinen Entkopplungskondensatoren auf dem Lochrasterfeld Platz finden. (cm)

Weitere Hinweise und Berichtigungen unter: c't-Projekte

Programme und Firmware siehe Download-Seite.

[1] Carsten Meyer: Zwischen Mac und Maus, Universelles Interface für den Apple Desktop Bus, c't 11/94, S. 230

[#anfang Seitenanfang]


CardTerminal-Befehle
Befehl Ergebnis Beschreibung
r xxxx,yy aa,bb,cc ... Liest yy Bytes ab Kartenadresse xxxx, erhöht Adreßregister um yy
r xx,yy aa,bb,cc ... Liest yy Bytes ab Kartenadresse xx (bei 256-Byte-Karten zulässig), erhöht Adreßregister um yy
r yy aa,bb,cc ... Liest yy Bytes ab der letzten Adresse, erhöht Adreßregister um yy
r xxxx,00 - Setzt Adreßregister auf Adresse xxxx
r xx,00 - Setzt Adreßregister auf Adresse xx (bei 256-Byte-Karten zulässig)
w xxxx,yy - Schreibt yy in Adresse xxxx, erhöht Adreßregister um 1
w xx,yy - Schreibt yy in Adresse xx (bei 256-Byte-Karten zulässig), erhöht Adreßregister um 1
w yy - Schreibt yy in letzte Adresse, erhöht Adreßregister um yy
s String - Schreibt String (max. 8 Zeichen) in letzte Adresse, erhöht Adreßregister um Anzahl der Zeichen
a pp,qq,rr,ss liefert 4 ATR-Bytes, aus ATR (so vorhanden) oder den ersten 4 Adressen
p pp,qq - Setzt Übertragungsparameter entsprechend den ersten 2 ATR-Bytes pp,qq
m Memory-Dump Kompletter Hexdump der Karte einschließlich ATR
i OK Fordert auf dem Display Karte an, liefert OK, wenn innerhalb des Timeouts von 15s
o OK Fordert zum Entnehmen der Karte auf, liefert OK, wenn innerhalb des Timeouts von 15s
d String - Schreibt String (max. 16 Zeichen) ins Display, einige Steuerzeichen (s. u.) sind zulässig
b yy - Debug-Mode ein (yy=01) oder aus (yy=00); Anzeige der aktuellen Adresse und des aktuellen Datums auf dem Display

Alle Werte sind Hexadezimalzahlen. Jeder Befehl ist mit CR (Carriage Return, $0D) abzuschließen.

Display-Steuerzeichen
ASCII-Code Aktion
$02, STX CTRL-B Cursor ein, blinkt
$03, ETX CTRL-C Cursor aus
$08, BS CTRL-H Cursor ein Zeichen zurück
$09, HT CTRL-I Cursor ein Zeichen vor
$0C, FF CTRL-L Display löschen
$0A, LF CTRL-J Zeile wechseln
$0D, CR CTRL-M Cursor zum Anfang der Zeile
$20-$7F - ASCII-Zeichensatz

Funktionen des optionalen Displays. Backspace ($08, CTRL-H) löscht kein Zeichen, sondern bewegt nur den Cursor, und Linefeed ($0A, CTRL-J) gilt nur bei zweizeiligen Displays.

[#anfang Seitenanfang]


Stückliste
Halbleiter
IC1 80(C)31 Mikrocontroller
IC2 74HC132
IC3 74HCT573
IC4 27(C)128 (programmiert)
IC5 MAX232
IC6 LM16155 o. ä. LCD
T1 BC557
T2 entfällt
D1 1N4148
Widerstände
R1 220R
R2 10k
R3 entfällt
R4 47k
R5 10k
R6 4k7
P1 4k7 Trimmpoti, liegend, RM10
Kondensatoren
C1, C2 15p ker.
C4 ...7 1µ 35V Ta.
C10...C12 100n ker.
C8 4µ7 35V Ta.
C9 1µ 35V Ta.
Sonstiges
X1 Quarz 11,059 MHz
ST1 Pfostenleiste, zweireihig, 20pol. (optional)
ST2 Pfostenleiste, zweireihig, 10pol.
ST3 Pfostenleiste, zweireihig, 10pol.
ST6 Amphenol C702 10M008 121 4 oder
ST7 Amphenol C702 10M008 206 4

2 Abstandsröllchen 10 mm, 2 Schrauben M2,5 x 16 mit Muttern, Platine MacInterface

[#anfang Seitenanfang]


Steckerbelegung
Port 1/ST2
1 Gnd
2 P1.0, C7 CdData
3 P1.1, C3 CdClk
4 P1.2, C2 CdReset
5 P1.3, C1 /CdUb
6 P1.4, Sk
7 P1.5
8 P1.6
9 P1.7 (/StandAloneTK)
10 +Ub
Aux/ST3 (Serieller Anschluß zum PC/Mac)
1 Gnd
2 Reset
3 TxD RS-232
4 RxD RS-232
5 MAX7, RS-232 Out 2
6 MAX8, RS-232 In 1
7 MAX9, TTL Out 1
8 MAX10, TTL In 2
9 ADB 2
10 /P1.3, C1 CdUb
Anzeige
Anzeige