Programme principal (version de base)

 

Nous avons donc expliqué le fonctionnement de la majorité des programmes de base du système, ainsi que des composants matériels des deux cartes. Nous allons donc pouvoir maintenant aborder l’étude du noyau de notre programme de contrôle d’ascenseur : sa fonction principale, que voici tout de suite :

 

Configuration_du_PIC
initialisation();
while(1)
{
scanBP();
E=scanE();
moteur(1);
while (E!=BP)
{
scan(4); //Détecte lorsque l’ascenseur n’est plus en face d’un étage
voyant(0);
afficheur(E);
voyant(1);
}
moteur(0);
}

Programme principal
(Version de principe)

 

Cette fonction n’est pas exactement celle à laquelle nous avons abouti, mais un condensé suffisant pour le moment pour expliquer le principe de fonctionnement de base. Elle fait appel à l’ensemble des fonctions que nous avons développé précédemment, et également d’autres que nous découvrirons plus tard.

Comme vous pouvez le voir, elle est assez courte, car nous avons décidé de diviser le plus de tâches que possible en autant de sous-programmes que nécessaire.

Après une phase de configurations du PIC qui a pour but particulièrement de définir A3 comme étant une Entrée et A0, A1, A2, et tout le PORT B en mode Sortie, une phase d’initialisation est activée. Celle-ci permet de ramener l’ascenseur à l’étage 0, et d’afficher sur le 7 segments « 0 » ainsi que d’allumer le voyant correspondant. Cette fonction ayant beaucoup de ressemblance avec le programme principal, nous ne la détaillerons pas (cf Programme Final, en annexe du dossier).

Maintenant la suite de cette fonction principale main()

Elle démarre d’abord par une boucle de type while(1) {}. Elle est toujours effectuée car l’on indique par le (1) que la condition est toujours vraie. Le programme une fois initialisé n’est plus basé que sur cette boucle, qui tourne sans arrêt.

L’intérieur contient d’abord une suite d’instruction :

scanBP();
E=scanE();
moteur(1);

Dans l’ordre, scanBP() est appelée et tourne en continu tant qu’un poussoir n’a pas été appuyé, et attend donc qu’un étage soit mémorisé dans la variable BP.

Dès que c’est le cas, on regarde à quel étage est arrêté l’ascenseur en ce moment. C’est le rôle de scanE() qui enregistre la valeur de l’étage actuel dans E.

Ces deux informations sont alors suffisantes pour faire une demande de mouvement à l’ascenseur, et on utilise alors moteur(1). Le (1) envoyé à la procédure moteur sera compris par celle-ci comme étant un ordre d’allumer le moteur. Mais dans quel sens ? Ce point est réglé directement dans la fonction moteur() qui analyse les données BP et E.

 

Après avoir appelé la fonction moteur pour lui demander d’alimenter le MCC (Moteur à Courant Continu), la lecture continue et on arrive à ceci :

while (E!=BP)
{
scan(4); //Détecte lorsque l’ascenseur n’est plus en face d’un étage
voyant(0);
E=scanE();
afficheur(E);
voyant(1);
}

On a de nouveau affaire avec une boucle de type while [while(E!=BP) {}]. Ici, tant que la position instantanée de l’ascenseur E ne correspond pas avec celle demandée BP, on laisse le moteur tourner.

Pendant ce temps, on exécute différentes actions :

scan(4); a pour rôle de signaler lorsque l’ascenseur ne se trouve plus en face d’un étage, soit que l’ascenseur n’est plus dans le champ de détection d’aucun capteur. Dès qu’un nouvel étage est détecté, la fonction scan s’arrête et l’on exécute la suite des instructions contenues dans la boucle.

C’est alors que l’on envoie voyant(0); qui a pour rôle de demander l’extinction du voyant allumé lorsque l’ascenseur se trouve en face d’un étage.

Suite à quoi on refait un scanE(), qui va repérer l’arrivée à un nouvel étage, et enregistrer son numéro dans E.

On demande alors à changer le chiffre de l’afficheur, en envoyant à la fonction afficheur l’information E, puis on autorise de nouveau à allumer le voyant de position d’étage.

afficheur(E);
voyant(1);

Enfin, si E n’est égal à BP, on reboucle et alors le programme recommence scan(4); etc… En revanche, s’il est égal, cela signifie que l’on a atteint l’étage désiré. On quitte dans ce cas la boucle.

Il ne reste plus qu’une chose à faire : éteindre le moteur. Et c’est ce que fait moteur(0);

Grâce à (0), on demande à la fonction moteur() de faire en sorte de couper le courant alimentant les relais du moteur afin qu’il s’éteigne.

Un nouveau cycle peut alors redémarrer : on attend qu’un poussoir soit activé, et on recommence…

Ce que nous avons vu jusqu’ici n’est pas le programme final. Toutefois, il permet de comprendre l’ensemble des fonctions de bases du programme, des problèmes que nous avons du contourner, et il est donc maintenant tant de tester l’ascenseur.

 

 
E PRÉCÉDENT SOMMAIRE SUIVANT F