Présentation
Le port parallèle du PC est l'un des plus intéressants, par ses possibilités et sa simplicité de programmation.En effet il ne nécessite aucun protocole de transmission (contrairement au port série), et les niveaux électriques de ses broches varient entre 0 et 5V ce qui le rend compatible directement avec les composants de technologies TTL.
Il existe différents types de liaison parallèle, définies dans le standard IEEE 1284 :
- mode compatible (SPP, Standard Parallel Port) (unidirectionnel)
- mode 4 bits, ou NIBBLE MODE (unidirectionnel)
- mode 8 bits, ou BYTE MODE (bidirectionnel)
- mode EPP (Enhanced Parallel Port, port parallèle étendu) (bidirectionnel)
- mode ECP (Extended Capability Port, port à capacités étendues) (bidirecionnel)
Le mode EPP est présent sur la plupart des machines actuelles, et on le préférera si l'on désire avoir les 8 bits de données en entrée et sortie, ou on choisira le mode compatible SPP présent sur toutes les machines si on désire avoir les 8 bits de données seulement en sortie.
Outre ces 8 lignes de données, le port parallèle dispose également de 4 lignes de contrôle (sortie) et 5 lignes d'état (entrée).
Connecteurs
Voici la numérotation des broches des deux principaux connecteurs parallèles, SUB-D 25 broches du côté du PC et Centronics 36 broches du côté de l'imprimante :Et voici maintenant les brochages de ces connecteurs :
connecteur SUB-D 25 |
connecteur Centronics |
Fonction | Niveau de repos |
Direction | Registre |
---|---|---|---|---|---|
1 | 1 | Strobe | 1 | S | contrôle |
2 | 2 | donnée D0 | 0 | E/S | donnée |
3 | 3 | donnée D1 | 0 | E/S | donnée |
4 | 4 | donnée D2 | 0 | E/S | donnée |
5 | 5 | donnée D3 | 0 | E/S | donnée |
6 | 6 | donnée D4 | 0 | E/S | donnée |
7 | 7 | donnée D5 | 0 | E/S | donnée |
8 | 8 | donnée D6 | 0 | E/S | donnée |
9 | 9 | donnée D7 | 0 | E/S | donnée |
10 | 10 | Acknowledge | 1 | E | état |
11 | 11 | Busy | 0 | E | état |
12 | 12 | Paper end | 0 | E | état |
13 | 13 | Select | 0 | E | état |
14 | 14 | Autofeed | 1 | S | contrôle |
15 | 32 | Error | 1 | E | état |
16 | 31 | Initialize | 1 | S | contrôle |
17 | 36 | Select input | 1 | S | contrôle |
18-25 | 17, 33, 19-29 | Ground |
On retrouve bien 5 lignes en entrée, 4 en sortie, et les 8 lignes de données en entrée-sortie dans le cas d'un mode bidirectionnel.
Registres de commande
Ces lignes sont commandées directement par un bit, dans trois registres différents, comme précisé dans la dernière colonne, et dans le tableau suivant, et le niveau de repos correspond au niveau de la ligne lorsque le bit dans le registre est à 0, c'est à dire que si le niveau de repos est un le niveau de la ligne et le bit correspondant dans le registre sont inversés.Registre de données |
|
||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Registre d'état |
|
||||||||||||||||
Registre de contrôle |
|
Le bit 5 n'est bien entendu adressable que sur les ports bidirectionnels.
Différentes adresses peuvent exister pour les registres selon le système, le tableau suivant en présente les différentes possibilités (0x signifie que les valeurs sont en hexadécimal) :
port de données | 0x956 | 0x3BC | 0x888 | 0x378 | 0x632 | 0x278 |
---|---|---|---|---|---|---|
port d'état | 0x957 | 0x3BD | 0x889 | 0x379 | 0x633 | 0x279 |
port de contrôle | 0x957 | 0x3BE | 0x89A | 0x37A | 0x634 | 0x27A |
Cependant sur les systèmes actuels le port LPT1 se situe toujours à l'adresse 0x378 et le port LPT2 à l'adresse 0x278, mais pour en être sûrs vous pouvez suivre dans Windows : Panneau de configuration >> Système >> Gestionnaire de périphérique >> Ports (COM et LPT) >> Port imprimante (LPTx) >> Ressources >> Plage d'entrée/sortie qui vous indiquera les ports utilisés, et également les requêtes d'interruptions (IRQ) si vous désirez les utiliser (bit 4 du registre de contrôle), qui sont généralement IRQ7 pour LPT1 et IRQ5 pour LPT2.
Programmation
Il ne vous reste plus ensuite qu'à lire et écrire dans ces registres à ces adresses pour commander directement les lignes du port parallèle.Ceci peut se faire de différentes manières.
Langage haut niveau
L'accès aux différents ports est pris en charges dans certains langages :Langage | Lecture sur un port | Ecriture sur un port |
---|---|---|
Basic | valeur = INP(adresse_port) |
OUT(adresse_port),valeur |
Turbo-Basic QuickBasic |
valeur = INP(adresse_port) |
OUT adresse_port,valeur |
C / Borland C++ |
valeur = INPORT(adresse_port) valeur = INPORTb(adresse_port) |
OUTPORT(adresse_port,valeur) OUTPORTb(adresse_port,valeur) |
Turbo-Pascal Delphi 1 |
valeur := PORT[adresse_port] |
PORT[adresse_port] := valeur |
Cependant les dernières versions de Delphi et C++Builder ne disposent pas d'instructions dédiées, et on est alors obligé de recourir à l'assembleur.
Assembleur
Pas de panique ! Ce n'est pas si difficile que ça pour cette application, et je présenterai d'ailleurs sûrement un petit cours d'initiation à l'assembleur, mais en attendant voici les fonctions toutes faites dans les deux langages. Il suffit de copier ces fonctions dans votre code et de les utiliser comme n'importes quelle autre fonction :Delphi :
Function lire_port(adresse_reg: Word): Byte; Begin Asm mov DX,adresse_reg in AL,DX mov Result,AL End; End; Procedure ecrire_port(adresse_reg: Word; valeur: Byte); Begin Asm mov DX,adresse_reg mov AL,valeur out DX, AL End; End;
C++Builder :
unsigned char lire_port(unsigned short adresse_reg) { asm { mov DX,adresse_reg in AL,DX mov Result,AL } } void ecrire_port(unsigned short adresse_reg, unsigned char valeur) { asm { mov DX,adresse_reg mov AL,valeur out DX, AL } }
Le mot clé 'asm' informe le compilateur que les instructions qui suivent sont en assembleur, l'instruction 'mov' sert à copier la deuxième valeur dans la première, 'DX' et 'AL' sont des registres système, 'in' copie la valeur du port d'adresse DX dans AL et 'out' copie la valeur de AL dans le port d'adresse DX.
Malheureusement depuis Windows XP, l'accès direct aux registres systèmes est interdit. Il est alors nécessaire d'utiliser une DLL.