Programmation E/S port parallèle
Transcription
Programmation E/S port parallèle
Transmission de donnée Le port parallèle Présentation. Destiné à l'origine à l'imprimante du PC, le port parallèle fait l'objet de nombreuses applications. Il est matérialisé par un connecteur DB 25 femelle et possède un nombre important de broches utiles pour l'émission et la réception de signaux logiques aux normes TTL (0/5V). Il est nécessaire de bien connaître le fonctionnement du port parallèle afin de pouvoir le programmer pour de multiples utilisations (lecture de cartes à puce, pilotage de cartes électroniques, programmation d'un microcontrôleur par le port parallèle,...). Sur les machines d’aujourd’hui le port parallèle fonctionne selon plusieurs modes que l’on choisit dans le setup. Emission seulement : Mode compatible "Centronics" ou mode Réception uniquement Mode Nibble standard 4 bits des lignes de contrôle sont utilisés pour les données. Hewlett Packard Bi-tronics Mode Byte 8 bits de données en entrée. Bi-directionel EPP :Enhanced ECP Parallel Port utilisé par les périphériques évolués... Extended Capability Port utilisé par les périphériques évolués comme les nouvelles imprimantes ou les scanners Brochage du port parallèle. La sortie du port parallèle s'opère par l'intermédiaire d'un connecteur DB 25 femelle. La liaison parallèle se fait sur niveaux TTL et nécessite un câble court (3m maxi). Les raccordements se font par connecteur 36 points côté imprimante et 25 points côté ordinateur. Chaque fil de donnée est torsadé avec un fil de masse. Exemple de circuit de test. STROBE : cette ligne active basse (donc a 0) indique à l'imprimante que des données sont présentes sur les lignes D0 à D7 et qu'il faut les prendre en compte. 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 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18-25 Nom Sortie Entrée /STROBE D0 D1 D2 D3 D4 D5 D6 D7 /ACK BUSY PE SELECT /AUTOFEED /ERROR /INIT /SELECT MASSE X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X si si si si si si si si EPP EPP EPP EPP EPP EPP EPP EPP ACK : l'imprimante met à 0 cette ligne pour indiquer à l'ordinateur qu'elle a bien reçu le caractère transmit et qu'il peut continuer la transmission. #njc Lycée « la Briquerie » Programmation C++ : le port // & page 1/4 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. PE : signifie " paper error ". L'imprimante indique par cette ligne à l'ordinateur que l'alimentation en papier a été interrompue. SELECT : cette ligne indique à l'ordinateur si l'imprimante est "on line" ou "off line". AUTOFEED : lorsque ce signal est à 1, l'imprimante doit effectuer un saut de ligne à chaque caractère "return" reçu. En effet, certaines imprimantes se contentent d'effectuer un simple retour du chariot en présence de ce caractère. ERROR : indique à l'ordinateur que l'imprimante a détecté une erreur. INIT : l'ordinateur peut effectuer une initialisation de l'imprimante par l'intermédiaire de cette ligne. SELECT IN : l'ordinateur peut mettre l'imprimante hors ligne par l'intermédiaire de ce signal. MASSE : c'est la masse du PC. Programmation du port parallèle. Il est très facile de programmer cette interface. Trois registres seulement sont nécessaires au contrôle total des signaux. Chaque port parallèle possède ses propres registres et l'adresse du port correspond généralement à LPT1. Dans le cas contraire reporter vous au tableau ci-dessous (on peut modifier l’adresse du port dans le setup du PC). Le registre de données : Ce registre permet de positionner les broches de données de la liaison par simple écriture. Le registre d’état : Ce registre est accessible uniquement en lecture (surtout éviter d’y écrire car on rapporte des cas de dommage au PC). Il reflète l’état des broches correspondantes de la prise. Bit 7 6 5 4 3 2 1 0 Nom /BUSY ACK PE SELECT /ERROR X X X Le "/" indique "Logique Inversée" et X : Indéfini Le registre de contrôle : Il permet de positionner différents bits contrôlant la liaison (et les broches correspondantes de la prise). Ce dernier registre est accessible à la fois en lecture et en écriture. Bit 7 6 5 4 3 2 1 0 Nom X X BIT CTRL IRQ ENABLE SELECT IN /INIT AUTOFEED /STROBE En principe, la programmation s’effectue, par exemple en langage C/C++, par des instructions spécialisées de la bibliothèque "conio.h" qu’il faudra inclure dans les projets : Ecrire sur le port des données : En C : outportb(378h,Valeur_que_vous_voulez); En C++ : _outp(378h,Valeur_que_vous_voulez); Lire sur le port d'état de l'imprimante : En C : valeur = inportb(379h); // retourne la valeur du port En C++ : valeur = _inp(379h); Exemple d’une application en mode console. Nous allons créer une application VC++ en mode console. On choisira ensuite une application de base. #njc Lycée « la Briquerie » Programmation C++ : le port // & page 2/4 On ouvre le fichier de code produit et on remplace son contenu par le suivant : #include "stdafx.h" #include "conio.h" #include "stdio.h" #include "string.h" #include "stdlib.h" int main(int argc, char* argv[]) { short data; if(argc<2) { printf("Utilisation\n\n"); printf("partest1.exe ,,\n\n\n"); return 0; } if(!strcmp(argv[1],"read")) { data = _inp(atoi(argv[2])); printf("Data lues depuis le port "); printf("%d\n\n\n\n",data); } if(!strcmp(argv[1],"write")) { _outp(atoi(argv[2]),atoi(argv[3])); printf("Data envoyées au port "); printf("%s\n\n\n\n\n",argv[3]); } return 0; } On peut compiler le projet afin d’obtenir l’exécutable partest1.exe que l’on copiera dans « d:\ ». Pour tester le programme, on peut dans une fenêtre DOS taper la commande d:\partest1 write 888 255 qui doit allumer les LEDS 1 à 8 (write est la commande d’écriture, 888 soit 0x378 est l’adresse et 255 représente la donnée). Si on entre la commande d:\partest1 read 888 on obtient les données du registre de données mais non l’état des lignes du port. Il faudra positionner le bit 5 du registre de contrôle à « 1 » afin de valider le mode bidirectionnel ce que l’on obtient par la commande d:\partest1 write 890 32 Attention : Cet exemple de programme ne fonctionne pas pour les systèmes Windows NT/2000/XP car il faudra utiliser un driver particulier comme nous le verrons dans la suite (inpout32.dll). Utilisation du port parallèle avec les systèmes Windows de la famille NT. Si nous utilisons le programme précédent, qui fonctionne parfaitement sous Windows 98 par exemple, sous XP nous allons avoir un message comme ci-dessous. #njc Lycée « la Briquerie » Programmation C++ : le port // & page 3/4 Il faut savoir que pour les systèmes de la famille NT, le système classe les applications en deux catégories : Les applications en mode user (ring ou niveau 3) Les applications en mode kernel (ring ou niveau 0) Nos programmes sont en général gérés au niveau utilisateur et ne bénéficie, de ce fait, pas de l’accès aux ressources de type in/out. Les drivers disponibles dans le commerce agissent directement au niveau kernel c’est pourquoi ils ne posent pas de problèmes. La solution à notre problème est d’utilisé un driver permettant à nos programme d’accéder au port parallèle. Plusieurs solutions sont disponibles : Driver inpout32.dll qui fonctionne avec tous les systèmes Windows (y compris 98). Le driver est inclus dans la DLL et il est installé automatiquement au chargement de cette DLL. L’organigramme ci-contre nous montre le fonctionnement du driver. La mise en oeuvre du driver dans un projet VC++ est la suivante : On inclus dans le projet le fichier inpout32.lib ce qui permettra d’utiliser les fonctions _stdcall inp32 (out32) comme le montre la copie d’écran ci-dessous : Il faut placer la DLL inpout32.dll dans le répertoire de l’exécutable du projet. Driver avec winio.dll Le comportement est analogue au précédent et on effectuera les tâches suivantes pour un projet VC++ : Placer winio.dll, winio.vxd et winio.sys dans le répertoire de l’exécutable du projet. Ajouter winio.lib aux fichiers du projet avec clic droit sur le nom du projet avec ajouter un fichier au projet. ajouter #include "winio.h" au fichier source. Initialiser Winio dans le fichier source par la ligne : bool _stdcall InitializeWinIo();. Utiliser les fonctions pour accéder aux entrées/sorties. Fermer Winio avec la commande : void _stdcall ShutdownWinIo();. Il faudra, avec un compte administrateur installer le driver correspondant avec la fonction : bool _stdcall InstallWinIoDriver(PSTR pszWinIoDriverPath,bool IsDemandLoaded); #njc Lycée « la Briquerie » Programmation C++ : le port // & page 4/4