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;
}
//-------------------------------------------------------