Le composant TDLPortIO, description( ! EN FINITION ! )

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

Article lu   fois.

L'auteur

Profil ProSite personnel

Liens sociaux

Viadeo Twitter Facebook Share on Google+   

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

I-A. Le Brochage vu de face

Image non disponible

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).

 
Sélectionnez
//-------------------------------------------------------
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

 
Sélectionnez
//-------------------------------------------------------
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 :

 
Sélectionnez
//-------------------------------------------------------
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 :

 
Sélectionnez
//-------------------------------------------------------
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.

 
Sélectionnez
//-------------------------------------------------------
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.

 
Sélectionnez
//-------------------------------------------------------
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

 
Sélectionnez
//-------------------------------------------------------
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é

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

IV. Le composant TDLPortIOX

V. Le composant TDLPrinterPortIOX

VI. Conclusion

Vous avez aimé ce tutoriel ? Alors partagez-le en cliquant sur les boutons suivants : Viadeo Twitter Facebook Share on Google+   

Nos articles C++ Builder™ :
- Piloter le port série avec C++ Builder™
Le composant TComPort, description 25/11/2003
Le composant TComPort, installation 25/11/2003
- Piloter le port parallèle avec C++ Builder™
Le composant TDLPortIO, description 03/01/2004
Le composant TDLPortIO, installation 03/01/2004
Sans oublier :
la FAQ C++ Builder™
la FAQ C++
la FAQ C

  

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.