retour sommaire des sujets logo ULP

Examen d'informatique industrielle

Première Session 2001

DEUST Process Industriel Electro-Mécanique 2ème année

Seconde partie (P. Trau)

Durée totale de l'épreuve : 2h. L'examen comporte deux parties, d'égale importance. Vous êtes maîtres de votre organisation du temps, mais veuillez composer les deux sujets sur des copies différentes. Documents personnels autorisés. Les 4 questions sont indépendantes, les dernières ne sont pas plus dures que les premières, traitez les dans l'ordre que vous voulez. Faites vite !

Du fait de la spécificité de l'installation, et surtout de l'étendue des possibilités d'évolution du système (l'installation pourrait même servir de test en vraie grandeur pour d'autres systèmes plus vastes, comme par exemple la régulation du flux du Couësnon), il a été décidé de déporter la partie commande de certaines vannes, portes et écluses, tout en restant très évolutif. Les divers actionneurs sont commandés via des interfaces de puissance, un micro-contrôleur gérant toutes ces interfaces. Le micro-contrôleur reçoit des mots de commande via une liaison série (envoyés depuis l'ordinateur principal, par sa carte VME), et commande les interfaces par des ports d'entrée-sortie 8 bits (dans ce sujet on se limitera à un port). De même, il centralise les données des capteurs, et sur demande de l'ordinateur principal, les met en forme et les envoie (toujours sur la liaison série).

Pour programmer le micro-contrôleur, nous disposons d'un système de développement en langage C. Par manque de temps, nous n'allons pas aujourd'hui traiter l'intégralité du programme de ce micro-contôleur, nous nous limiterons à quelques sous-programmes.

Question 1

La transmission série se fait en 8 bits, plus un bit de parité.

Question 1a) Qu'est-ce qu'un bit de parité, et à quoi sert-il ?

Question 1b) Comment peut-on tester (le plus facilement) si un entier est pair ?

Question 1c) Ecrivez en C une fonction appelée "parite_paire" qui reçoit en argument un entier (16 bits), compte le nombre de 1 dans les 9 bits de poids faible, et si ce nombre est pair retourne l'entier 1 (vrai), sinon retourne 0 (faux).

Question 2

Le PC envoie sur le port série plusieurs ordres, et quelquefois assez rapidement. On se limite à des ordres sur un octet. Ces ordres sont de deux types : C (commande séquentielle) et D (demande immédiate). Les commandes C seront exécutées séquentiellement (l'ordre ne sera exécuté que si ceux arrivés précédemment ont été exécutés jusqu'au bout). Par exemple, pour ouvrir une vanne, puis une seconde uniquement quand la première est totalement ouverte, le PC enverra deux ordres C successifs. Les ordres C servent principalement à commander les actionneurs. Les différents ordres C arrivés sont stockés dans un tableau appelé "pile", dans leur ordre d'arrivée. Les ordres D par contre sont traités immédiatement, mais ils ne permettent qu'un traitement de très courte durée (ils servent donc pour demander une information, ou envoyer un arrêt d'urgence). Les ordres C ont leur bit de poids fort (8ème) à 1, les ordres D à 0.

Question 2a) Le port série du micro-contrôleur (en entrée) pourrait être géré par scrutation ou par interruption. Pouvez vous définir en quelques phrases ces deux possibilités, et préciser leurs différences, avantages et inconvénients ?

Question 2b) Choisissons la gestion par interruption. Chaque ordre (sur un octet) arrivant déclenche une interruption. Ecrivez le sous-programme d'interruption : il lit la valeur sur le port d'adresse C0 (hexa), si c'est un ordre C il le place au sommet de la pile, si c'est un ordre D il appelle la fonction de gestion des demandes immédiates (que vous n'avez pas à écrire).

Rq : l'entête de la fonction de gestion des ordres D est "void  demande_immediate(int code)".

La pile est un simple tableau, déclaré comme suit (déclaration globale) :

	#define DIM 100
	typedef int tableau[DIM];
	tableau pile;
	int sommet_pile=0; /* indique l'indice du premier endroit libre sur la pile */

Question 2c) Ecrivez la fonction "depiler" qui n'a aucun argument d'entrée, prend dans la pile l'ordre C le plus ancien et retourne sa valeur (après l'avoir supprimé de la pile, en décalant les autres).

Question 3

Le port d'entrée-sortie est à l'adresse D0, et son registre de direction à l'adresse D1.

Nous allons écrire un programme principal réduit à sa plus simple expression : il met les 8 bits du registre de direction à 1 (tous en sortie), puis il boucle indéfiniment, en testant s'il y a au moins un ordre C dans la pile (je vous rappelle qu'ils s'y mettent "automatiquement" grâce aux interruptions). S'il y a un ordre disponible (sommet_pile>0), il est dépilé (on utilise la fonction de la question 2c, même si vous ne l'avez pas traitée), puis on effectue la commande, puis on recommence à boucler.

Question 3a) écrivez ce programme, en ne traitant pour simplifier qu'un seul ordre: 9F, qui demande d'éteindre les 8 sorties du port.

Question 3b) écrivez la partie à rajouter au programme précédent pour traiter les codes A0 à A7 qui permettent d'allumer indépendamment une seule sortie, sans changer l'état des 7 autres. Les sorties sont numérotées de 0 à 7, la sortie 0 correspondant au bit de poids faible.

Question 4

Le CAN disponible dans le micro-contrôleur fait sa conversion sur 10 bits. Pour mesurer la hauteur d'eau, quelle précision peut-on obtenir, en supposant que la marée, même dans ses plus hauts coefficients, ne peut jamais atteindre une amplitude de plus de 10m ?


pour retourner au sommaire des sujets d'examen, cliquez ici


Patrick TRAU, ULP - IPST juin 2001