Le composant TDLPortIO, description( ! EN FINITION ! )13/11/2004
Par
Vincent PETIT (home page) Patrick PETIT (home page) niveau : facile durée : 15 minutes
Cet article a pour but de montrer comment accèder au port parallèle du PC avec C++ Builder
Avant-Propos 1. Généralité sur le port parallèle 1.1. Le Brochage vue de face 1.2. Performance 2. Le composant TDLPortIO 2.1. Ouverture du port 2.2. Fermeture du port 2.3. Ecrire une donnée sur D0 à D7 2.4. Lire une donnée sur D0 à D7 2.5. Lire les broches d'entrées du port 2.6. Ecrire sur les broches I/O 3. Le composant TDLPrinterPortIO 3.1. Adresse de base du port LPT 3.2. Nombre port LPT installé 4. Le composant TDLPortIOX 5. Le composant TDLPrinterPortIOX Conclusion
Avant-Propos
Le port parallèle est une interface qui sert avant toutes choses à communiquer, entre un ordinateur et une
imprimante. Mais le grand avantage de ce port est qu'il est composé de 17 lignes utiles et qui pour certaines
d'entre elles sont bidirectionnels, donc son utilisation dans le domaine de l'électronique peut-être très variés.
Comme nous l'évoquions dans le cours sur le port série, l'emploi d'un circuit décodeur de données sérialisées
n'a pas lieu d'être ici. Et là, est le sérieux avantage.
Ce tutoriel nous permettra de comprendre le fonctionnement de ce port à travers le composant TDLPortIO et de pouvoir le contrôler.
1. Généralité sur le port parallèle
1.1. Le Brochage vue 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'ils 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 faite elle effectue un retour chariot.
- Broche 15 : ERROR indique à l'ordinateur que l'imprimante a détecté une erreur.
- Broche 16 : INIT (Initialization) comme sont 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'emission ou la recéption 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.
1.2. Performance
La vitesse de transmission maximale que l'on peut espérer obtenir avec un tel port est de l'ordre de
150ko/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 2Mo/s soit un débit environ treize fois supérieur.
Si il reste inférieur au débit du bus ISA (8Mo/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.
2. Le composant TDLPortIO
2.1. 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();
}
Le port et maintenant prêt à communiquer avec un périphérique externe.
2.2. Fermeture du port
void __fastcall TForm1::Button1Click(TObject *Sender)
{
DLPortIO1->CloseDriver();
}
Le port parallèle est fermé, toutes tentatives de lecture, d'écriture ou autre, sera sans effets.
2.3. Ecrire 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;
DLPortIO1->Port [0x378] = 0xAA;
}
2.4. 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;
donnee = DLPortIO1->Port [0x378];
}
2.5. 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];
}
A l'aide d'un masque, il est très facile de connaitre l'état d'une seule broche.
2.6. 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;
DLPortIO1->Port [0x37A] = DLPortIO1->Port [0x37A] | 0x0C;
}
Etant 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 cette exemple, les broches /SELECT IN et /INIT sont
actives donc électriquement à 0V.
3. Le composant TDLPrinterPortIO
L'utilisation de TDLPrinterPortIO nécessite le composant TDLPPortIO pour l'ouverture et la fermeture du port parallèle.
3.1. Adresse de base du port LPT
void __fastcall TForm1::Button1Click(TObject *Sender)
{
Edit1->Text = DLPrinterPortIO1->LPTBasePort;
}
Cette propriété permet de connaitre l'adresse de base du port, sélectionné dans l'inspecteur d'objets :
Propriété LPTNumber de TDLPrinterPortIO.
3.2. Nombre port LPT installé
void __fastcall TForm1::Button1Click(TObject *Sender)
{
Edit1->Text = DLPrinterPortIO1->LPTNumPorts;
}
4. Le composant TDLPortIOX
5. Le composant TDLPrinterPortIOX
Conclusion
Ce document est issu de http://www.developpez.com et reste la propriété exclusive de son auteur.
La copie, modification et/ou distribution par quelque moyen que ce soit est soumise à l'obtention préalable de
l'autorisation de l'auteur.
|