Le composant TDLPortIO, description( ! EN FINITION ! )13/11/2004
Par
Vincent 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:
Description des signaux:
Registres d'accès:
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(); //Ouverture du port et chargement de la dll (prêt à communiquer) } //-------------------------------------------------------
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(); //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.
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; // port en sortie, bit 5 à 0 DLPortIO1->Port [0x378] = 0xAA; // 0xAA sur D0 à D7 } //------------------------------------------------------- 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; // port en sortie, bit 5 à 1 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; // port en sortie, bit 5 à 0 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. |