Vous êtes sur la page 1sur 3

Informatique Industrielle Outil MPLAB IDE : mise au point et test de programmes dvelopps en langage C (compilateur Microchip MCC18)

CS

TP PIC18 Numro 2

Programme de dmonstration
La cration dun projet se fait comme en assembleur en choisissant C18 (v3.40).
Click droit sur source Files , puis New , puis C Source File ou C Main File , donner un nom votre fichier, qui aura par dfaut une extension .c (par exemple Demo.c).
/*-------------------------------------------------------------------------------------------------*/ /* Recopie COD_A (RC0) sur LED1 (RG4) et COD_B (RC1) sur LED2 (RA4) */ /* ------------------------------------------------------------------------------------------------*/ # include <p18cxxx.h> # pragma config FOSC = HS, WDTEN = OFF, XINST = OFF # define SORTIE 0 # define ENTREE !SORTIE # define LED1 LATGbits.LATG4 # define LED2 LATAbits.LATA4 # define COD_A PORTCbits.RC0 # define COD_B PORTCbits.RC1 # define ETEINTE 1 # define ALLUMEE !ETEINTE void main() { TRISGbits.TRISG4 = SORTIE; TRISAbits.TRISA4 = SORTIE; TRISCbits.TRISC0 = ENTREE; TRISCbits.TRISC1 = ENTREE; LED1 = ETEINTE; LED2 = ETEINTE; // ------------------------TACHE DE FOND --------------------------------For( ;;) { LED1 = !COD_A; // complment pour que si COD_A = 1 LED1 allume LED2 = !COD_B; // idem pour COD_B et LED2; } }

Une fois que vous navez plus derreur de compilation le test et la mise au point du programme se fait comme en assembleur (normalement dabord avec MPLAB Sim puis sur la cible via PICkit2). Remarque : en mode Debug, pour faire du pas pas sans dbuter par la section de code assembleur ajoute automatiquement, par le compilateur, en dbut de programme, vous pouvez commencer par un Run jusqu un point darrt positionn en dbut du programme C puis continuer ensuite en pas pas.

Programme effet Chenillard sur lafficheur 1 du kit


Dans ce qui suit on vous demande de dvelopper suivant diffrentes versions un programme C18 dont lexcution sur le kit provoquera le mme effet que celui obtenu au TP1 question 5. a) Version simple Page 1 sur 3 04/05/2012

Tp_PIC2 1_12.doc

Dans cette version on utilisera linstruction classique du langage C, Val = Val << 1 ; qui provoque sur la variable Val (dclare ici de type unsigned char) un dcalage dun bit sur la gauche. Attention ce dcalage nest pas circulaire. La temporisation entre deux dcalages successifs sera gre par deux boucles for imbriques. Vous devez : - Ecrire le programme source puis faire sa mise au point avec MPLAB Sim. Vous en profiterez pour utiliser loutil Simulator Trace du menu View qui permet dobtenir les dures dexcution entre des instructions. En positionnant un point darrt dans la boucle vous pourrez ainsi obtenir le calcul de sa dure exprime en cycles machine ou en sec (clic droit et Display Time) entre deux arrts successifs de la boucle. Attention, les dures calcules seront correctes par rapport lexcution sur notre cible si la frquence du processeur a bien t rgle 25MHz (Menu Debugger Settings). Amliorer votre programme source en crant une fonction nomme Rot_Gauche qui sera appele par le programme principal. Cette fonction doit renvoyer un octet dont le contenu est celui de loctet quon lui a pass en paramtre mais dcal circulairement dun bit vers la gauche. Le prototype sera donc de la forme : unsigned char Rot_Gauche(unsigned char valeur) ;

b) Version avec utilisation dune instruction macro_assembleur pour le dcalage On a vu au TP1 quil existait une instruction assembleur rlncf pour le dcalage circulaire, pourquoi ne pas en profiter mme dans un programme source C ? Cest possible en ajoutant dans le C une partie Macro_assembleur dont la syntaxe, dans notre cas, sera la suivante : _asm movlb Val rlncf Val,1,1 _endasm

Par rapport au programme prcdent la fonction Rot_Gauche devient donc inutile, on peut la supprimer, et dans le main il faut remplacer lappel de la fonction par la partie Macro-assembleur. En mode Debug (puis Run) vrifier alors le fonctionnement en ayant au pralable positionn un point darrt aprs lexcution de la partie Macro_assembleur et en ayant ouvert une fentre Watch contenant Val ainsi que le registre BSR. Si vous constatez que cela ne marche pas (Val na pas t dcale d1 bit), visualiser avec View Dissassembly listing le fichier de dsassemblage et essayer de comprendre do vient lerreur en particulier en analysant l'adresse de la variable manipule par rlncf. En dclarant Val en tant que variable globale le problme devrait tre rgl. c) Utilisation des fonction Delay du fichier dentte (header) delays.h pour la temporisation. Le fichier delays.h permet de disposer dun certain nombre de temporisations logicielles prcalibres en multiples du temps de cycle TCY du processeur. Par exemple la fonction Delay10KTCYx(n) permet dobtenir une temporisation dune dure de 10 000*n TCY. Dans le programme prcdent vous remplacerez donc votre temporisation artisanale par une fonction Delay de faon avoir un dcalage toutes les 333 ms. Avec dbugger tool =>MPLAB Sim, Simulator Trace du menu View vous pourrez vrifier et ajuster la valeur) Le paramtre n tant du type unsigned char, comment obtenir une tempo d1 sec ?

d) Version avec structure et Champ de bits

Tp_PIC2 1_12.doc

Page 2 sur 3

04/05/2012

Dans les programmes microcontrleurs on a souvent besoin de tester ou modifier un (ou des) bit dun octet sans modifier les autres bits de cet octet. La technique classique est alors de faire un Et Binaire ou un OU Binaire entre la variable octet et le masque qui va bien (cf fonction Rot_Gauche par exemple). Avec le PIC18f67j11, dont les octets de la mmoire de donnes sont accessibles au niveau bit, ces oprations deviennent bien plus simples car il est possible daccder directement un bit dune variable (exemple utilis au tp1 en assembleur : btfsz Val,7,0 pour tester le bit 7 de la variable Val). En langage C cela ncessite l'utilisation des notions d'union et de structure. Un exemple de dclaration est donn ci-dessous. union { unsigned char oct8; struct { unsigned B0:1; unsigned B1:1; unsigned B2:1; unsigned B3:1; unsigned B4:1; unsigned B5:1; unsigned B6:1; unsigned B7:1; }; }Val; On accde alors l'octet complet par la syntaxe Val.oct8 et chacun des bit par la syntaxe : Val.Bx (x[0, 7]). Par exemple la recopie du bit7 sur le bit1 devient simple : Val.B1 = Val.B7 Dvelopper une nouvelle (et dernire, ouf !) version du programme Chenillard en utilisant cette proprit.

Exercice complmentaire pour ceux qui sont au chmage technique:


Amliorer le dernier programme en ajoutant la possibilit de changer le sens du dcalage suivant ltat (enfonc ou relch) du bouton poussoir not I3 sur le synoptique de cblage du kit (etudi au td n1).

Tp_PIC2 1_12.doc

Page 3 sur 3

04/05/2012