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
RDACTION
Robert Pesant
DESSINS ET CONCEPTION GRAPHIQUE
Robert Pesant
RVISION TECHNIQUE
Robert Pesant
RVISION LINGUISTIQUE
Franois Gaudreau
COMMISSION DE VALIDATION
Formateurs de lOFPPT
Cartes d'entres/sorties
Page 2
OFPPT/TECCART
Rsum de Thorie
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 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.
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
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.
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:
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:
Valeur retourne:
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:
Fichier d'en-tte:
"esa1_utl.h"
Description:
Paramtres:
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:
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:
Valeur retourne:
1. Aucune.
Exemple:
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.
/* 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
#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
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);
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.
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
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.
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
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.
Robert Pesant
28/01/1996
28/01/1996
V1.0
Volume:
Fichier:
C_13T_PRG
\BANQUE\ESN1\ESN1LUTL.H
Description:
+-
+-----
+---------
+-------------
+-----------------
+---------------------
+-------------------------+------------------------------
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
+-------------
+-----------------
+---------------------
+-------------------------+------------------------------
DB25
---(15)
(13)
(12)
(10)
(11)
ERROR:
SLCT :
PE
:
ACK :
BUSY :
(bit
(bit
(bit
(bit
(bit
non-invers)
non-invers)
non-invers)
non-invers)
invers)
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*/
+-
+-----
+---------
+-------------+------------------
DB25
---(01)
(14)
(16)
(17)
----
STROBE
:
AUTO LF
:
INIT
:
SLCT IN
:
IRQ Enable:
/***************************************************************************/
/* 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:
Fichier d'en-tte:
"esn1lutl.h"
Description:
Paramtres:
Valeur retourne:
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:
Fichier d'en-tte:
"esn1lutl.h"
Description:
Paramtres:
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:
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:
Valeur retourne:
1. Aucune.
Exemple:
ini_imprimante()
Dclaration:
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:
Valeur retourne:
1. Aucune.
Exemple:
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.
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
#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
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);
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
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.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:
Fichier d'en-tte:
"esn1lutl.h"
Description:
Paramtres:
1. Aucun.
Valeur retourne:
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:
Fichier d'en-tte:
"esn1putl.h"
Description:
Paramtres:
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:
Fichier d'en-tte:
"esn1lutl.h"
Description:
Paramtres:
1. Aucun.
Valeur retourne:
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:
Fichier d'en-tte:
"esn1putl.h"
Description:
Paramtres:
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:
Paramtres:
1. Aucun.
Valeur retourne:
1. Aucune.
Exemple:
ini_ppi_pcout()
Dclaration:
void ini_ppi_pcout(void);
Fichier d'en-tte:
"esn1putl.h"
Description:
Paramtres:
1. Aucun.
Valeur retourne:
1. Aucune.
Exemple:
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:
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.