Vous êtes sur la page 1sur 9

Labo 4 : Communication par le port parallèle

1- Objectifs du laboratoire Au terme de ce laboratoire, l’étudiant doit être capable de décrire les caractéristiques du port parallèle d’un ordinateur et de programmer ce port en langage C sous Windows XP.

2- Local et matériel utilisé

local 1-2

deux PC (611 et 6XX) avec Windows XP et le compilateur DevC++ ;

une carte d’extension du port parallèle permettant un accès facile aux lignes du connecteur DB25, un câble parallèle, des LEDs

une alimentation

3- Expériences

A. La carte d’extension du port parallèle

Identifier les différentes lignes d’entrée et sortie du port parallèle sur la carte d’extension qui vous a été fournie, et ce enfin de pouvoir l’utiliser correctement. Dessiner ci-dessous un schéma de cette carte.

Dessiner ci-dessous un schéma de cette carte. Les connecteurs en rouges sont inversés Numéro de Sens

Les connecteurs en rouges sont inversés

Numéro de

Sens des données

broches

1

Entrée/Sortie

2 -> 9

Entrée/Sortie

10

Entrée

11

Entrée

12

Entrée

13

Entrée

14

Entrée/Sortie

15

Entrée

16

Entrée/Sortie

17

Entrée/Sortie

Page 1 /9

B. Entrée/sortie via le registre des données du port LPT

En vous inspirant du programme fourni en annexe, écrire (et tester) les principales lignes d’un programme C qui permet de sortir, via le rigistre de données du port LPT, un nombre out de 8 bits, par exemple les valeurs successives d’un compteur. Ce nombre sera affiché sur 4 LEDs.

Utilisation de 4 LED’s uniquement.

affiché sur 4 LEDs. Utilisation de 4 LED’s uniquement.  Ecrire les principales lignes d’un programme

Ecrire les principales lignes d’un programme C qui permet de lire, via le registre de données du port LPT, un nombre de 8 bits provenant d’un dipswitch. Le résultat de la lecture sera affiché à l’écran.

for (i=0; i<=20; i++)

{

x = (inp32)(portdata); // on lit le port de données

sleep(1000);

printf("port read %04X= %04d\n" ,portdata, x);

sleep(1000);

}

Page 2 /9

C. Entrée via le registre d’état du port LPT

En vous inspirant du programme fourni en annexe, décrire les principales lignes d’un programme C qui permet de lire, via le registre du port LPT, un nombre de 5 bits provenant d’un dipswitch. Le résultat de la lecture sera affiché à l’écran. Attention : l’entrée BUSY est inversée. Inspirez-vous du programme fourni en annexe et qui se trouve sur C:\DATA

du programme fourni en annexe et qui se trouve sur C:\DATA //Entrée à partir du port

//Entrée à partir du port d'état (lignes 15 13 12 11 10)

for (i=0; i<=20; i++)

{

x = (inp32)(portetat)& 8; // on lit le port d'état ; le "&" sert a masquer la partie que l'on veut(soit l'afficher). attention aux lignes inversées

sleep(600);

printf("port read %04X= %04d\n" ,portetat, x);

sleep(600);

}

C. Entrée / sortie via le registre de contrôle du port LPT

Ecrire les principales lignes d’un programme C qui permet de vérifier le fonctionnement du port de contrôle en entrée puis en sortie. Attention : 3 lignes sur 4 sont inversées.

//Entrée à partir du port dez contrôle (lignes 1 14 16 17) for (i=0; i<=20; i++)

{

 

x

= (inp32)(portctrl); // on lit le port de contrôle // attention aux lignes inversées

sleep(1000);

printf("port read %04X= %04d\n" ,portctrl, x&1);

sleep(2000);

}

Page 3 /9

//Sortie sur le port de contrôle (lignes 1 14 16 17)

for (i=0; i<=15; i++)

{

}

(oup32)(portctrl,i);

sleep(1000);

printf("port write to 0x%X, datum=0x%2X\n" ,portctrl, i);

// on écrit dans le port de contrôle //attention aux lignes inversées

D.

Application : Contrôle d’un afficheur

L’idée est de commander un afficheur 7-segments via le registre de données. En fonction d’un code à 2 bits provenant d’un dipswitch relié au registre d’état, on effectue 4 fonctions différentes. Voici l’exemple :

Afficheurs 7-segments remplacé par un affichage à l’écran dans l’exécution du programme C

Entrée

Etat de l’affichage

00

« On a reçu 00 »

01

« On a reçu 01 »

10

« On a reçu 10 »

11

« On a reçu 11 »

10 « On a reçu 10 » 11 « On a reçu 11 » Ap rès

Après avoir testé le fonctionnement de l’afficheur, écrire ci-dessous les principales lignes du programme C qui a permis de tester ce circuit.

for (i=0;i<=50;i++)

{

int a,b;

a

= (inp32)(portetat)& 8;

b

= (inp32)(portetat)& 32;

//

A est le bit de poids le plus faible

if ((a == 0) && (b == 0))

{

printf("On a recu 00\n"); system("pause");

}

if ((a == 0) && (b == 32))

{

printf("On a recu 01\n"); system("pause");

}

if ((a == 8) && (b == 0))

{

printf("On a recu 10\n"); system("pause");

}

Page 4 /9

if ((a == 8) && (b == 32))

{

printf("On a recu 11\n"); system("pause");

}

}

4- Le port parallèle (LPT) de l’ordinateur

A. Le port parallèle (LPT) de l’ordinateur

Le port parallèle peut fonctionner selon différent modes. Décrire les principales caractéristiques de chaque mode du port parallèle, notamment le débit maximum permis.

Le mode SPP :

Le "Standard Parallel Port" est le protocole de base permettant l'envoi de données vers une imprimante. Le SPP est devenu capable d'envoyer et de recevoir. Il peut donc être bi- directionnel. On le retrouve alors sous des appellations "Bi-directionnal mode" ou simplement "SPP". La vitesse de transmission maximale que l'on peut espérer obtenir avec un tel port est de l'ordre de 150ko/s.

Le mode EPP (Enhanced Parallel Port) :

Il permet d'atteindre un débit de 2 Moctets/s, soit un débit environ treize fois supérieur au SPP. Le protocole EPP est lui explicitement bi-directionnel.

Le mode ECP (Extended Capacity Port) :

Le plus récent est l' (ECP). Il dérive du port EPP et en possède les mêmes caractéristiques, avec des possibilités supplémentaires :

-Il est "Plug and Play" (branchez et utilisez). -Il permet au périphérique de s'auto-identifier auprès de la machine dès le démarrage. Ainsi l'imprimante peut s'auto configurer lors du lancement du système d'exploitation (à condition que ce dernier et le BIOS soient eux aussi compatibles Plug and Play). -Il permet le Direct Memory Adress ( DMA ). Il est ainsi possible d'envoyer ou de recevoir des données sans avoir besoin du processeur. -Il comprime les données, selon une compression RLE (Run Length Encoding - compression des répétitions d'octets) au niveau matériel.

Page 5 /9

Vérifier, en lançant le BIOS, dans quel mode le port parallèle est configuré.

En mode ECP.

A l’aide du gestionnaire de périphériques de Windows, identifier les plages d’adresses attribuées à ce port.

Adresses du port LPT : 0378- 037F 0888- 0895

0778 - 077F en hexadécimal 1912 1919 en décimal

Plusieurs adresses sont attribuées à chaque port séries. A quoi correspondent ces adresses ? A chacune des broches du périphérique.

B. Le registre de données du port parallèle

Quelle est l’adresse du registre de données du port LPT ? 0x378

A quelle broche du connecteur DB25 correspond chaque bit de ce registre ? Dessiner un schéma montrant cette correspondance.

? Dessiner un schéma montrant cette correspondance. Les connecteurs verts correspondent aux connecteurs

Les connecteurs verts correspondent aux connecteurs d’entrées / sorties du registre de données. (Broches 2 à 9)

En mode ECP et EPP, le registre de données est bidirectionnel. Comment faites-vous dans ce cas pour programmer ce registre en :

entrée ? inp32(adresse du registre de données) sortie ? oup32(adresse du registre de données, valeur)

Quelle est l’instruction C qui permet d’envoyer le nombre n=65 (=’A’ = 1000001) à l’extérieur de l’ordinateur via le registre de données du port LPT ?

(oup32)(portdata,65) ; Avec portdata valant 0x378.

Quelle est l’instruction C qui permet de programmer le registre de données en entrée ?

(oup32)(portctrl,32);

Avec portctrl valant 0x37A.

Page 6 /9

Une fois que le registre de données a été programmé en entrée, quelle est alors l’instruction C qui permet de lire le contenu de ce registre et de le placer dans la variable data ?

int data ; data = (inp32)(portdata); Avec portdata valant 0x378.

C. Le registre d’état du port parallèle

Le registre d’état du port LPT est-il unidirectionnel ou bidirectionnel ?

Ce registre est unidirectionnel.

Quelle est l’adresse du registre d’état du port LPT ?

Ce port est disponible à l’adresse 0x37A.

A quelle broche du connecteur DB25 correspond chaque bit de ce registre ?

7 6 x x
7
6
x
x
5 4 x x
5
4
x
x
3 2 1 0 17 16 14 1
3
2
1
0
17
16
14
1

Quelle est l’instruction C qui permet de lire le contenu du registre d’état du port LPT et de placer ce contenu dans la variable etat_imprimante ?

int etat_imprimante ; etat_imprimante = (inp32)(portetat);

Quelle est l’instruction C qui lit le contenu du registre d’état et ne garde que les 5 bits significatifs (correspondants aux lignes Error, Select, PE, ACK, Busy) de ce registre ?

(inp32)(portetat+3);

Page 7 /9

Et si on veut garder seulement le bit Busy ?

(inp32)(portetat)& 128;

Lorsque l’ordinateur lit le registre d’état, il inverse le contenu de la ligne Busy. Comment faites-vous par programmation pour restituer la bonne valeur ? On peut la récupérer en utilisant les masques pour ne récupérer que la valeur voulue et l’inverser avec une opération logique telle que le XOR.

D. Le registre de contrôle du port parallèle

Le registre du port LPT est-il unidirectionnel ou bidirectionnel ?

Ce registre est bidirectionnel.

Quelle est l’adresse du registre de contrôle du port LPT ?

L’adresse de ce registre est 0x379.

A quelle broche du connecteur DB25 correspond chaque bit de ce registre ?

7 11
7
11
6 10
6
10
5 12
5
12
4 13
4
13
3 15
3
15
2 x
2
x
1 x
1
x
0 x
0
x

Quelle est l’instruction C qui permet d’envoyer à l’extérieur de l’ordinateur le nombre val = 11 = 1011 via le registre de contrôle du port LPT ?

(oup32)(portctrl,11);

Avec portctrl valant 0x37A.

Quelle est l’instruction C qui permet de lire le contenu du registre de contrôle et de placer le contenu dans la variable entree ?

int entree ; entree = (inp32)(portctrl); Avec portctrl valant 0x37A.

Page 8 /9

Quelle est l’instruction C qui lit le contenu du registre de contrôle et ne garde que les 4 bits significatifs (correspondant aux lignes Strobe, Auto Feed, Init, Slct in) de ce registre ?

(inp32)(portctrl) & 16; Avec portctrl valant 0x37A.

Et si on veut garder seulement le bit Init ?

(inp32)(portctrl) & 4;

Lorsque l’ordinateur lit le registre de contrôle, il inverse 3 lignes sur 4. Comment faites-vous par programmation pour restituer la bonne valeur ?

On peut la restituer en utilisant une opération logique telle que le XOR sur les bits inversés afin de les inverser.

Page 9 /9