53
Royaume du Maroc OFFICE DE LA FORMATION PROFESSIONNELLE ET DE LA PROMOTION DU TRAVAIL Cours 13T Langage C et Gestion des Entr�es/Sorties R�sum� de Th�orie Version préliminaire Deuxième Année Programme de Formation des Techniciens Spécialisés en Électronique DIRECTION DE LA RECHERCHE ET INGENIERIE DE LA FORMATION Septembre 1996

CH10_13T

Embed Size (px)

DESCRIPTION

CH10_13T

Citation preview

Rsum de Thorie

COMMENTAIRES \* FUSIONFORMAT Cours 13T SUJET \* FUSIONFORMAT Langage C et Gestion des Entres/Sorties TITRE \* FUSIONFORMAT Rsum de ThorieVersion prliminaire

TECCART INTERNATIONAL 2000 inc.3155, rue Hochelaga,Montral, Qubec (Canada)H1W 1G4

RDACTIONRobert Pesant

DESSINS ET CONCEPTION GRAPHIQUERobert Pesant

RVISION TECHNIQUERobert Pesant

RVISION LINGUISTIQUEFranois Gaudreau

COMMISSION DE VALIDATIONFormateurs 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 HEURE \@ "j MMMM aaaa" 23 mars 1996 NOMFICHIER \* FUSIONFORMAT CH10_13T.DOCTABLE DES MATIRES TM \o "1-3" 10. Cartes dentres/sorties BOUTONATTEINDRE _Toc352997418 RENVOIPAGE _Toc352997418 10-110.1 Introduction BOUTONATTEINDRE _Toc352997420 RENVOIPAGE _Toc352997420 10-110.2 Carte dentres/sorties analogiques ESA1 BOUTONATTEINDRE _Toc352997421 RENVOIPAGE _Toc352997421 10-110.2.1 Description de la carte ESA1 BOUTONATTEINDRE _Toc352997422 RENVOIPAGE _Toc352997422 10-110.2.2 Essai de la carte ESA1 BOUTONATTEINDRE _Toc352997423 RENVOIPAGE _Toc352997423 10-210.2.3 Fonctions de la bibliothque ESA1_UTL.LIB BOUTONATTEINDRE _Toc352997424 RENVOIPAGE _Toc352997424 10-310.2.4 Programmation de la carte ESA1 BOUTONATTEINDRE _Toc352997425 RENVOIPAGE _Toc352997425 10-610.3 Carte dentres/sorties numriques ESN1 BOUTONATTEINDRE _Toc352997426 RENVOIPAGE _Toc352997426 10-1010.3.1 Description de la carte ESN1 BOUTONATTEINDRE _Toc352997427 RENVOIPAGE _Toc352997427 10-1010.3.2 Essai de la carte ESN1 branche sur un port LPT BOUTONATTEINDRE _Toc352997428 RENVOIPAGE _Toc352997428 10-1210.3.3 Fonctions de la bibliothque ESN1LUTL.LIB BOUTONATTEINDRE _Toc352997429 RENVOIPAGE _Toc352997429 10-1310.3.4 Programmation de la carte ESN1 branche sur port LPT BOUTONATTEINDRE _Toc352997430 RENVOIPAGE _Toc352997430 10-1710.3.5 Essai de la carte ESN1 branche sur le port PPI BOUTONATTEINDRE _Toc352997431 RENVOIPAGE _Toc352997431 10-2010.3.6 Fonctions de la bibliothque ESN1PUTL.LIB BOUTONATTEINDRE _Toc352997432 RENVOIPAGE _Toc352997432 10-2110.3.7 Programmation de la carte ESN1 branche sur port PPI BOUTONATTEINDRE _Toc352997433 RENVOIPAGE _Toc352997433 10-27Cartes dentres/sortiesIntroductionEn 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 ESA1Description de la carte ESA1La 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 RENV _Ref352225549 \* FUSIONFORMAT Figure 10-1. INCORPORER Visio.Drawing.3 Figure REFSTYLE 1 \n 10- SEQ Figure \* ARABE \r 1 1: Schma de principe de la carte ESA1ESA1 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 W 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 ESA1Avant de rdiger un programme dapplication utilisant la carte ESA1, vous devez vrifier son fonctionnement. Pour ce faire, vous devezrelier la carte ESA1 au port LPT1 (ou LPT2) de lordinateur avec le cble dimprimante livr avec celle-ci,alimenter la carte ESA1 et lordinateur,excuter le programme de test ESA1_TST.EXE, disponible dans le rpertoire CHAP.010\ESA1_TST de la disquette d'accompagnement COURS_13T,lire les directives prsentes l'cran,slectionner, si ncessaire, le port parallle auquel est relie la carte ESA1,dplacer le curseur des potentiomtres de simulation SIMUL0 et SIMUL1,vrifier que le code et le signal de chaque entre apparaissent lcran,vrifier, avec un ampremtre et lafficheur barre, que le signal de EA0 est retransmis correctement par SA0.La RENV _Ref352225593 \* FUSIONFORMAT Figure 10-2 montre ce que vous obtiendrez lcran lexcution de ESA1_TST.EXE.

Test de la carte analogique ESA1 ================================ Menu: Test des entres analogiques: ==== ============================ Test sur LPT1 .. < 1 > Signal analogique lu par EA0 ..: $74, 2.82 V Test sur LPT2 .. < 2 > Signal analogique lu par EA1 ..: $BD, 3.96 V Quitter ........ Test de la sortie analogique: Votre choix ...: LPT1 ============================ Signal retransmis de EA0 SA0 : $74, 11.28 mA Directives: ========== 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.

Figure REFSTYLE 1 \n 10- SEQ Figure \* ARABE 2: Excution de ESA1_TST.EXEFonctions de la bibliothque ESA1_UTL.LIBPour 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 RENV _Ref352225737 \* FUSIONFORMAT Tableau 10-1 prsente les trois fonctions de cette bibliothque.

Tableau REFSTYLE 1 \n 10- SEQ Tableau \* ARABE \r 1 1: Les fonctions de la bibliothque ESA1_UTL.LIBFonctionDescriptionread_adc()Lecture d'un octet correspondant la tension 1-5 Volts applique lentre analogique slectionne de la carte d'entre/sortie ESA1.write_dac()Ecriture d'un octet sur la sortie analogique de la carte d'entre/sortie ESA1 et transmission du signal 4-20mA correspondant.ini_imprimante()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: ESA1_UTL.H * =============== ========== * * Auteur: Robert Pesant * Date: 25/11/1995 * Rvision: 25/11/1995 * Version: V1.0 * * Volume: C_13T_PRG * Fichier: \BANQUE\ESA1\ESA1_UTL.H * * Description: 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 #include #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 #include #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 ................................: "); 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 ESA1Le RENV _Ref352225760 \* FUSIONFORMAT Tableau 10-2 prsente les trois programmes dutilisation de la carte ESA1 qui se trouvent sur la disquette daccompagnement COURS_13T.

Tableau REFSTYLE 1 \n 10- SEQ Tableau \* ARABE 2: Les programmes de test de la carte ESA1ProgrammeRpertoireDescriptionLIRE_EA.C\CHAP.010\LIRE_EAProgramme de test des entres EA0 et EA1 de la carte ESA1.ECRIR_SA.C\CHAP.010\ECRIR_SAProgramme de test de la sortie SA0 de la carte ESA1.ESA1_TST.C\CHAP.010\ESA1_TSTProgramme 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 identifiezles fichiers qui doivent tre runis en projet pour obtenir le programme excutableainsi que le modle de programme sur lequel cette application a t conue./* Programme: ESA1_TST.C * ========= ========== * * Auteur: Robert Pesant * Date: 23/03/1996 * Rvision: 23/03/1996 * Version: V1.0 * * Volume: COURS_13T * Fichier: \CHAP.010\ESA1_TST\ESA1_TST.C * * Description: Fichier source principal du projet ESA1_TST.PRJ * Programme de test de la carte analogique ESA1. * Prsentation en mode texte. * * Projet: ESA1_TST.PRJ se compose de: * -------------------------- * ESA1_TST.C * CURS_UTL.C * DIVR_UTL.C * ESA1_UTL.LIB */

#include #include #include #include #include "curs_utl.h"#include "esa1_utl.h"#include "divr_utl.h"

#define ESC 27#define PORT_LPT1 '1'#define PORT_LPT2 '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: menu() * ======== ====== * * Description: Affiche le menu du programme de test en mode texte * de la carte d'entre/sortie analogique ESA1. * * Paramtres: 1. Aucun * * Valeur/retour: 1. Aucune */

#define MENU_1 "Test de la carte analogique ESA1"#define MENU_2 "================================"#define MENU_3 "Menu:"#define MENU_4 "===="#define MENU_5 "Directives:"#define MENU_6 "=========="#define MENU_7 "Test des entres analogiques:"#define MENU_8 "============================"#define MENU_9 "Test de la sortie analogique:"#define MENU_10 "============================"

#define MENU_11 "Test sur LPT1 .. < 1 >"#define MENU_12 "Test sur LPT2 .. < 2 >"#define MENU_13 "Quitter ........ "#define MENU_14 "Votre choix ...:"#define MENU_15 "1. Test des entres analogiques:"#define MENU_16 " - Cout-circuitez les paires d'entres suivantes: EA0- et GND,"#define MENU_17 " EA0+ et SIMUL0, EA1- et GND, ainsi que EA1+ et SIMUL1."#define MENU_18 " - A l'aide des cavaliers, rglez les entres pour des signaux 1-5 V."#define MENU_19 " - Utilisez les pot. SIMUL0 et SIMUL1 pour gnrer les signaux 1-5 V."#define MENU_20 "2. Test de la sortie analogique:"#define MENU_21 " - Le signal de l'entre EA0 est retransmis par la sortie SA0."#define MENU_22 " - Observez la valeur de l'octet transmis sur l'afficheur barre."#define MENU_23 " - Vrifiez le signal 4-20 mA correspondant avec un ampremtre."#define MENU_24 "Signal analogique lu par EA0 ..:"#define MENU_25 "Signal analogique lu par EA1 ..:"#define MENU_26 "Signal retransmis de EA0 SA0 :"

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:ESA1_TST.C,CURS_UTL.C,DIVR_UTL.C,ESA1_UTL.LIB.Ce programme est bas sur le modle #2, cest--dire le modle de programme quiexcute une tche rptitive,surveille priodiquement le clavier,traite la demande de lutilisateuret 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:data_ea0 = read_adc(EA0, lpt);data_ea1 = read_adc(EA1, lpt);write_dac(data_ea0, lpt);Pour la lecture dune entre, les paramtres passs la fonction read_adc() sont, dans lordre,lentre que lon veut lireet 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,le code de 8 bits transmettreet le port LPT auquel est relie la carte ESA1.Le programme offre trois choix lutilisateur:choisir le port LPT1, si la carte est branche sur celui-ci,choisir le port LPT2, si la carte est branche sur celui-ci,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:ini_imprimante(LPT1);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 ESN1Description de la carte ESN1La 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 DB-25)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 RENV _Ref352225618 \* FUSIONFORMAT Figure 10-3. INCORPORER Visio.Drawing.3 1. Entre numrique de 8 bits (LPT/PPI):EN0-EN72. Sortie numrique de 8 bits (LPT/PPI):SN0-SN73. Entre dinterruption (LPT):E-INT4. Port bidirectionnel de 8 bits (PPI):PC0-PC7Figure REFSTYLE 1 \n 10- SEQ Figure \* ARABE 3: Schma de principe de la carte ESN1Cette 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 LPTAvant de rdiger un programme dapplication utilisant la carte ESN1 branche sur un port LPT, vous devez vrifier son fonctionnement. Pour ce faire, vous devezplacer linterrupteur /G (#10) de S1 en position Entres inactives,relier la carte ESN1 au port LPT1 (ou LPT2) de lordinateur avec le cble RS-232C livr avec celle-ci,alimenter la carte ESN1 et lordinateur,excuter le programme de test ESN1LTST.EXE, disponible dans le rpertoire CHAP.010\ESN1_TST de la disquette d'accompagnement COURS_13T,placer linterrupteur /G (#10) de S1 en position Entres actives,lire les directives prsentes l'cran,slectionner, si ncessaire, le port parallle auquel est relie la carte ESA1,utiliser le simulateur dentre pour gnrer diffrents codes binaires,vrifier que le code apparat l'cran et sur les afficheurs de sortie,vrifier, avec un voltmtre ou une sonde logique, que le code est prsent sur les broches des connecteurs de sortie.La RENV _Ref352225656 \* FUSIONFORMAT Figure 10-4 montre ce que vous obtiendrez lcran lexcution de ESN1LTST.EXE.

Test de la carte ESN1 branche sur un port LPT ============================================== Menu: Test de l'entre numrique: ==== ========================== Test sur LPT1 .. < 1 > Code lu par l'entre ..........: $E4 Test sur LPT2 .. < 2 > Quitter ........ Test de la sortie numrique: =========================== Votre choix ...: LPT1 Code retransmis par la sortie .: $E4 Directives: ========== 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.

Figure REFSTYLE 1 \n 10- SEQ Figure \* ARABE 4: Excution de ESN1LTST.EXEFonctions de la bibliothque ESN1LUTL.LIBPour 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 RENV _Ref352225783 \* FUSIONFORMAT Tableau 10-3 prsente les quatre fonctions de cette bibliothque.

Tableau REFSTYLE 1 \n 10- SEQ Tableau \* ARABE 3: Les fonctions de la bibliothque ESN1LUTL.LIBFonctionDescriptionread_bin()Lecture des 8 bits (EN0 EN7) de lentre numrique de la carte d'entre/sortie ESN1 branche sur un port LPT.write_bin()Ecriture des 8 bits (SN0 SN7) de la sortie numrique de la carte d'entre/sortie ESN1 branche sur un port LPT.ini_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.ini_imprimante()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: Robert Pesant * Date: 28/01/1996 * Rvision: 28/01/1996 * Version: V1.0 * * Volume: C_13T_PRG * Fichier: \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) DATA 0 * +------ (03) DATA 1 * +---------- (04) DATA 2 * +-------------- (05) DATA 3 * +------------------ (06) DATA 4 * +---------------------- (07) DATA 5 * +-------------------------- (08) DATA 6 * +------------------------------ (09) DATA 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) ERROR: indique une erreur (bit non-invers) * +------------------ (13) SLCT : prte recevoir (bit non-invers) * +---------------------- (12) PE : plus de papier (bit non-invers) * +-------------------------- (10) ACK : prte pour un octet (bit non-invers) * +------------------------------ (11) BUSY : occup ou hors ligne (bit 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) STROBE : fait lire un octet (bit invers) * +------ (14) AUTO LF : impose LF aprs CR (bit invers) * +---------- (16) INIT : rinitialisation (bit non-invers) * +-------------- (17) SLCT IN : met en ligne (bit invers) * +------------------ ---- IRQ Enable: 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 #include #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 #include #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 ................................: "); 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 LPTLe RENV _Ref352225801 \* FUSIONFORMAT 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.

Tableau REFSTYLE 1 \n 10- SEQ Tableau \* ARABE 4: Les programmes de test de la carte ESN1 branche sur un port LPTProgrammeRpertoireDescriptionLIRELEN.C\CHAP.010\LIRE_ENProgramme de test des entres EN0 EN7 de la carte ESN1 branche sur un port LPT.ECRIRLSN.C\CHAP.010\ECRIR_SNProgramme de test des sorties SN0 SN7 de la carte ESN1 branche sur un port LPT.ESA1LTST.C\CHAP.010\ESN1_TSTProgramme 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 identifiezles fichiers qui doivent tre runis en projet pour obtenir le programme excutableainsi que le modle de programme sur lequel cette application a t conue.

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

#include #include #include "curs_utl.h"#include "esn1lutl.h"#include "divr_utl.h"

#define ESC 27#define PORT_LPT1 '1'#define PORT_LPT2 '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: menu() * ======== ====== * * Description: Affiche le menu du programme de test en mode texte * de la carte d'entre/sortie ESN1. * * Paramtres: 1. Aucun * * Valeur/retour: 1. Aucune */

#define MENU_1 "Test de la carte ESN1 branche sur un port LPT"#define MENU_2 "=============================================="#define MENU_3 "Menu:"#define MENU_4 "===="#define MENU_5 "Directives:"#define MENU_6 "=========="#define MENU_7 "Test de l'entre numrique:"#define MENU_8 "=========================="#define MENU_9 "Test de la sortie numrique:"#define MENU_10 "==========================="

#define MENU_11 "Test sur LPT1 .. < 1 >"#define MENU_12 "Test sur LPT2 .. < 2 >"#define MENU_13 "Quitter ........ "#define MENU_14 "Votre choix ...:"#define MENU_15 "1. Procdure de branchement:"#define MENU_16 " - Placez l'interrupteur /G (S1-10) en position \"Entres inactives\"."#define MENU_17 " - Branchez la carte ESN1 au port LPT et lancez le programme."#define MENU_18 " - Placez l'interrupteur /G (S1-10) en position \"Entres actives\"."#define MENU_19 "2. Test de l'entre numrique:"#define MENU_20 " - Utilisez le simulateur d'entre (S1-0 S1-7) pour gnrer un code hexa."#define MENU_21 " - Comparez le code affich l'cran et sur l'afficheur barre."#define MENU_22 "3. Test de la sortie numrique:"#define MENU_23 " - Comparez le code affich l'cran et sur les afficheurs de sortie."#define MENU_24 " - Observez les niveaux logiques JP1 ou JP2 avec un voltmtre."#define MENU_25 "Code lu par l'entre ..........:"#define MENU_26 "Code retransmis par la sortie .:"

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:ESN1LTST.C,CURS_UTL.C,DIVR_UTL.C,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 sontini_lpt(LPT1);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:data_en = read_bin(lpt);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:ini_imprimante(LPT1);ini_imprimante(LPT2);

Essai de la carte ESN1 branche sur le port PPIAvant de rdiger un programme dapplication utilisant la carte ESN1 branche sur le port PPI, vous devez vrifier son fonctionnement. Pour ce faire, vous devezplacer linterrupteur /G (#10) de S1 en position Entres inactives,relier la carte ESN1 au port PPI de lordinateur avec le cble RS-232C livr avec celle-ci,alimenter la carte ESN1 et lordinateur,excuter le programme de test ESN1PTST.EXE, disponible dans le rpertoire CHAP.010\ESN1_TST de la disquette d'accompagnement COURS_13T,placer linterrupteur /G (#10) de S1 en position Entres actives,lire les directives prsentes l'cran,utiliser le simulateur dentre pour gnrer diffrents codes binaires,vrifier que le code apparat l'cran et sur les afficheurs de sortie,vrifier, avec un voltmtre ou une sonde logique, que le code est prsent sur les broches des connecteurs de sortie.La RENV _Ref352225691 \* FUSIONFORMAT Figure 10-5 montre ce que vous obtiendrez lcran lexcution de ESN1PTST.EXE.

Test de la carte ESN1 branche sur le port PPI ============================================== Menu: Test de l'entre numrique: ==== ========================== Quitter ........ Code lu par l'entre ..........: $C6 Test de la sortie numrique: =========================== Code retransmis par la sortie .: $C6 Directives: ========== 1. Procdure de branchement: - Placez l'interrupteur /G (S1-10) en position "Entres inactives". - Branchez la carte ESN1 au port PPI 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.

Figure REFSTYLE 1 \n 10- SEQ Figure \* ARABE 5: Excution de ESN1PTST.EXEFonctions de la bibliothque ESN1PUTL.LIBPour 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 RENV _Ref352225817 \* FUSIONFORMAT Tableau 10-5 prsente les sept fonctions de cette bibliothque.

Tableau REFSTYLE 1 \n 10- SEQ Tableau \* ARABE 5: Les fonctions de la bibliothque ESN1PUTL.LIBFonctionDescriptionread_bin()Lecture des 8 bits (EN0 EN7) de lentre numrique de la carte d'entre/sortie ESN1 branche sur le port PPI.write_bin()Ecriture des 8 bits (SN0 SN7) de la sortie numrique de la carte d'entre/sortie ESN1 branche sur le port PPI.read_pc()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().write_pc()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().ini_ppi_pcin()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().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().reset_ppi()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: ESN1PUTL.H * =============== ========== * * Auteur: Robert Pesant * Date: 17/02/1996 * Rvision: 17/02/1996 * Version: V1.0 * * Volume: C_13T_PRG * Fichier: \BANQUE\ESN1\ESN1PUTL.H * * Description: 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 #include #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 #include #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 ................................: "); 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 #include #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 #include #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 ................................: "); 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 PPILe RENV _Ref352225839 \* FUSIONFORMAT 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

Tableau REFSTYLE 1 \n 10- SEQ Tableau \* ARABE 6: Les programmes de test de la carte ESN1 branche sur le port PPIProgrammeRpertoireDescriptionLIREPEN.C\CHAP.010\LIRE_ENProgramme de test des entres EN0 EN7 de la carte ESN1 branche sur le port PPI.ECRIRPSN.C\CHAP.010\ECRIR_SNProgramme de test des sorties SN0 SN7 de la carte ESN1 branche sur le port PPI.ESA1PTST.C\CHAP.010\ESN1_TSTProgramme 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 instructionsini_lpt(LPT1); etini_lpt(LPT2);sont remplaces parini_ppi_pcin();.Les instructions dacquisition et de transmission de donnesdata_en = read_bin(lpt); etwrite_bin(data_en, lpt);sont remplaces pardata_en = read_bin(); etwrite_bin(data_en);.Enfin, lorsquon quitte le programme, cest le port PPI plutt que les ports LPT qui doit tre configur correctement. Les instructionsini_imprimante(LPT1); etini_imprimante(LPT2);sont remplacesreset_ppi();.

TITRE \* FUSIONFORMAT Rsum de Thorie SUJET \* FUSIONFORMAT Langage C et Gestion des Entres/Sorties

MOTSCLES \* FUSIONFORMAT Les cartes d'entres/sortiesPage PAGE \* FUSIONFORMAT 10-2OFPPT/TECCART

INCORPORER CDraw4 Royaume du MarocOFFICE DE LA FORMATION PROFESSIONNELLE ET DE LA PROMOTION DU TRAVAIL

Deuxime AnneProgramme de Formation des TechniciensSpcialiss en lectroniqueDIRECTION DE LA RECHERCHE ET INGENIERIE DE LA FORMATIONSeptembre 1996