• Aucun résultat trouvé

de la thé éorie orie à à la pratique la pratique

Dans le document Chaque mois : votre cours d'électronique (Page 76-79)

• CHAPITRE VII CHAPITRE VII • •

La

La pr programmation ogrammation des PIC16F876 des PIC16F876

de la th

de la thé éorie orie à à la pratique la pratique

ELECTRONIQUE

77

magazine - n° 24 Vous pourrez également noter des

ins-tructions du type “output_por t_c, disable_interrupt”. Ces instructions sor-tent, si l’on peut dire, du C standard mais sont évidemment nécessaires pour la gestion du PIC.

Pour la compréhension de ce listing, nous introduisons les instructions :

La première ser t à écrire <var1> sur le “por t x” et c’est l’équivalent C de l’instruction assembleur “MOVWF PORTx” (dans le cas où “var1” aurait été précédemment mémorisé dans le registre W).

La deuxième, quant à elle, lit la valeur du “por t x” et la mémorise dans la variable “var2”. “Var1” et “var2” sont de type “char”.

Mais on peut utiliser également des variables de type “int” (qui sont à 16 bits et qui seront automatiquement cou-pées à 8).

‘www.electronique-magazine.com

‘TASTI.C

‘Programme permettant la répétition automatique de la dernière touche appuyée. asm movwf ADCON1 clear_bit(STATUS,RP0);

condition se vérifierait, le cycle “for”

qui suit provoquerait le clignotement du chiffre. L’instruction “delay_ms”

permet que notre chif fre reste allumé pendant 500 ms puis éteint pendant la même durée (et ainsi de suite 10 fois).

4) Contrôlons maintenant que seul le poussoir “haut” (up) est pressé grâce à “if((input_por t_a()&32)==0)”.

Nous vous rappelons que le pous-soir “haut” est celui qui est relié au bit 5 du por t A. Introduisons main-tenant la variable “appui_haut

==attente_haut” et les constantes

“première_attente” et “seconde_

attente”. Nous avons choisi des noms assez significatifs : “pre-mière_attente” et “seconde_

attente” représentent le temps (ou mieux, le nombre de cycles du pro-gramme entier) qui doit s’écouler depuis que le poussoir a été pressé jusqu’au moment où l’on incré-mente le chiffre. Nous avons défini 2 constantes car il peut se produire 2 situations : le poussoir est pressé pour la première fois ou bien le poussoir a déjà été pressé.

Dans le premier cas, nous attendrons un nombre de cycles égal à “pre-mière_attente” (qui, dans le pro-gramme, a été définie comme égale à 90). Dans le second cas, le nombre sera égal à “seconde_attente” (définie comme égale à 10).

La variable “ appui_haut ” est le comp-teur du “temps” dont nous avons parlé.

A chaque cycle, si le poussoir est pressé, cette variable est incrémentée.

Observez, en effet, l’instruction “appui_

haut++” qui ser t à incrémenter d’une unité sa valeur.

C’est alors qu’entre en jeu la variable

“attente_haut”, définie, initialement, comme égale à “première_attente”. Le test “if(appui_haut==attente_haut)”

vérifie que la durée désirée se soit écoulée et, dans ce cas, “appui_haut”

est défini égal à 0. C’est l’information qui permet de savoir que le chif fre visualisé doit s’incrémenter. Ceci ne se produit pas dans le cycle en cours mais dans le suivant. En effet les ins-tructions prévues dans ce but sont :

chiffres supérieurs sur notre afficheur.

Revenons maintenant à l’analyse du test “if(appui_haut= = attente_haut)”.

Lorsque celui-ci donne un résultat posi-tif, la valeur de “attente_haut” est véri-fiée.

Regardez attentivement les instructions suivantes :

Celles-ci indiquent que, si le temps fixé par “première_attente” s’est déjà écoulé, alors le poussoir a déjà été pressé et, donc, nous pouvons passer à “seconde_attente”, inférieure, comme nous l’avons dit, à la valeur de “pre-mière_attente”. Concrètement, cela veut dire qu’en maintenant le poussoir appuyé, il se passera moins de temps entre une incrémentation et la suivante du chiffre sur l’afficheur. Nous avons donc réalisé le caractère fonctionnel que nous nous étions fixé en début d’ar ticle.

5) Tout le discours fait au point pré-cédent vaut également pour le pous-soir “bas”. Sa gestion commence avec la ligne “if(input_por t_

a()&16)==0)”. Nous ne nous répé-terons pas : l’algorithme est le même. Nous avons évidemment changé le nom des deux variables qui sont maintenant “appui_bas”

et “attente_bas”. “première_

attente” et “seconde_attente” sont évidemment les mêmes, vu que ces temps devront être égaux pour les deux poussoirs.

6) Enfin (voir la dernière instruction

“else”) au cas où aucun des deux poussoirs n’aurait été pressé, nous mettrions à 0 les deux compteurs et définirions les attentes comme égales à “première_attente”.

C’est tout ! Nous pensons vous avoir démontré que réaliser un tel pro-gramme en assembleur serait très compliqué alors qu’en utilisant le C, quelques lignes de code, simples et faciles à lire, suffisent. Si vous le vou-lez, vous pouvez, par curiosité, réali-ser le même programme en assem-bleur ou en Basic et les comparer. Ce serait, de toute façon, un excellent exercice.

D. M.

tialisation (plus proches de l’assem-bleur que du C) caractéristiques du microcontrôleur PIC :

Grâce à ces informations, nous sommes en mesure d’analyser le fonc-tionnement du programme :

L’instruction “for(;;)” permet un cycle infini, que nous définissons comme étant le cycle principal. En effet ce pro-gramme ne se termine jamais.

Voici ce qui se passe à l’intérieur du cycle :

1) L’afficheur est mis à jour, en visua-lisant le contenu de la variable

“compteur” qui peut, évidemment, prendre les valeurs de 0 à 9. Grâce à l’instruction “switch(compteur)”

nous allumons de façon opportune les 7 segments de l’afficheur, qui sont reliés au por t C du PIC.

2) Puis vient une temporisation de 10ms (voir l’instruction

“delay_ms(retard)”). “delay_ms” est une autre des instructions carac-téristiques du PIC. “retard” est une variable de type “char”. Dans notre programme, il n’y a aucune raison d’utiliser une telle variable vu que retard est mis à 10 au début du pro-gramme et n’est plus modifié.

Cependant, elle ser t à vous mon-trer comment, en une (vous avez bien lu “une”) ligne du programme, on peut introduire un retard variable, chose qui demandait plusieurs lignes de code en assembleur.

3) Vérifions que les deux poussoirs sont pressés grâce à l’instruction

“if((input_por t_a()&48)==0)”. Nous vous rappelons que, dans notre car te de test, les poussoirs sont reliés aux bits 4 et 5 du port A et que, lorsqu’ils sont pressés, l’en-trée respective est mise à masse.

Le symbole “&”, en C, indique un

“AND” logique. Donc, l’instruction vérifie que les bits 4 (24= 16) et 5

Dans le document Chaque mois : votre cours d'électronique (Page 76-79)

Documents relatifs