Vous êtes sur la page 1sur 31

Royaume du Maroc

OFFICE DE LA FORMATION PROFESSIONNELLE ET DE LA PROMOTION DU TRAVAIL

Cours 13T
Langage C et Gestion des Entres/Sorties
Rsum de Thorie
Version prliminaire

Deuxime Anne
Programme de Formation des Techniciens
Spcialiss en lectronique
DIRECTION DE LA RECHERCHE ET INGENIERIE DE LA FORMATION
Septembre 1996

Rsum de Thorie

Langage C et Gestion des Entres/Sorties

TECCART INTERNATIONAL 2000 inc.


3155, rue Hochelaga,
Montral, Qubec (Canada)
H1W 1G4

RDACTION
Robert Pesant
DESSINS ET CONCEPTION GRAPHIQUE
Robert Pesant
RVISION TECHNIQUE
Robert Pesant
RVISION LINGUISTIQUE
Franois Gaudreau

COMMISSION DE VALIDATION
Formateurs de lOFPPT

Les droits de reproduction et de diffusion de ce document sont cds par Teccart


International 2000 inc. lOffice de la Formation Professionnelle et de la Promotion du
Travail du Royaume du Maroc, pour sa propre utilisation au Maroc.
Mis part lOFPPT, toute reproduction, en tout ou en partie, par quelque procd que ce
soit, est interdite.

Imprim Montral, le j May


270864296.doc

Cartes d'entres/sorties

Page 2

OFPPT/TECCART

Rsum de Thorie

Langage C et Gestion des Entres/Sorties

TABLE DES MATIRES


10. CARTES DENTRES/SORTIES
010.1 Introduction
110.2 Carte dentres/sorties analogiques ESA1
010.2.1 Description de la carte ESA1...................................................................................
110.2.2 Essai de la carte ESA1.............................................................................................
210.2.3 Fonctions de la bibliothque ESA1_UTL.LIB...........................................................
310.2.4 Programmation de la carte ESA1.............................................................................
210.3 Carte dentres/sorties numriques ESN1
410.3.1 Description de la carte ESN1...................................................................................
510.3.2 Essai de la carte ESN1 branche sur un port LPT...................................................
610.3.3 Fonctions de la bibliothque ESN1LUTL.LIB..........................................................
710.3.4 Programmation de la carte ESN1 branche sur port LPT........................................
810.3.5 Essai de la carte ESN1 branche sur le port PPI......................................................
910.3.6 Fonctions de la bibliothque ESN1PUTL.LIB..........................................................
1010.3.7 Programmation de la carte ESN1 branche sur port PPI.......................................

Cartes d'entres/sorties

Page 3

OFPPT/TECCART

Cartes dentres/sorties
Introduction
En industrie, l'ordinateur est de plus en plus utilis pour faire l'acquisition et le traitement des
donnes l'aide de cartes d'interface plus performantes les unes que les autres. Dans certains
domaines, l'ordinateur peut mme remplacer les automates programmables et les rgulateurs de
procd pour faire le contrle.
Dans ce chapitre, nous vous proposons ltude de deux cartes dinterface: la premire est la carte
dentres/sorties analogiques ESA1, la seconde, la carte dentres/sorties numriques ESN1.

Carte dentres/sorties analogiques ESA1


Description de la carte ESA1
La carte ESA1 est une carte dinterface externe. Elle se branche sur le port parallle LPT1 (ou
LPT2) laide dun cble dimprimante (attention, certains cbles dimprimante ne fonctionnent
pas car certains fils ont t omis). Lalimentation requise est de 12,6 VAC, 1 Amp minimum.
Reportez-vous au schma de principe de la Figure 10 -1.
+5V

Carte ESA1

SIMUL0

250 R

L
P
T
1

+5V

o
u

EA0+

A/N
EA0-

8 bits

4-20 mA
8 bits

N/A
SA0G

EA0G

SIMUL1
EA1+

A/N
EA1-

8 bits

L
P
T
2

R
E
G
I
S
T
R
E

AFFICHEUR
BARRE

250 R

EA1G
F I G U R E 10- 1: S C H M A

SA0+

D E P R I N C IP E D E L A C AR T E

E S A1

ESA1 est dote de deux entres analogiques diffrentielles 1-5 Volts, EA0 et EA1, non isoles
mais flottantes pour permettre la lecture de signaux aux bornes de composants ou d'instruments
qui ne sont pas relis au point commun. Par exemple, pour utiliser EA0, il est recommand de
relier le point commun analogique EA0G au point commun du circuit qui fournit le signal
mesurer. Puis, avec EA0+ et EA0-, on peut lire la diffrence de tension aux bornes du composant
ou de l'instrument. Le code hexadcimal de sortie du convertisseur analogique/numrique 8 bits
sera $00 pour une tension de 1 Volt entre EA0+ et EA0-; ce code passera la valeur maximale
$FF pour une diffrence de potentiel de 5 Volts entre EA0+ et EA0-. Si le composant ou
l'instrument est branch au point commun, on peut relier EA0- EA0G pour lire le signal avec
EA0+.
Pour convertir un signal standard 4-20 mA en une tension standard 1-5 Volts, on doit brancher
une rsistance de prcision de 250 entre EA0+ et EA0-. Cette rsistance est dj installe sur
la carte ESA1 et peut tre mise en circuit en dplaant le cavalier associ de la position 1-5V la
position 4-20MA.
Lentre EA1 se configure de la mme manire que lentre EA0.
Pour vrifier leur fonctionnement, chaque entre possde un potentiomtre de simulation qui
fournit une tension comprise entre 0 V et 5 V. Pour lutiliser, il suffit, dans le cas de EA0, de
placer le cavalier en position 1-5V et de relier respectivement EA0- EA0G et SIMUL0
EA0+.
La carte ESA1 peut transmettre un signal analogique de contrle par sa sortie SA0. Son
convertisseur numrique/analogique de 8 bits gnre une tension qui est convertie par un
transmetteur de courant 4-20 mA. Les codes $00 et $FF correspondent respectivement des
courants de 4 mA et de 20 mA.
Pour vrifier le fonctionnement de SA0, on doit brancher un ampremtre au bornier sortie pour
lire le courant. De plus, un afficheur barre permet de visualiser le code hexadcimal du
convertisseur N/A.
Pour obtenir de plus amples informations sur cette carte dinterface, le lecteur est pri de
consulter le document Carte dentres/sorties analogiques ESA1, Guide dutilisation.
Essai de la carte ESA1
Avant de rdiger un programme dapplication utilisant la carte ESA1, vous devez vrifier son
fonctionnement. Pour ce faire, vous devez
1.
relier la carte ESA1 au port LPT1 (ou LPT2) de lordinateur avec le cble dimprimante
livr avec celle-ci,
2.
alimenter la carte ESA1 et lordinateur,
3.
excuter le programme de test ESA1_TST.EXE, disponible dans le rpertoire
CHAP.010\ESA1_TST de la disquette d'accompagnement COURS_13T,
4.
lire les directives prsentes l'cran,
5.
slectionner, si ncessaire, le port parallle auquel est relie la carte ESA1,
6.
dplacer le curseur des potentiomtres de simulation SIMUL0 et SIMUL1,
7.
vrifier que le code et le signal de chaque entre apparaissent lcran,
8.
vrifier, avec un ampremtre et lafficheur barre, que le signal de EA0 est retransmis
correctement par SA0.

La Figure 10 -2 montre ce que vous obtiendrez lcran lexcution de ESA1_TST.EXE.

F I G U R E 10- 2: E X C U T I O N

DE

E S A1_ TS T.E X E

Fonctions de la bibliothque ESA1_UTL.LIB


Pour faciliter l'utilisation de la carte ESA1, toutes les fonctions ncessaires ont t runies dans le
fichier bibliothque ESA1_UTL.LIB du rpertoire BANQUE\ESA1 de la disquette
d'accompagnement COURS_13T. Pour les utiliser, on doit ajouter ce fichier dans le projet de
l'application, avec les fichiers sources xxx.C. Le Tableau 10 -1 prsente les trois fonctions de
cette bibliothque.
T AB L E AU 10- 1: L E S
Fonction
read_adc()
write_dac()
ini_imprimante()

F O N C T I ON S D E L A B I B L I O T H Q U E

E S A1 _U T L . L I B

Description
Lecture d'un octet correspondant la tension 1-5 Volts applique lentre analogique
slectionne de la carte d'entre/sortie ESA1.
Ecriture d'un octet sur la sortie analogique de la carte d'entre/sortie ESA1 et transmission
du signal 4-20mA correspondant.
Initialisation des lignes de contrle du port LPT spcifi pour utiliser une imprimante
sans rinitialiser l'ordinateur. Cette fonction doit tre appele la fin du programme
dapplication, avant la sortie au DOS.

Les dclarations de ces fonctions ainsi que les constantes symboliques pertinentes ont t runies
dans le fichier d'en-tte ESA1_UTL.H, qui se trouve dans le mme rpertoire.
Avec un fichier bibliothque, le fichier source nest en gnral pas disponible. Toutefois, pour des
raisons didactiques, nous lavons fourni dans le cadre de ce cours. Ce fichier se nomme
ESA1_UTL.C Pour acqurir de bonnes habitudes de programmation, il est fortement
recommand de ne pas lutilis dans les programmes dapplications. Attention! Si vous modifiez
le fichier source ESA1_UTL.C, vous risquez dendommager la carte ESA1 et/ou lordinateur.
Voici le fichier den-tte ESA1_UTL.H ainsi que la description complte des fonctions de
ESA1_UTL.LIB, telle quelles auraient t prsentes si le fichier source navait pas t dvoil.

Le fichier d'en-tte ESA1_UTL.H


/* Fich. d'en-tte:
* ===============
*
* Auteur:
* Date:
* Rvision:
* Version:
*
* Volume:
* Fichier:
*
* Description:
*
*
*
*
*
*
*/

ESA1_UTL.H
==========
Robert Pesant
25/11/1995
25/11/1995
V1.0
C_13T_PRG
\BANQUE\ESA1\ESA1_UTL.H
Fichier d'en-tte pour les fonctions utilitaires de la
bibliothque ESA1_UTL.LIB pour la carte d'entres/sorties
analogiques ESA1 branche sur un port LPT:
1. read_adc() .......: lecture du signal d'entre.
2. write_dac() ......: transmission d'un signal de sortie.
3. ini_imprimante() .: initialisation du port LPT aprs
avoir utilis la carte ESA1.

/***************************************************************************/
/* Constantes symboliques tre utilises comme paramtres pour lpt_id.
*/
/*-------------------------------------------------------------------------*/
#define LPT1
1
#define LPT2
2
/*-------------------------------------------------------------------------*/
/***************************************************************************/
/* Constantes symboliques tre utilises comme paramtres pour ea_id.
*/
/*-------------------------------------------------------------------------*/
#define EA0
0
#define EA1
1
/*-------------------------------------------------------------------------*/
/***************************************************************************/
/* Dclaration des fonctions.
*/
/*-------------------------------------------------------------------------*/
unsigned char
read_adc
(int ea_id, int lpt_id);
void
write_dac
(unsigned char data, int lpt_id);
void
ini_imprimante (int lpt_id);
/*-------------------------------------------------------------------------*/

La bibliothque ESA1_UTL.LIB

read_adc()
Dclaration:

unsigned char read_adc(int ea_id, int lpt_id);

Fichier d'en-tte:

"esa1_utl.h"

Description:

Lecture d'un octet correspondant la tension 1-5 Volts applique lentre analogique
slectionne de la carte d'entre/sortie ESA1.
Si les paramtres ne sont pas valides, choisit LPT1 et/ou EA0 par dfaut.

Paramtres:

1. Le numro de l'entre analogique: EA0 ou EA1 (0 ou 1).


2. Le numro du port LPT: LPT1 ou LPT2 (1 ou 2).

Valeur retourne:

1. Le code hexa ($00-$FF) quivalent la tension analogique 1-5V.

Exemple:
#include <conio.h>
#include <dos.h>
#include "esa1_utl.h"
void main(void)
{
unsigned char data;
clrscr();
gotoxy(1, 1); cputs("Code hexa lu sur EA0: $");
gotoxy(1, 3); cputs("Une touche pour quitter...");
do

{
data = read_adc(EA0, LPT1);
gotoxy(24, 1); cprintf("%02X", data);
delay(50);
}
while(!kbhit());

getch();
clrscr();
ini_imprimante(LPT1);

write_dac()
Dclaration:

void write_dac(unsigned char data, int lpt_id);

Fichier d'en-tte:

"esa1_utl.h"

Description:

Ecriture d'un octet sur la sortie analogique de la carte d'entre/sortie ESA1.


Transmission du signal 4-20mA correspondant.
Si le paramtre nest pas valide, choisit LPT1 par dfaut.

Paramtres:

1. Le code hexa ($00-$FF) convertir en courant 4-20mA.


2. Le numro du port LPT: LPT1 ou LPT2 (1 ou 2).

Valeur retourne:

1. Aucune.

Exemple:
#include <conio.h>
#include <stdlib.h>
#include "esa1_utl.h"
#define ESC

27

void main(void)
{
unsigned char data = 0x00;
int touche;
clrscr();
gotoxy(1, 1); cputs("Changer le code hexa transmis par SA0 ..: < 1 >");
gotoxy(1, 2); cputs("Quitter ................................: <Esc>");
gotoxy(1, 3); cputs("Votre choix ............................: < * >");
gotoxy(1, 5); cputs("Code hexa transmis par SA0: $");
cprintf("%02X", data);
write_dac(data, LPT1);
gotoxy(45, 3);

do

{
touche = getch();
switch(touche)
{
case '1':
gotoxy(30, 5); cscanf("%X", &data); getch();
gotoxy(45, 3);
write_dac(data, LPT1);
break;
case ESC:
clrscr();
ini_imprimante(LPT1);
exit(0);
}
}
while(1);

ini_imprimante()
Dclaration:

void ini_imprimante(int lpt_id);

Fichier d'en-tte:

"esa1_utl.h"

Description:

Initialisation des lignes de contrle du port LPT spcifi pour utiliser une imprimante
sans rinitialiser l'ordinateur. Cette fonction doit tre appele la fin du programme
dapplication, avant la sortie au DOS.
Si le paramtre nest pas valide, choisit LPT1 par dfaut.

Paramtres:

1. Le numro du port LPT: LPT1 ou LPT2 (1 ou 2).

Valeur retourne:

1. Aucune.

Exemple:

Voir les exemples des fonctions read_adc() et write_dac().

Programmation de la carte ESA1


Le Tableau 10 -2 prsente les trois programmes dutilisation de la carte ESA1 qui se trouvent
sur la disquette daccompagnement COURS_13T.
T AB L E AU 1 0-2: L E S
Programme
LIRE_EA.C
ECRIR_SA.C
ESA1_TST.C

Rpertoire
\CHAP.010\LIRE_EA
\CHAP.010\ECRIR_SA
\CHAP.010\ESA1_TST

P R O G R AM M E S D E T E S T D E L A C AR T E

E S A1

Description
Programme de test des entres EA0 et EA1 de la carte ESA1.
Programme de test de la sortie SA0 de la carte ESA1.
Programme de test de la carte ESA1.

Lanalyse de LIRE_EA.C et de ECRIR_SA.C est laisse la discrtion du lecteur. Nous allons


concentrer notre tude sur le programme ESA1_TST.C, synthse des deux programmes
prcdents.
Le listage de ESA1_TST.C dbute la page suivante. Prenez-en connaissance et identifiez
9.
les fichiers qui doivent tre runis en projet pour obtenir le programme excutable
10. ainsi que le modle de programme sur lequel cette application a t conue.

/* Programme:
* =========
*
* Auteur:
* Date:
* Rvision:
* Version:
*
* Volume:
* Fichier:
*
* Description:
*
*
*
* Projet:
*
*
*
*
*
*/
#include
#include
#include
#include
#include
#include
#include

ESA1_TST.C
==========
Robert Pesant
23/03/1996
23/03/1996
V1.0
COURS_13T
\CHAP.010\ESA1_TST\ESA1_TST.C
Fichier source principal du projet ESA1_TST.PRJ
Programme de test de la carte analogique ESA1.
Prsentation en mode texte.
ESA1_TST.PRJ se compose de:
-------------------------ESA1_TST.C
CURS_UTL.C
DIVR_UTL.C
ESA1_UTL.LIB

<conio.h>
<process.h>
<ctype.h>
<dos.h>
"curs_utl.h"
"esa1_utl.h"
"divr_utl.h"

#define ESC
#define PORT_LPT1
#define PORT_LPT2

27
'1'
'2'

void menu(void);
void main(void)
{
int choix, lpt = LPT1;
unsigned char data_ea0=0, data_ea1;
double courant, tension_ea0, tension_ea1;
cursoff();
textbackground(BLUE);
clrscr();
menu();
textcolor(WHITE);
gotoxy(18,10); cprintf("LPT1");
do
{
do
{
/* Lecture de l'entre analogique EA0 */
data_ea0 = read_adc(EA0, lpt);
tension_ea0 = (data_ea0/255.0)*4.0 + 1.0;
gotoxy(64, 6); cprintf("$%02X, %5.2f V", data_ea0, tension_ea0);
/* Lecture de l'entre analogique EA1 */
data_ea1 = read_adc(EA1, lpt);
tension_ea1 = (data_ea1/255.0)*4.0 + 1.0;
gotoxy(64, 7); cprintf("$%02X, %5.2f V", data_ea1, tension_ea1);
/* Retransmission du signal de EA0 par la sortie analogique SA0 */
write_dac(data_ea0, lpt);
courant = (data_ea0/255.0)*16.0 + 4.0;
gotoxy(64,11); cprintf("$%02X, %5.2f mA", data_ea0, courant);
}
while(!kbhit());
choix = getch();

switch(choix)
{
case ESC:
textbackground(BLACK); textcolor(LIGHTGRAY);
/* Ajuste les lignes de contrle des ports LPT1 et LPT2
pour pouvoir utiliser l'imprimante sans rinitialiser
l'ordinateur. */
ini_imprimante(LPT1); ini_imprimante(LPT2);
curson(); clrscr(); exit(0);
case PORT_LPT1:
lpt = LPT1;
gotoxy(18,10); cprintf("LPT1");
beebop(300,350,100);
break;
case PORT_LPT2:
lpt = LPT2;
gotoxy(18,10); cprintf("LPT2");
beebop(350,400,100);
}
}
while(1);

/* Fonction:
* ========
*
* Description:
*
*
* Paramtres:
*
* Valeur/retour:
*/

menu()
======

#define
#define
#define
#define
#define
#define
#define
#define
#define
#define

MENU_1
MENU_2
MENU_3
MENU_4
MENU_5
MENU_6
MENU_7
MENU_8
MENU_9
MENU_10

"Test de la carte analogique ESA1"


"================================"
"Menu:"
"===="
"Directives:"
"=========="
"Test des entres analogiques:"
"============================"
"Test de la sortie analogique:"
"============================"

#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define

MENU_11
MENU_12
MENU_13
MENU_14
MENU_15
MENU_16
MENU_17
MENU_18
MENU_19
MENU_20
MENU_21
MENU_22
MENU_23
MENU_24
MENU_25
MENU_26

"Test sur LPT1 .. < 1 >"


"Test sur LPT2 .. < 2 >"
"Quitter ........ <Esc>"
"Votre choix ...:"
"1. Test des entres analogiques:"
"
- Cout-circuitez les paires d'entres suivantes: EA0- et GND,"
"
EA0+ et SIMUL0, EA1- et GND, ainsi que EA1+ et SIMUL1."
"
- A l'aide des cavaliers, rglez les entres pour des signaux 1-5 V."
"
- Utilisez les pot. SIMUL0 et SIMUL1 pour gnrer les signaux 1-5 V."
"2. Test de la sortie analogique:"
"
- Le signal de l'entre EA0 est retransmis par la sortie SA0."
"
- Observez la valeur de l'octet transmis sur l'afficheur barre."
"
- Vrifiez le signal 4-20 mA correspondant avec un ampremtre."
"Signal analogique lu par EA0 ..:"
"Signal analogique lu par EA1 ..:"
"Signal retransmis de EA0 SA0 :"

Affiche le menu du programme de test en mode texte


de la carte d'entre/sortie analogique ESA1.
1. Aucun
1. Aucune

void menu(void)
{
textcolor(YELLOW);
gotoxy( 1, 1); cputs(MENU_1 );
gotoxy( 1, 2); cputs(MENU_2 );
gotoxy( 1, 4); cputs(MENU_3 );
gotoxy( 1, 5); cputs(MENU_4 );
gotoxy( 1,13); cputs(MENU_5 );
gotoxy( 1,14); cputs(MENU_6 );
gotoxy(31, 4); cputs(MENU_7 );
gotoxy(31, 5); cputs(MENU_8 );
gotoxy(31, 9); cputs(MENU_9 );
gotoxy(31,10); cputs(MENU_10);

textcolor(LIGHTGREEN);
gotoxy( 1, 6); cputs(MENU_11);
gotoxy( 1, 7); cputs(MENU_12);
gotoxy( 1, 8); cputs(MENU_13);
gotoxy( 1,10); cputs(MENU_14);
gotoxy( 1,15); cputs(MENU_15);
gotoxy( 1,16); cputs(MENU_16);
gotoxy( 1,17); cputs(MENU_17);
gotoxy( 1,18); cputs(MENU_18);
gotoxy( 1,19); cputs(MENU_19);
gotoxy( 1,21); cputs(MENU_20);
gotoxy( 1,22); cputs(MENU_21);
gotoxy( 1,23); cputs(MENU_22);
gotoxy( 1,24); cputs(MENU_23);
gotoxy(31, 6); cputs(MENU_24);
gotoxy(31, 7); cputs(MENU_25);
gotoxy(31,11); cputs(MENU_26);

Le projet ESA1_TST.PRJ runit les fichiers suivants:


11. ESA1_TST.C,
12. CURS_UTL.C,
13. DIVR_UTL.C,
14. ESA1_UTL.LIB.
Ce programme est bas sur le modle #2, cest--dire le modle de programme qui
15. excute une tche rptitive,
16. surveille priodiquement le clavier,
17. traite la demande de lutilisateur
18. et reprend par la suite la tche en cours.
Le choix de ce modle est vident. On ne veut pas lire une donne et le retransmettre une seule
fois. On veut plutt effectuer ces deux oprations de faon rptitive pour effectuer une mise
jour continuelle des signaux analogiques.
La boucle do...while() de la tche rptitive ne contient que trois instructions pour accomplir
lacquisition et la transmission de donnes. Il sagit des deux instructions de lecture des entres
analogiques EA0 et EA1 et dune instruction dcriture sur la sortie analogique SA0:
19. data_ea0 = read_adc(EA0, lpt);
20. data_ea1 = read_adc(EA1, lpt);
21. write_dac(data_ea0, lpt);
Pour la lecture dune entre, les paramtres passs la fonction read_adc() sont, dans lordre,
22. lentre que lon veut lire
23. et le port LPT auquel est relie la carte ESA1.
La valeur retourne par cette fonction est un code hexadcimal de 8 bits correspondant
lamplitude du signal analogique appliqu lentre. Il faut donc rcuprer cette valeur dans une
variable de type unsigned char.
Pour lcriture sur lunique sortie de la carte, les paramtres passs la fonction write_dac()
sont, dans lordre,
24. le code de 8 bits transmettre
25. et le port LPT auquel est relie la carte ESA1.
Le programme offre trois choix lutilisateur:
26. choisir le port LPT1, si la carte est branche sur celui-ci,
27. choisir le port LPT2, si la carte est branche sur celui-ci,
28. quitter.
Dans ce dernier cas, il est important dinitialiser le port LPT utilis pour pouvoir faire
fonctionner une imprimante sans tre oblig de redmarrer lordinateur. Comme, priori, on ne

sait pas lequel de LPT1 ou LPT2 sera utilis, la sortie au DOS seffectue en excutant les deux
instructions suivantes:
29. ini_imprimante(LPT1);
30. ini_imprimante(LPT2);
En conclusion, la programmation dune carte dinterface est un exercice simple si on sait utiliser
la bonne fonction et matriser la technique de passage des paramtres par les valeurs.

Carte dentres/sorties numriques ESN1


Description de la carte ESN1
La carte ESN1 est une carte dinterface externe. Elle se branche sur un port parallle, LPT1 ou
LPT2, ou sur le port PPI de la carte PPI-PIT. Un cble RS-232C (avec les connecteurs DB25)est livr avec cette carte pour raliser le branchement avec lordinateur. Lalimentation requise
est de 12,6 VAC, 1 Amp minimum.
Reportez-vous au schma de principe de la Figure 10 -3.
EN7

T
A
M
P
O
N

8x
8 bits

EN0

8x

8 bits

L
P
T
o
u

ACTIVATION
DES ENTRES
AFFICHEUR
BARRE

SIMULATEUR
D'ENTRES

+VCC

E-INT

8 bits

T
A
M
P
O
N

SN7

8 bits

P
P
I

SN0

AFFICHEUR
BARRE

L
P
T

AFFICHEUR
7 SEGMENTS

PC7

8 bits

P
P
I

Carte ESN1

PC0

1. Entre numrique de 8 bits (LPT/PPI):...............EN0-EN7


2. Sortie numrique de 8 bits (LPT/PPI):.................SN0-SN7
3. Entre dinterruption (LPT):......................................E-INT
4. Port bidirectionnel de 8 bits (PPI):........................PC0-PC7
F I G U R E 1 0-3: S C H M A D E P R I N C I P E D E L A C AR T E E S N1

Cette carte possde huit entres numriques TTL: niveau 0 = 0 Volt, niveau 1 = 5 Volts. Elles
servent lire l'tat d'interrupteurs et/ou de capteurs tout-ou-rien (ON/OFF), dont on aura adapt
au pralable les signaux de sortie des niveaux compatibles TTL. Lutilisateur a le choix
dappliquer les signaux numriques dentre sur lun ou lautre des deux connecteurs en range
double. Le connecteur mle sert interfacer un module numrique ou un circuit prototype via le
cble plat livr avec la carte. Le connecteur femelle sert appliquer un nombre restreint de
signaux numriques ou mesurer les niveaux de tensions sur les entres via des bouts de fil #22.
Pour vrifier le fonctionnement des entres numriques, ESN1 possde un afficheur barre et un
interrupteur DIP 10 positions, S1, servant de simulateur dentre. Les positions 1 8 de S1
correspondent aux bits EN0 EN7. Ces interrupteurs et les sorties du boitier non-inverseur
dentre forment des portes ET-CBL. Pour cette configuration, le niveau logique 0 est
prioritaire. En consquence, assurez-vous de placer tous les interrupteurs au niveau logique 1
lorsque vous nutilisez pas le simulateur. Alors que la position 9 de S1 nest pas utilis, la position
10 de S1 joue un rle primordial: elle sert viter les conflits de bus entre ESN1 et le port LPT
ou le port PPI. Cet interrupteur doit tre plac en position Entres inactives avant de relier la
carte ESN1 lordinateur avec la cble dinterface. Il doit tre ramen en position Entres
actives seulement aprs avoir dmarr le programme dapplication. On verra plus loin que la
premire fonction appele par ce programme doit tre celle qui initialise correctement le port
utilis.
Les sorties numriques TTL, au nombre de huit, sont regroups avec les entres sur la mme
paire de connecteurs mle/femelle. Le rle de ces sorties est de mettre en marche des actuateurs
fonctionnant en tout-ou-rien (ON/OFF): indicateurs lumineux, moteurs de ventilateurs, alarmes
sonores, moteurs de convoyeurs, pompes, etc. Pour convertir les signaux TTL en signaux de
puissance, il faut ajouter une interface relais ou optocoupleurs (optotriacs, optotransistors,
etc.).
La vrification des sorties numunriques est possible grce un simulateur de sortie constitu
dun afficheur barre pour montrer le code binaire et dun afficheur 7 segments pour montrer le
code hexadcimal quivalent.
La configuration des connecteurs a t choisie pour faciliter le branchement entre deux cartes
ESN1. Ainsi, deux cartes disposes face face peuvent tre relies directement avec un cble plat
connecteurs enfichables de 26 broches. Les entres numriques EN0 EN7 de la carte A seront
branches dans l'ordre aux sorties numriques SN0 SN7 de la carte B, et vice versa.
Les entre/sorties numriques, que lon vient de dcrire, peuvent tre traites autant par le port
LPT que par le port PPI.
Lorsque la carte ESN1 est relie un port LPT, il est possible de gnrer une interruption
matrielle par lentre numrique E-INT disponible galement sur les connecteurs ES/N. La carte
ESN1 possde une diode lectroluminescente pour tmoigner de lactivit sur cette ligne. (Le
traitement des interruptions est un thme qui ne sera pas trait dans le cours sur le langage C.)
Lorsque la carte ESN1 est relie au port PPI, une autre paire de connecteurs en range double,
mle et femelle, permet un branchement direct avec le port PC de la carte PPI-PIT. Ce port peut
tre programm soit en entre, soit en sortie.
Pour obtenir de plus amples informations sur cette carte dinterface, le lecteur est pri de
consulter le document Carte dentres/sorties numriques ESN1, Guide dutilisation.

Essai de la carte ESN1 branche sur un port LPT


Avant de rdiger un programme dapplication utilisant la carte ESN1 branche sur un port LPT,
vous devez vrifier son fonctionnement. Pour ce faire, vous devez
31. placer linterrupteur /G (#10) de S1 en position Entres inactives,
32. relier la carte ESN1 au port LPT1 (ou LPT2) de lordinateur avec le cble RS-232C livr
avec celle-ci,
33. alimenter la carte ESN1 et lordinateur,
34. excuter le programme de test ESN1LTST.EXE, disponible dans le rpertoire
CHAP.010\ESN1_TST de la disquette d'accompagnement COURS_13T,
35. placer linterrupteur /G (#10) de S1 en position Entres actives,
36. lire les directives prsentes l'cran,
37. slectionner, si ncessaire, le port parallle auquel est relie la carte ESA1,
38. utiliser le simulateur dentre pour gnrer diffrents codes binaires,
39. vrifier que le code apparat l'cran et sur les afficheurs de sortie,
40. vrifier, avec un voltmtre ou une sonde logique, que le code est prsent sur les broches
des connecteurs de sortie.
La Figure 10 -4 montre ce que vous obtiendrez lcran lexcution de ESN1LTST.EXE.

F I G U R E 10- 4: E X C U T I O N

DE

E S N1 LTS T.E X E

Fonctions de la bibliothque ESN1LUTL.LIB


Pour faciliter l'utilisation de la carte ESN1 branche sur un port LPT, toutes les fonctions
ncessaires ont t runies dans le fichier bibliothque ESN1LUTL.LIB du rpertoire
BANQUE\ESN1 de la disquette d'accompagnement COURS_13T. Pour les utiliser, on doit
ajouter ce fichier dans le projet de l'application, avec les fichiers sources xxx.C. Le Tableau 10 -3
prsente les quatre fonctions de cette bibliothque.
T AB L E AU 10- 3: L E S
Fonction
read_bin()
write_bin()
ini_lpt()

ini_imprimante()

F O N C T I ON S D E L A B I B L I O T H Q U E

E S N1 LU T L . L I B

Description
Lecture des 8 bits (EN0 EN7) de lentre numrique de la carte d'entre/sortie ESN1
branche sur un port LPT.
Ecriture des 8 bits (SN0 SN7) de la sortie numrique de la carte d'entre/sortie ESN1
branche sur un port LPT.
Initialisation des lignes de contrle du port LPT spcifi pour utiliser le registre de
contrle en entre. Cette fonction doit tre appele au tout dbut du programme
dapplication. Lorsquelle est excute, linterrupteur #10 de S1 peut tre plac en
position Entres actives.
Initialisation des lignes de contrle du port LPT spcifi pour utiliser une imprimante
sans rinitialiser l'ordinateur. Cette fonction doit tre appele la fin du programme
dapplication, avant la sortie au DOS.

Les dclarations de ces fonctions ainsi que les constantes symboliques pertinentes ont t runies
dans le fichier d'en-tte ESN1LUTL.H, qui se trouve dans le mme rpertoire.
Avec un fichier bibliothque, le fichier source nest en gnral pas disponible. Toutefois, pour des
raisons didactiques, nous lavons fourni dans le cadre de ce cours. Ce fichier se nomme
ESN1LUTL.C Pour acqurir de bonnes habitudes de programmation, il est fortement
recommand de ne pas lutilis dans les programmes dapplications. Attention! Si vous modifiez
le fichier source ESN1LUTL.C, vous risquez dendommager la carte ESN1 et/ou lordinateur.
Voici le fichier den-tte ESN1LUTL.H ainsi que la description complte des fonctions de
ESN1LUTL.LIB, telle quelles auraient t prsentes si le fichier source navait pas t dvoil.

Le fichier d'en-tte ESN1LUTL.H


/*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*

Fich. d'en-tte: ESN1LUTL.H


=============== ==========
Auteur:
Date:
Rvision:
Version:

Robert Pesant
28/01/1996
28/01/1996
V1.0

Volume:
Fichier:

C_13T_PRG
\BANQUE\ESN1\ESN1LUTL.H

Description:

Fichier d'en-tte pour les fonctions utilitaires de la


bibliothque ESN1LUTL.LIB pour la carte d'entres/sorties
numriques ESN1 branche sur un port LPT:
1. ini_lpt() ........: initialisation du port LPT avant
d'utiliser la carte ESN1.
2. read_bin() .......: lecture de l'octet d'entre.
2. write_bin() ......: transmission de l'octet de sortie.
3. ini_imprimante() .: initialisation du port LPT aprs
avoir utilis la carte ESN1.
Les registres des ports LPT:
----------------------------

Registre de donne (Printer Data Latch)


--------------------------------------LPT1: 0x0378
LPT2: 0x0278
Ecriture: transmission d'un octet l'imprimante.
Lecture: vrification du dernier octet transmis (... et non
rception d'un octet venant d'un circuit externe).
+ 7 - 6 - 5 - 4 - 3 - 2 - 1 - 0 +
X X X X X X X X
+-------------------------------+

+-

+-----

+---------

+-------------

+-----------------

+---------------------
+-------------------------+------------------------------

DB25
---(02)
(03)
(04)
(05)
(06)
(07)
(08)
(09)

DATA
DATA
DATA
DATA
DATA
DATA
DATA
DATA

0
1
2
3
4
5
6
7

Registre d'tat (Printer Status)


-------------------------------LPT1: 0x0379
LPT2: 0x0279
Lecture seulement: tat de l'imprimante.
+ 7 - 6 - 5 - 4 - 3 - 2 - 1 - 0 +
X X X X X 0 0 0
+-------------------------------+

+-------------

+-----------------

+---------------------
+-------------------------+------------------------------

DB25
---(15)
(13)
(12)
(10)
(11)

ERROR:
SLCT :
PE
:
ACK :
BUSY :

indique une erreur


prte recevoir
plus de papier
prte pour un octet
occup ou hors ligne

(bit
(bit
(bit
(bit
(bit

non-invers)
non-invers)
non-invers)
non-invers)
invers)

*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*/

Registre de contrle (Printer Control)


-------------------------------------LPT1: 0x037A
LPT2: 0x027A
Ecriture: transmission des signaux de contrle
l'imprimante.
Lecture: vrification des signaux de contrle transmis (...
sous certaines conditions, les signaux venant d'un
circuit externe peuvent tre lus!).
+ 7 - 6 - 5 - 4 - 3 - 2 - 1 - 0 +
0 0 0 X X X X X
+-------------------------------+

+-

+-----

+---------
+-------------+------------------

DB25
---(01)
(14)
(16)
(17)
----

STROBE
:
AUTO LF
:
INIT
:
SLCT IN
:
IRQ Enable:

fait lire un octet (bit invers)


impose LF aprs CR (bit invers)
rinitialisation
(bit non-invers)
met en ligne
(bit invers)
indique qu'une interruption matrielle
sera provoque lorsque ACK passera 0.
(LPT1 = IRQ 7, INT 0Fh)
(LPT2 = IRQ 5, INT 0Dh)

/***************************************************************************/
/* Constantes symboliques tre utilises comme paramtres pour lpt_id.
*/
/*-------------------------------------------------------------------------*/
#define LPT1
1
#define LPT2
2
/*-------------------------------------------------------------------------*/
/***************************************************************************/
/* Dclaration des fonctions.
*/
/*-------------------------------------------------------------------------*/
void
ini_lpt
(int lpt_id);
unsigned char
read_bin
(int lpt_id);
void
write_bin
(unsigned char data, int lpt_id);
void
ini_imprimante (int lpt_id);
/*-------------------------------------------------------------------------*/

La bibliothque ESN1LUTL.LIB

read_bin()
Dclaration:

unsigned char read_bin(int lpt_id);

Fichier d'en-tte:

"esn1lutl.h"

Description:

Lecture dun octet sur lentre numrique de la carte d'entre/sortie ESN1.


Si le paramtre nest pas valide, LPT1 est le choix par dfaut.

Paramtres:

1. Le numro du port LPT: LPT1 ou LPT2 (1 ou 2).

Valeur retourne:

1. Le code hexa ($00-$FF) lu.

Exemple:
#include <conio.h>
#include <dos.h>
#include "esn1lutl.h"
void main(void)
{
unsigned char data;
clrscr();
ini_lpt(LPT1);
gotoxy(1, 1); cputs("Code hexa lu par lentre numrique: $");
gotoxy(1, 3); cputs("Une touche pour quitter...");

do

{
data = read_bin(LPT1);
gotoxy(39, 1); cprintf("%02X", data);
delay(50);
}
while(!kbhit());
getch();
clrscr();
ini_imprimante(LPT1);

write_bin()
Dclaration:

void write_bin(unsigned char data, int lpt_id);

Fichier d'en-tte:

"esn1lutl.h"

Description:

Ecriture d'un octet sur la sortie numrique de la carte d'entre/sortie ESN1.


Si le paramtre nest pas valide, LPT1 est le choix par dfaut.

Paramtres:

1. Le code hexa ($00-$FF) transmettre.


2. Le numro du port LPT: LPT1 ou LPT2 (1 ou 2).

Valeur retourne:

1. Aucune.

Exemple:
#include <conio.h>
#include <stdlib.h>
#include "esn1lutl.h"
#define ESC

27

void main(void)
{
unsigned char data = 0x00;
int touche;
clrscr();
ini_lpt(LPT1);
gotoxy(1, 1); cputs("Changer le code hexa transmis ..........: < 1 >");
gotoxy(1, 2); cputs("Quitter ................................: <Esc>");
gotoxy(1, 3); cputs("Votre choix ............................: < * >");
gotoxy(1, 5); cputs("Code hexa transmis par la sortie numrique: $");
cprintf("%02X", data);
write_bin(data, LPT1);
gotoxy(45, 3);
do

{
touche = getch();
switch(touche)
{
case '1':
gotoxy(46, 5); cscanf("%X", &data); getch();
gotoxy(45, 3);
write_bin(data, LPT1);
break;
case ESC:
clrscr();
ini_imprimante(LPT1);
exit(0);
}
}
while(1);

ini_lpt()
Dclaration:

void ini_lpt(int lpt_id);

Fichier d'en-tte:

"esn1lutl.h"

Description:

Initialisation des lignes de contrle du port LPT spcifi pour utiliser le registre de
contrle en entre. Le code d'initialisation de ce registre, %0000 0100 == $04, sert
bloquer les transistors des sorties OPEN COLLECTOR du "7405" quivalent du port
LPT. On vite ainsi un conflit avec les sorties du 74LS245 de la carte ESN1.
Cette fonction doit tre appele au tout dbut du programme d'application.
Procdure de branchement de la carte ESN1 LPT.
1. Placer l'interrupteur /G (S1-10) en position "Entres inactives".
2. Brancher la carte ESN1 au port LPT.
3. Lancer le programme d'application.
4. Placer l'interrupteur /G (S1-10) en position "Entres actives".
Si le paramtre nest pas valide, LPT1 est le choix par dfaut.

Paramtres:

1. Le numro du port LPT: LPT1 ou LPT2 (1 ou 2).

Valeur retourne:

1. Aucune.

Exemple:

Voir les exemples des fonctions read_bin() et write_bin().

ini_imprimante()
Dclaration:

void ini_imprimante(int lpt_id);

Fichier d'en-tte:

"esn1lutl.h"

Description:

Initialisation des lignes de contrle du port LPT spcifi pour utiliser une imprimante
sans rinitialiser l'ordinateur. Cette fonction doit tre appele la fin du programme
dapplication, avant la sortie au DOS.
Si le paramtre nest pas valide, choisit LPT1 par dfaut.

Paramtres:

1. Le numro du port LPT: LPT1 ou LPT2 (1 ou 2).

Valeur retourne:

1. Aucune.

Exemple:

Voir les exemples des fonctions read_bin() et write_bin().

Programmation de la carte ESN1 branche sur port LPT


Le Tableau 10 -4 prsente les trois programmes dutilisation de la carte ESN1 branche sur un
port LPT. Ils se trouvent sur la disquette daccompagnement COURS_13T.
T AB L E AU 1 0-4: L E S

P R O G R AM M E S D E T E S T D E L A C AR T E

E S N1

B R AN C H E S U R U N P O R T

LP T
Programme
LIRELEN.C

Rpertoire
\CHAP.010\LIRE_EN

ECRIRLSN.C

\CHAP.010\ECRIR_SN

ESA1LTST.C

\CHAP.010\ESN1_TST

Description
Programme de test des entres EN0 EN7 de la carte ESN1
branche sur un port LPT.
Programme de test des sorties SN0 SN7 de la carte ESN1
branche sur un port LPT.
Programme de test de la carte ESN1 branche sur un port LPT.

Lanalyse de LIRELEN.C et de ECRIRLSN.C est laisse la discrtion du lecteur. Nous allons


concentrer notre tude sur le programme ESN1LTST.C, synthse des deux programmes
prcdents.
Analysez le listage de ESN1LTST.C et identifiez
41. les fichiers qui doivent tre runis en projet pour obtenir le programme excutable
42. ainsi que le modle de programme sur lequel cette application a t conue.
/* Programme:
* =========
*
* Auteur:
* Date:
* Rvision:
* Version:
*
* Volume:
* Fichier:
*
* Description:
*
*
*
*
* Projet:
*
*
*
*
*
*/
#include
#include
#include
#include
#include

ESN1LTST.C
==========
Robert Pesant
28/01/1996
28/01/1996
V1.0
COURS_13T
\CHAP.010\ESN1_TST\ESN1LTST.C
Fichier source principal du projet ESN1LTST.PRJ
Programme de test de la carte ESN1 branche
sur le port LPT1.
Prsentation en mode texte.
ESN1LTST.PRJ se compose de
-------------------------ESN1LTST.C
CURS_UTL.C
DIVR_UTL.C
ESN1LUTL.LIB

<conio.h>
<process.h>
"curs_utl.h"
"esn1lutl.h"
"divr_utl.h"

#define ESC
#define PORT_LPT1
#define PORT_LPT2

27
'1'
'2'

void menu(void);
void main(void)
{
int choix, lpt = LPT1;
unsigned char data_en;
ini_lpt(LPT1);
ini_lpt(LPT2);
cursoff();
textbackground(BLUE);
clrscr();
menu();
textcolor(WHITE);
gotoxy(18,10); cprintf("LPT1");
do
{
do
{
/* Lecture de l'entre numrique */
data_en = read_bin(lpt);
gotoxy(64, 6); cprintf("$%02X", data_en);
/* Retransmission du code de par la sortie numrique */
write_bin(data_en, lpt);
gotoxy(64,10); cprintf("$%02X", data_en);
}
while(!kbhit());
choix = getch();

switch(choix)
{
case ESC:
textbackground(BLACK); textcolor(LIGHTGRAY);
/* Ajuste les lignes de contrle des ports LPT1 et LPT2
pour pouvoir utiliser l'imprimante sans rinitialiser
l'ordinateur. */
ini_imprimante(LPT1); ini_imprimante(LPT2);
curson(); clrscr(); exit(0);
case PORT_LPT1:
lpt = LPT1;
gotoxy(18,10); cprintf("LPT1");
beebop(300,350,100);
break;
case PORT_LPT2:
lpt = LPT2;
gotoxy(18,10); cprintf("LPT2");
beebop(350,400,100);
}
}
while(1);

/* Fonction:
* ========
*
* Description:
*
*
* Paramtres:
*
* Valeur/retour:
*/

menu()
======

#define
#define
#define
#define
#define
#define
#define
#define
#define
#define

MENU_1
MENU_2
MENU_3
MENU_4
MENU_5
MENU_6
MENU_7
MENU_8
MENU_9
MENU_10

"Test de la carte ESN1 branche sur un port LPT"


"=============================================="
"Menu:"
"===="
"Directives:"
"=========="
"Test de l'entre numrique:"
"=========================="
"Test de la sortie numrique:"
"==========================="

#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define

MENU_11
MENU_12
MENU_13
MENU_14
MENU_15
MENU_16
MENU_17
MENU_18
MENU_19
MENU_20
MENU_21
MENU_22
MENU_23
MENU_24
MENU_25
MENU_26

"Test sur LPT1 .. < 1 >"


"Test sur LPT2 .. < 2 >"
"Quitter ........ <Esc>"
"Votre choix ...:"
"1. Procdure de branchement:"
"
- Placez l'interrupteur /G (S1-10) en position \"Entres inactives\"."
"
- Branchez la carte ESN1 au port LPT et lancez le programme."
"
- Placez l'interrupteur /G (S1-10) en position \"Entres actives\"."
"2. Test de l'entre numrique:"
"
- Utilisez le simulateur d'entre (S1-0 S1-7) pour gnrer un code hexa."
"
- Comparez le code affich l'cran et sur l'afficheur barre."
"3. Test de la sortie numrique:"
"
- Comparez le code affich l'cran et sur les afficheurs de sortie."
"
- Observez les niveaux logiques JP1 ou JP2 avec un voltmtre."
"Code lu par l'entre ..........:"
"Code retransmis par la sortie .:"

Affiche le menu du programme de test en mode texte


de la carte d'entre/sortie ESN1.
1. Aucun
1. Aucune

void menu(void)
{
textcolor(YELLOW);
gotoxy( 1, 1); cputs(MENU_1 );
gotoxy( 1, 2); cputs(MENU_2 );
gotoxy( 1, 4); cputs(MENU_3 );
gotoxy( 1, 5); cputs(MENU_4 );
gotoxy( 1,12); cputs(MENU_5 );
gotoxy( 1,13); cputs(MENU_6 );
gotoxy(31, 4); cputs(MENU_7 );
gotoxy(31, 5); cputs(MENU_8 );
gotoxy(31, 8); cputs(MENU_9 );
gotoxy(31, 9); cputs(MENU_10);

textcolor(LIGHTGREEN);
gotoxy( 1, 6); cputs(MENU_11);
gotoxy( 1, 7); cputs(MENU_12);
gotoxy( 1, 8); cputs(MENU_13);
gotoxy( 1,10); cputs(MENU_14);
gotoxy( 1,14); cputs(MENU_15);
gotoxy( 1,15); cputs(MENU_16);
gotoxy( 1,16); cputs(MENU_17);
gotoxy( 1,17); cputs(MENU_18);
gotoxy( 1,19); cputs(MENU_19);
gotoxy( 1,20); cputs(MENU_20);
gotoxy( 1,21); cputs(MENU_21);
gotoxy( 1,23); cputs(MENU_22);
gotoxy( 1,24); cputs(MENU_23);
gotoxy( 1,25); cputs(MENU_24);
gotoxy(31, 6); cputs(MENU_25);
gotoxy(31,10); cputs(MENU_26);

Le projet ESN1LTST.PRJ runit les fichiers suivants:


43. ESN1LTST.C,
44. CURS_UTL.C,
45. DIVR_UTL.C,
46. ESN1LUTL.LIB.
Tout comme le programme ESA1_TST.C, ce programme est bas sur le modle #2.
Avant de pouvoir mettre linterrupteur S1-10 en position Entres actives, il faut initialiser le port
LPT choisi. Comme ce programme doit fonctionner aussi bien sur LPT1 que sur LPT2, ses deux
premires instructions sont
47. ini_lpt(LPT1);
48. ini_lpt(LPT2);
Par la suite, la boucle do...while() de la tche rptitive nutiise que deux instructions pour
accomplir lacquisition et la transmission de donnes. Il sagit de linstruction de lecture des
entres numriques EN0 EN7 et de linstruction dcriture des sorties numriques SN0 SN7:
49. data_en = read_bin(lpt);
50. write_bin(data_en, lpt);
Lorsquon quitte le programme, le port LPT utilis doit tre initialis pour pouvoir faire
fonctionner une imprimante sans tre oblig de redmarrer lordinateur. Comme, priori, on ne
sait pas lequel de LPT1 ou LPT2 sera utilis, la sortie au DOS seffectue en excutant les deux
instructions suivantes:
51. ini_imprimante(LPT1);
52. ini_imprimante(LPT2);
Essai de la carte ESN1 branche sur le port PPI
Avant de rdiger un programme dapplication utilisant la carte ESN1 branche sur le port PPI,
vous devez vrifier son fonctionnement. Pour ce faire, vous devez
53. placer linterrupteur /G (#10) de S1 en position Entres inactives,
54. relier la carte ESN1 au port PPI de lordinateur avec le cble RS-232C livr avec celle-ci,
55. alimenter la carte ESN1 et lordinateur,
56. excuter le programme de test ESN1PTST.EXE, disponible dans le rpertoire
CHAP.010\ESN1_TST de la disquette d'accompagnement COURS_13T,
57. placer linterrupteur /G (#10) de S1 en position Entres actives,
58. lire les directives prsentes l'cran,
59. utiliser le simulateur dentre pour gnrer diffrents codes binaires,
60. vrifier que le code apparat l'cran et sur les afficheurs de sortie,

61.

vrifier, avec un voltmtre ou une sonde logique, que le code est prsent sur les broches
des connecteurs de sortie.
La Figure 10 -5 montre ce que vous obtiendrez lcran lexcution de ESN1PTST.EXE.

F I G U R E 10- 5: E X C U T I O N

DE

E S N1 P T S T.E X E

Fonctions de la bibliothque ESN1PUTL.LIB


Pour faciliter l'utilisation de la carte ESN1 branche sur le port PPI, toutes les fonctions
ncessaires ont t runies dans le fichier bibliothque ESN1PUTL.LIB du rpertoire
BANQUE\ESN1 de la disquette d'accompagnement COURS_13T. Pour les utiliser, on doit
ajouter ce fichier dans le projet de l'application, avec les fichiers sources xxx.C. Le Tableau 10 -5
prsente les sept fonctions de cette bibliothque.
T AB L E AU 1 0-5: L E S
Fonction
read_bin()
write_bin()
read_pc()
write_pc()
ini_ppi_pcin()

ini_ppi_pcout()

reset_ppi()

F ON C T I O N S D E L A B IB L IO T H QU E

E S N1 P U T L . L I B

Description
Lecture des 8 bits (EN0 EN7) de lentre numrique de la carte d'entre/sortie ESN1
branche sur le port PPI.
Ecriture des 8 bits (SN0 SN7) de la sortie numrique de la carte d'entre/sortie ESN1
branche sur le port PPI.
Lecture des 8 bits (PC0 PC7) du port PC lorsquil est programm en entre. Cette
fonction peut tre utilise lorsque le port PC a t initialis avec ini_ppi_pcin().
criture des 8 bits (PC0 PC7) du port PC lorsquil est programm en sortie. Cette
fonction peut tre utilise lorsque le port PC a t initialis avec ini_ppi_pcout().
Initialisation du PPI avec le port PC programm en entre. Cette fonction doit tre
appele au tout dbut du programme dapplication. Lorsquelle est excute, linterrupteur
#10 de S1 peut tre plac en position Entres actives. On doit faire un choix entre
ini_ppi_pcin() et ini_ppi_pcout().
Initialisation du PPI avec le port PC programm en sortie. Cette fonction doit tre appele
au tout dbut du programme dapplication. Lorsquelle est excute, linterrupteur #10 de
S1 peut tre plac en position Entres actives. On doit faire un choix entre
ini_ppi_pcin() et ini_ppi_pcout().
Initialisation en entre de tous les ports du PPI. Cette fonction doit tre appele la fin du
programme dapplication, avant la sortie au DOS.

Les dclarations de ces fonctions ainsi que les constantes symboliques pertinentes ont t runies
dans le fichier d'en-tte ESN1PUTL.H, qui se trouve dans le mme rpertoire.
Avec un fichier bibliothque, le fichier source nest en gnral pas disponible. Toutefois, pour des
raisons didactiques, nous lavons fourni dans le cadre de ce cours. Ce fichier se nomme

ESN1PUTL.C Pour acqurir de bonnes habitudes de programmation, il est fortement


recommand de ne pas lutilis dans les programmes dapplications. Attention! Si vous modifiez
le fichier source ESN1PUTL.C, vous risquez dendommager la carte ESN1 et/ou lordinateur.
Voici le fichier den-tte ESN1PUTL.H ainsi que la description complte des fonctions de
ESN1PUTL.LIB, telle quelles auraient t prsentes si le fichier source navait pas t dvoil.
Le fichier d'en-tte ESN1PUTL.H
/* Fich. d'en-tte:
* ===============
*
* Auteur:
* Date:
* Rvision:
* Version:
*
* Volume:
* Fichier:
*
* Description:
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*/

ESN1PUTL.H
==========
Robert Pesant
17/02/1996
17/02/1996
V1.0
C_13T_PRG
\BANQUE\ESN1\ESN1PUTL.H
Fichier d'en-tte pour les fonctions utilitaires de la
bibliothque ESN1PUTL.LIB pour la carte d'entres/sorties
numriques ESN1 branche sur la carte PPI:
1. ini_ppi_pcin() ..: initialisation du PPI,
PA et PC en entre, PB en sortie.
2. ini_ppi_pcout() .: initialisation du PPI,
PA en entre, PB et PC en sortie.
3. reset_ppi() .....: initialisation du PPI,
PA, PB et PC en entre.
4. read_bin() ......: lecture de l'octet d'entre EN0-EN7.
5. write_bin() .....: transmission de l'octet de sortie
SN0-SN7.
6. read_pc() .......: lecture de l'octet d'entre PC0-PC7
lorsque le PC est en entre.
7. write_pc() ......: transmission de l'octet de sortie
PC0-PC7 lorsque le PC est en sortie.

/***************************************************************************/
/* Dclaration des fonctions.
*/
/*-------------------------------------------------------------------------*/
void
ini_ppi_pcin
(void);
void
ini_ppi_pcout (void);
void
reset_ppi
(void);
unsigned char
read_bin
(void);
void
write_bin
(unsigned char data);
unsigned char
read_pc
(void);
void
write_pc
(unsigned char data);
/*-------------------------------------------------------------------------*/

La bibliothque ESN1PUTL.LIB

read_bin()
Dclaration:

unsigned char read_bin(void);

Fichier d'en-tte:

"esn1lutl.h"

Description:

Lecture dun octet sur lentre numrique de la carte d'entre/sortie ESN1.

Paramtres:

1. Aucun.

Valeur retourne:

1. Le code hexa ($00-$FF) lu.

Exemple:
#include <conio.h>
#include <dos.h>
#include "esn1putl.h"
void main(void)
{
unsigned char data;
clrscr();
ini_ppi_pcin();
gotoxy(1, 1); cputs("Code hexa lu par lentre numrique: $");
gotoxy(1, 3); cputs("Une touche pour quitter...");
do

{
data = read_bin();
gotoxy(39, 1); cprintf("%02X", data);
delay(50);
}
while(!kbhit());
getch();
clrscr();
reset_ppi();

write_bin()
Dclaration:

void write_bin(unsigned char data);

Fichier d'en-tte:

"esn1putl.h"

Description:

criture d'un octet sur la sortie numrique de la carte d'entre/sortie ESN1.

Paramtres:

1. Le code hexa ($00-$FF) transmettre.

Valeur retourne:

1. Aucune.

Exemple:
#include <conio.h>
#include <stdlib.h>
#include "esn1putl.h"
#define ESC

27

void main(void)
{
unsigned char data = 0x00;
int touche;

clrscr();
ini_ppi_pcin();
gotoxy(1, 1); cputs("Changer le code hexa transmis ..........: < 1 >");
gotoxy(1, 2); cputs("Quitter ................................: <Esc>");
gotoxy(1, 3); cputs("Votre choix ............................: < * >");
gotoxy(1, 5); cputs("Code hexa transmis par la sortie numrique: $");
cprintf("%02X", data);
write_bin(data);
gotoxy(45, 3);
do

{
touche = getch();
switch(touche)
{
case '1':
gotoxy(46, 5); cscanf("%X", &data); getch();
gotoxy(45, 3);
write_bin(data);
break;
case ESC:
clrscr();
reset_ppi();
exit(0);
}
}
while(1);

read_pc()
Dclaration:

unsigned char read_pc(void);

Fichier d'en-tte:

"esn1lutl.h"

Description:

Lecture dun octet sur le port bidirectionnel programm de la carte d'entre/sortie


ESN1.

Paramtres:

1. Aucun.

Valeur retourne:

1. Le code hexa ($00-$FF) lu.

Exemple:
#include <conio.h>
#include <dos.h>
#include "esn1putl.h"
void main(void)
{
unsigned char data;
clrscr();
ini_ppi_pcin();
gotoxy(1, 1); cputs("Code hexa lu par le port bidirectionnel: $");
gotoxy(1, 3); cputs("Une touche pour quitter...");
do

{
data = read_pc();
gotoxy(43, 1); cprintf("%02X", data);
delay(50);
}
while(!kbhit());
getch();
clrscr();
reset_ppi();

write_pc()
Dclaration:

void write_pc(unsigned char data);

Fichier d'en-tte:

"esn1putl.h"

Description:

criture d'un octet sur le port bidirectionnel programm de la carte d'entre/sortie


ESN1.

Paramtres:

1. Le code hexa ($00-$FF) transmettre.

Valeur retourne:

1. Aucune.

Exemple:
#include <conio.h>
#include <stdlib.h>
#include "esn1putl.h"
#define ESC

27

void main(void)
{
unsigned char data = 0x00;
int touche;
clrscr();
ini_ppi_pcout();
gotoxy(1, 1); cputs("Changer le code hexa transmis ..........: < 1 >");
gotoxy(1, 2); cputs("Quitter ................................: <Esc>");
gotoxy(1, 3); cputs("Votre choix ............................: < * >");
gotoxy(1, 5); cputs("Code hexa transmis par le port bidirectionnel: $");
cprintf("%02X", data);
write_pc(data);
gotoxy(45, 3);
do

{
touche = getch();
switch(touche)
{
case '1':
gotoxy(49, 5); cscanf("%X", &data); getch();
gotoxy(45, 3);
write_pc(data);
break;
case ESC:
clrscr();
reset_ppi();
exit(0);
}
}
while(1);

ini_ppi_pcin()
Dclaration:

void ini_ppi_pcin(void);

Fichier d'en-tte:

"esn1putl.h"

Description:

Initialisation du PPI 8255A pour servir d'interface la carte ESN1:


- PA en entre: entre numrique EN0-EN7.
- PB en sortie: sortie numrique SN0-SN7.
- PC en entre: port bidirectionnel PC0-PC7 programm en entre.
ATTENTION! L'initialisation du PPI provoque une remise zro de ses trois registres,
PA, PB et PC. Il faut donc tre prudent lorsqu'on doit utiliser cette fonction ailleurs
qu'en dbut de programme.

Paramtres:

1. Aucun.

Valeur retourne:

1. Aucune.

Exemple:

Voir les exemples des fonctions read_bin(), write_bin() et read_pc().

ini_ppi_pcout()
Dclaration:

void ini_ppi_pcout(void);

Fichier d'en-tte:

"esn1putl.h"

Description:

Initialisation du PPI 8255A pour servir d'interface la carte ESN1:


- PA en entre: entre numrique EN0-EN7.
- PB en sortie: sortie numrique SN0-SN7.
- PC en sortie: port bidirectionnel PC0-PC7 programm en sortie.
ATTENTION! L'initialisation du PPI provoque une remise zro de ses trois registres,
PA, PB et PC. Il faut donc tre prudent lorsqu'on doit utiliser cette fonction ailleurs
qu'en dbut de programme.

Paramtres:

1. Aucun.

Valeur retourne:

1. Aucune.

Exemple:

Voir lexemple de la fonction write_pc().

reset_ppi()
Dclaration:

void reset_ppi(void);

Fichier d'en-tte:

"esn1putl.h"

Description:

Initialisation de tous les ports du PPI 8255A en entre pour les protger contre
d'ventuels conflits de bus avec des priphriques externes.
tre appelle en fin de programme avant de quitter au DOS.

Paramtres:

1. Aucun.

Valeur retourne:

1. Aucune.

Exemple:

Voir les exemples des fonctions read_bin(), write_bin(), read_pc() et write_pc().

Programmation de la carte ESN1 branche sur port PPI


Le Tableau 10 -6 prsente les trois programmes dutilisation de la carte ESN1 branche sur le
port PPI. Vous les trouverez sur la disquette daccompagnement COURS_13T, dans les
rpertoires mentionns
T AB L E AU 1 0-6: L E S

P R O G R AM M E S D E T E S T D E L A C AR T E

E S N1

B R AN C H E S U R L E PO R T

PPI
Programme
LIREPEN.C

Rpertoire
\CHAP.010\LIRE_EN

ECRIRPSN.C

\CHAP.010\ECRIR_SN

ESA1PTST.C

\CHAP.010\ESN1_TST

Description
Programme de test des entres EN0 EN7 de la carte ESN1
branche sur le port PPI.
Programme de test des sorties SN0 SN7 de la carte ESN1
branche sur le port PPI.
Programme de test de la carte ESN1 branche sur le port PPI.

Lanalyse de LIREPEN.C et de ECRIRPSN.C est laisse la discrtion du lecteur. En ce qui


concerne le programme ESN1PTST.C, nous nous contenterons de mentionner les diffrences qui
le distinguent de ESN1LTST.C.
En dbut de programme, linitialisation des ports LPT est remplace par linitialisation du port
PPI. Les instructions
ini_lpt(LPT1); et
ini_lpt(LPT2);
sont remplaces par
ini_ppi_pcin();.
Les instructions dacquisition et de transmission de donnes
data_en = read_bin(lpt); et
write_bin(data_en, lpt);
sont remplaces par
data_en = read_bin(); et
write_bin(data_en);.
Enfin, lorsquon quitte le programme, cest le port PPI plutt que les ports LPT qui doit tre
configur correctement. Les instructions
ini_imprimante(LPT1); et
ini_imprimante(LPT2);
sont remplaces
reset_ppi();.