Le composant TDLPortIO, description( ! EN FINITION ! )

Vincent PETIT

Cet article a pour but de montrer comment accéder au port parallèle du PC avec C++ Builder™

- Titre : Le composant TDLPortIO, description( ! EN FINITION ! )

- Auteur : Vincent PETIT

- Parution : 13 novembre 2004

- Mise à jour : 8 mars 2013

- Public visé :

- Licence : Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright ® 2004 Vincent PETIT. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.

Sommaire

- I. Généralité sur le port parallèle

- I-A. Le Brochage vu de face

- I-B. Performance

- II. Le composant TDLPortIO

- II-A. Ouverture du port

- II-B. Fermeture du port

- II-C. Écrire une donnée sur D0 à D7

- II-D. Lire une donnée sur D0 à D7

- II-E. Lire les broches d'entrées du port

- II-F. Ecrire sur les broches I/O

- III. Le composant TDLPrinterPortIO

- III-A. Adresse de base du port LPT

- III-B. Nombre port LPT installé

- IV. Le composant TDLPortIOX

- V. Le composant TDLPrinterPortIOX

- VI. Conclusion

I - Généralité sur le port parallèle

I-A - Le Brochage vu de face

Affectation :

Nom

C++ Builder

Broche

Sens

/STROBE

LPTStrobe

Broche n°1

I/O

D0

--

Broche n°2

I/O si EPP

D1

--

Broche n°3

I/O si EPP

D2

--

Broche n°4

I/O si EPP

D3

--

Broche n°5

I/O si EPP

D4

--

Broche n°6

I/O si EPP

D5

--

Broche n°7

I/O si EPP

D6

--

Broche n°8

I/O si EPP

D7

--

Broche n°9

I/O si EPP

/ACK

LPTAckwl

Broche n°10

Entrée

BUSY

LPTBusy

Broche n°11

Entrée

PE

LPTPaperEnd

Broche n°12

Entrée

SELECT

LPTSlct

Broche n°13

Entrée

/AUTOFEED

LPTAutofd

Broche n°14

I/O

/ERROR

LPTError

Broche n°15

Entrée

/INIT

LPTInit

Broche n°16

I/O

/SELECT IN

LPTSlctIn

Broche n°17

I/O

MASSE

--

Broche n°18

--

MASSE

--

Broche n°19

--

MASSE

--

Broche n°20

--

MASSE

--

Broche n°21

--

MASSE

--

Broche n°22

--

MASSE

--

Broche n°23

--

MASSE

--

Broche n°24

--

MASSE

--

Broche n°25

--

Description des signaux :

- Broche 1 : /STROBE cette ligne, active au niveau bas, indique à l'imprimante que des données sont présentes sur les lignes D0 à D7 et qu'il faut les prendre en compte ;

- Broche 2 à 9 : D0 à D7 c'est le bus de données sur lequel véhicule la valeur du caractère à imprimer. On ne peut qu'écrire sur ce port, à moins d'avoir un port parallèle étendu (c'est le cas pour les ports de type ECP/EPP) ;

- Broche 10 : ACK (Acknowledge) l'imprimante met à 0 cette ligne pour indiquer à l'ordinateur qu'elle a bien reçu le caractère transmis et que ce dernier peut continuer la transmission ;

- Broche 11 : BUSY cette ligne est mise à 0 par l'imprimante lorsque son buffer de réception est plein. L'ordinateur est ainsi averti que celle-ci ne peut plus recevoir de données. Il doit attendre que cette ligne revienne à 1 pour recommencer à émettre ;

- Broche 12 : PE (Paper Error) l'imprimante indique par cette ligne à l'ordinateur que l'alimentation en papier a été interrompue ;

- Broche 13 : SELECT cette ligne indique à l'ordinateur si l'imprimante est « on line » ou « off line » ;

- Broche 14 : AUTOFEED lorsque cette ligne est à 1, l'imprimante doit effectuer un saut de ligne à chaque caractère « return » reçu. En fait elle effectue un retour chariot ;

- Broche 15 : ERROR indique à l'ordinateur que l'imprimante a détecté une erreur ;

- Broche 16 : INIT (Initialization) comme son nom, le laisse supposer, l'ordinateur peut effectuer une initialisation de l'imprimante par l'intermédiaire de cette ligne ;

- Broche 17 : SELECT IN l'ordinateur peut mettre l'imprimante hors connexion par l'intermédiaire de cette ligne ;

- Broche 18 à 25 : MASSE c'est la masse du PC.

Registres d'accès :

Adresse

Broches accessibles

378 hexa

8 bits de données pour l'émission ou la réception avec le port bidirectionnel

379 hexa

Bit 3 : /ERROR
Bit 4 : SELECT
Bit 5 : PE
Bit 6 : /ACK
Bit 7 : BUSY

37A hexa

Bit 0 : /STROBE
Bit 1 : /AUTOFEED
Bit 2 : /INIT
Bit 3 : /SELECT IN
Bit 4 : Autorisation d'interruption
Bit 5 : Mode I/O : mise à 1 = lecture, mise à 0 = écriture

L'adresse de base n'est pas toujours 378 hexa, elle peut être 278 hexa ou autre.

I-B - Performance

La vitesse de transmission maximale que l'on peut espérer obtenir avec un tel port est de l'ordre de 150 ko/s. Les ports plus récents, de type EPP (pour Enhanced Parallel Port, développé par Xircom®, Zenith® et Intel® en 1991), permettent d'atteindre un débit de 2 Mo/s soit un débit environ treize fois supérieur. S'il reste inférieur au débit du bus ISA (8 Mo/s) il permet néanmoins la réception de périphériques tels que des lecteurs de CD-ROM ou des disques durs. En plus d'un débit supérieur, les ports EPP sont bidirectionnels. Encore plus récent, le port ECP (Extended Capacity Port) possède la particularité d'être Plug and Play. Il dérive du port EPP et en possède les même caractéristiques. Sa particularité est qu'il permet au périphérique branché sur celui-ci de s'identifier à la machine dès le démarrage. Ainsi l'imprimante peut s'autoconfigurer lors du lancement du système d'exploitation (à condition que ce dernier et le BIOS soient eux aussi compatibles Plug and Play). Mais du point de vue de l'électronicien amateur, l'avantage de ces ports est sans conteste leur bidirectionnalité.

Néanmoins, que ceux qui n'ont pas de port étendu se rassurent, il est tout à fait possible de rendre bidirectionnel le port grâce à une petite astuce. L'interface parallèle possède en effet 4 bits en entrée (ACK, BUSY, PE et SELECT). Il suffit de multiplexer les 8 bits dont on veut effectuer l'acquisition en deux quartés. La sélection du quarté haut ou du quarté bas s'effectue par une ligne libre du port (SELECT IN par exemple). Ainsi un simple multiplexeur du type 74LS157 résout le problème.

II - Le composant TDLPortIO

II-A - Ouverture du port

On définit préalablement, le port LPT1, 2, 3 ou 4 dans l'inspecteur d'objets, (propriété Port).

//-------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
DLPortIO1->OpenDriver(); //Ouverture du port et chargement de la dll (prêt à communiquer)
}
//-------------------------------------------------------

Le port et maintenant prêt à communiquer avec un périphérique externe.

II-B - Fermeture du port

//-------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
DLPortIO1->CloseDriver(); //Fermeture du port et déchargement de la dll.
}
//-------------------------------------------------------

Le port parallèle est fermé, toutes tentatives de lecture, d'écriture ou autre, sera sans effets.

II-C - Écrire une donnée sur D0 à D7

Il faut placer le port en écriture en mettant le bit 5 du registre de base + 2 à 0. C'est à dire : que si votre registre de base, pour le port LPT1, est 378 en hexa alors le registre de base + 2 est 37A en hexa :

//-------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
DLPortIO1->Port [0x37A] = DLPortIO1->Port [0x37A] & 0xDF;
// port en sortie, bit 5 à 0
DLPortIO1->Port [0x378] = 0xAA;
// 0xAA sur D0 à D7
}
//-------------------------------------------------------

II-D - Lire une donnée sur D0 à D7

Il faut placer le port en lecture en mettant le bit 5 du registre de base + 2 à 1. C'est à dire : que si votre registre de base, pour le port LPT1, est 378 en hexa alors le registre de base + 2 est 37A en hexa :

//-------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
char donnee;
DLPortIO1->Port [0x37A] = DLPortIO1->Port [0x37A] | 0x20;
// port en sortie, bit 5 à 1
donnee = DLPortIO1->Port [0x378];
}
//-------------------------------------------------------

II-E - Lire les broches d'entrées du port

Les broches d'entrées du port parallèle sont /ACK, BUSY, PE, SELECT et /ERROR.

//-------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
char broches_entrees;
broches_entrees = DLPortIO1->Port [0x379];
}
//-------------------------------------------------------

À l'aide d'un masque, il est très facile de connaître l'état d'une seule broche.

II-F - Ecrire sur les broches I/O

Les broches I/O du port parallèle sont /STROBE, /AUTOFEED, /INIT, et /SELECT IN.

//-------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
DLPortIO1->Port [0x37A] = DLPortIO1->Port [0x37A] & 0xDF;
// port en sortie, bit 5 à 0
DLPortIO1->Port [0x37A] = DLPortIO1->Port [0x37A] | 0x0C;
}
//-------------------------------------------------------

Étant donné qu'il n'y a que 4 bits correspondant aux 4 broches, il ne faut écrire que sur les 4 bits de poids faibles du registre. Dans cet exemple, les broches /SELECT IN et /INIT sont actives donc électriquement à 0V.

III - Le composant TDLPrinterPortIO

L'utilisation de TDLPrinterPortIO nécessite le composant TDLPPortIO pour l'ouverture et la fermeture du port parallèle.

III-A - Adresse de base du port LPT

//-------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
Edit1->Text = DLPrinterPortIO1->LPTBasePort;
}
//-------------------------------------------------------

Cette propriété permet de connaître l'adresse de base du port, sélectionné dans l'inspecteur d'objets :

Propriété LPTNumber de TDLPrinterPortIO.

III-B - Nombre port LPT installé

//-------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
Edit1->Text = DLPrinterPortIO1->LPTNumPorts;
}
//-------------------------------------------------------

IV - Le composant TDLPortIOX

V - Le composant TDLPrinterPortIOX

VI - Conclusion