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