Sunteți pe pagina 1din 35

1

GENIE ELECTRIQUE ET INFORMATIQUE INDUSTRIELLE

2004-2005

INFORMATIQUE INDUSTRIELLE

LANGAGE C

Compilateur HI-TECH PICL C compiler 117

Pour PIC16F84-16F62X

Compilateur gratuit et documentation constructeur picclite.pdf disponibles sur le site : http://www.htsoft.com/ Environnement de dveloppement MPLAB gratuit et exemples disponibles sur le site de Microchip : http://www.microchip.com/
Cours Langage C PICL C Informatique Industrielle GE&II 1re anne 2004/2005

Version du 16/5/2004

Cours Langage C PICL C

Informatique Industrielle GE&II 1re anne 2004/2005

SOMMAIRE

1. Spcification dune base de numration pour une valeur numrique............................... 4 2. Affectation dune valeur une variable............................................................................. 4 3. Les types des donnes du C et la dclaration des variables et constantes.....................5 3.1. Variables scalaires...................................................................................................... 5
3.1.1. type boolen.................................................................................................................................... 3.1.2. type octet........................................................................................................................................ 3.1.3. type rel........................................................................................................................................... 3.1.4. Pointeurs, signification des symboles * et & placs devant une variable..................................... 5 5 6 8

3.2. Tableaux, chanes de caractres................................................................................8


3.2.1. Tableaux, allocation statique en mmoire adresse ................................................................... 8 3.2.2. Chanes de caractres.................................................................................................................... 9 3.2.3. Tableaux, allocation dynamique en mmoire............................................................................... 10

3.3. Structures et Unions, numrations......................................................................... 10


3.3.1. Structures et unions...................................................................................................................... 10 3.3.2. Union............................................................................................................................................. 11 3.3.3. Enumration.................................................................................................................................. 11

3.4. Dfinition de noms de types par lutilisateur : typedef.............................................. 11 3.5. Constantes................................................................................................................ 12 3.6. Variables locales et variables globales.....................................................................12 4. Expressions / oprateurs.................................................................................................12 4.1. Rgles dvaluation de lexpression ....................................................................... 12 4.2. Oprateurs arithmtiques +, -, *, /, %, ++, --.............................................................13 4.3. logique binaire sur mots (bits bits de mme rang) & , | , ~ .............................. 13 4.4. logique boolenne && , || , ! , comparaisons == , < , >, >= , <= ........................... 14 5. Structures de contrle du droulement en squence..................................................... 15 5.1. Boucles while, do while, for.......................................................................................15
5.1.1. While (tant que)............................................................................................................................. 15 5.1.2. Do While (faire tant que)............................................................................................................... 16 5.1.3. Boucle de rptition For .............................................................................................................. 18

5.2. Branchements conditionnels if , else........................................................................ 20 5.3. Switch - Case (faire - selon le cas)........................................................................... 21 5.4. Branchements inconditionnels................................................................................. 21 6. Fonctions......................................................................................................................... 23 6.1. Introduction............................................................................................................... 23 6.2. Fonction non type................................................................................................... 23
6.2.1. dfinition ou implmentation ou encore criture de la fonction................................................... 23 6.2.2. exemple de fonction sans paramtre :........................................................................................ 23 6.2.3. exemples de fonction avec paramtres :..................................................................................... 24

6.3. Fonction type..........................................................................................................25 6.4. Arguments passs par valeur, par adresse, ou par rfrence................................. 27 6.5. La fonction main........................................................................................................28 6.6. Fonction dinterruption.............................................................................................. 28 7. Programme en langage C............................................................................................... 29 8. Exemple 1 de programme en langage C PIC 16F84...................................................... 31 9. Exemple 2 de programme en langage C PIC 16F84...................................................... 32

Cours Langage C PICL C

Informatique Industrielle GE&II 1re anne 2004/2005

1.

Spcification dune base de numration pour une valeur numrique

Hexadecimal Binaire Octal Dcimal :

: : : :

0xvaleur 0bvaleur 0valeur valeur

exemple : exemple : exemple : exemple :

0x2F 0b10011010 0763 129

Code ASCII

caractre

exemple :

A pour le code ASCII de A

2.

Affectation dune valeur une variable

En C, on utilise le symbole = comme symbole daffectation. Exemple daffectation : y = 27 ; // 27 y

Ceci permet de donner la valeur 27 la variable y. Prenons le cas dune variable y de type octet. Loctet est situ en mmoire des donnes une adresse qui a t attribue par le compilateur. Soit Ptr_y cette adresse. La squence des instructions gnres par le compilateur PIC sera : movlw movwf Remarques : x=y ; et y=x ; nont pas la mme signification. D27 Ptr_y ; 27 en dcimal est place ladresse de la variable

x=0x3F ; a un sens ( x prend la valeur 0x3F ) alors que 0x3F = x ; nen a pas . x=x+1; // x=x-10; // x+1 x-10 x x a un sens : incrmenter x a un sens : enlever 10 la valeur de x

Exemple de permutation lors dun tri des lments dun tableau : if(tab[j]<tab[i]) { temp=tab[i];// tab[i] temp tab[i]=tab[j];// tab[j] tab[i] tab[j]=temp; // temp tab[j] } Attention : Il nest pas possible daffecter des grandeurs de type diffrents mais il existe des fonctions de changement de type. Exemple : char i ; float x=12.35; i=(char)x; // correct donne 12 mais
Cours Langage C PICL C Informatique Industrielle GE&II 1re anne 2004/2005

i=x ; est incorrect

Remarque : Il est possible de combiner affectation et opration. Exemple daffectation prcde dune addition : unsigned char x; x est une variable octet x + = 6; //quivaut : x = x + 6 ;

3.

Les types des donnes du C et la dclaration des variables et constantes

3.1.

Variables scalaires 3.1.1. type boolen

Tous les compilateurs C ne proposent pas ce type de dclaration. Dans le cas du compilateur PIC C LITE il est possible de dclarer des variables boolennes laide du mot rserv bit. Dans le cas le plus courant les compilateurs utilisent pour des valeurs boolennes un octet. Les tats "vrai" et "faux" sont reprsents respectivement par une valeur non nulle et nulle. Exemples de dclaration de variables de type bit : bit init_flag; Le compilateur loge en mmoire vive disponible ce bit. On ne se proccupe pas de son adresse dimplantation en mmoire des donnes. On utilise alors le mot static et le symbole @ si lon doit imposer ladresse de la variable. static bit RA3 @ 5*8+3; RA3 est le bit situ au rang 3 de loctet dadresse 5. 3.1.2. type octet

Il est possible de dclarer des variables octets laide du mot char ou des mots unsigned char. char : plage de variation : -128 , 127 pour 1 octet avec bit de signe. unsigned char : plage de variation : 0 , 255 pour 1 octet sans bit de signe. Pourquoi ce mot rserv et non pas le mot byte qui semble plus appropri ? A cause de lutilisation des octets pour coder les caractres mais il faut remarquer que ce nest pas le seul cas dutilisation. Exemples de dclaration de variables de type char : char NombreImpulsions; char compt0,compt1; Le compilateur se charge de rserver une place une adresse en mmoire vive pour les octets. Dans les programmes nous ne nous proccuperons gnralement pas de ladresse dimplantation de loctet dans la mmoire des donnes. Remarque : en langage C la valeur dadresse est accessible en crivant &compt0 par exemple qui se lit adresse de la valeur compt0.
Cours Langage C PICL C Informatique Industrielle GE&II 1re anne 2004/2005

On souhaite parfois imposer ladresse dimplantation . On utilise alors le mot static et le symbole @.. static unsigned char PORTA @ 0x05;

Le compilateur doit implanter ladresse H05 en mmoire vive loctet de nom PORTA.type entier
Le mot int permet de dclarer des entiers sur plus dun octet .

int unsigned int

: plage de variation sur 16 bits : plage de variation sur 16 bits

: -32768 , 32767 : 0 , 65535

( (

16 valeurs)
valeurs)

16

Exemple de dclaration de variables de type int : int x,y,z; Le compilateur se charge de rserver une place des adresses conscutives en mmoire vive pour ces doubles octets. Dans les programmes nous ne nous proccuperons gnralement pas de ladresse de dbut dimplantation des variables. 3.1.3. type rel

Dans le cas du compilateur PIC C LITE il est possible de dclarer des variables relles sur 24 bits et 32 bits laide des mots rservs float et double. Un nombre rel est rang en mmoire sous la forme :

Bitdesigne * 1 . mantisse*2 ( 1)
Variable Float Bit de signe 1 bit

(EXPOSANT + 127)

avec 0 =< mantisse < 1

Exposant+127 8 bits

Mantisse 15 bits

Lexposant est cod en excs de 127. Ainsi 0 est reprsent par 127. Les bornes extrmes dun rel de type float sont ainsi :

-128

2,9 * 1039

( valeurs les plus proches de 0 ) ( valeurs les plus loignes de 0 )

38 128 3,4* et 2 10

On trouve sur 24 bits : le bit de signe suivi des 8 bits dexposant +127 et enfin les 15 autres bits de la mantisse. Exemples : B F 8 0 0 0 reprsente la valeur 1 1011 1111 1000 0000 0000 0000 ( bit de signe : 1 puis bits dexposant : 011 1111 1 qui correspondent lexposant + 127 ici 0 + 127 et enfin la mantisse 000 0000 0000) 3F 80 00 reprsente la valeur 1 (seul le bit de signe change par rapport -1) 40 00 00 reprsente la valeur 2 ( 100 0000 0 correspond lexposant + 128 ici 1 + 127) 3F 00 00 reprsente la valeur 0.5
Cours Langage C PICL C Informatique Industrielle GE&II 1re anne 2004/2005

3E 80 00 reprsente la valeur 0.25 etc. Le compilateur se charge de rserver une place une adresse en mmoire vive pour les variables de type float, double. Dans les programmes nous ne nous proccuperons gnralement pas de ladresse dimplantation de ces variables.

Cours Langage C PICL C

Informatique Industrielle GE&II 1re anne 2004/2005

3.1.4.

Pointeurs, signification des symboles * et & placs devant une variable

On appelle pointeur ladresse de dbut dimplantation en mmoire dune variable. La dclaration dun pointeur contient linformation du type de variable pointe afin de pouvoir tenir compte de rgles dincrmentation et de dcrmentation des pointeurs. Le nom du pointeur est prcd du symbole * Souvent, on fera prcder les noms de pointeurs de Ptr ou de la lettre p pour bien les diffrencier des noms de variables. int *Ptrx; //Ptrx est un pointeur sur une variable de type int.

Attention, le symbole * est utilis en C dans ce contexte ( dclaration ) pour indiquer que Ptrx est le nom dune adresse alors que dans dautres contextes il aura une autre signification ( cas dune expression arithmtique : symbole de la multiplication ). Remarque concernant larithmtique des pointeurs : Ptrx++ ; Incrmente la valeur de Ptrx de 2 dans ce cas dun pointeur sur un entier car un entier occupe 2 places en mmoire (2 octets). Si Ptrx est le nom de ladresse dune variable, son contenu est dsign par Si x est le nom dune variable, son adresse (pointeur sur le premier octet) est dsigne par &x. Dans ce contexte, l' oprateur & est appel oprateur d'adressage. Ainsi dans le cas dun entier x sur 2 octets :
Mmoire (octets)

* Ptrx.

&x

X X

haut bas

3.2.

Tableaux, chanes de caractres 3.2.1. Tableaux, allocation statique en mmoire adresse


Mmoire (octets)

//dclarations d'un tableau de 3 entiers,. int tab1[3]; temp=tab1[i];// tab1[i] temp

tab1

tab1[0] tab1[1] tab1[2]

Remarques: Le premier lment du tableau est situ lindice 0. i doit tre compris entre 0 et 2 inclus. Chaque entier occupe 2 emplacements en mmoire Le nom, ici tab1, du tableau est le pointeur constant sur le premier lment du tableau. Le nom du tableau est ladresse du premier lment du tableau.
Cours Langage C PICL C

Informatique Industrielle GE&II 1re anne 2004/2005

//dclarations d'un tableau de 6 octets avec initialisation, allocation statique en mmoire. unsigned char tab_seg[]={0x3F,0x06,91,79,102,109};
mmoire

tab_seg

0x3F 0x06 91 79 102 109

tab_seg[0] tab_seg[1] tab_seg[2] tab_seg[3] tab_seg[4] tab_seg[5]

3.2.2.

Chanes de caractres

Une chane de caractres est tout simplement un tableau de code ASCII de caractres termin par la valeur 0. Remarques: Le message est encadr par

"

"

Un code ASCII dun seul caractre est not entre

mmoire

Exemple de dclaration avec initialisation : char message1 [ ] = "bonjour";


message1 b o n j o u r 0x00 message1[0] message1 [1] message1 [2] message1 [3] message1[4] message1 [5] message1 [6]

Valeur de fin de chane : 0

Cours Langage C PICL C

Informatique Industrielle GE&II 1re anne 2004/2005

10

3.2.3.

Tableaux, allocation dynamique en mmoire

Lorsque les programmes manipulent des donnes mobilisant beaucoup despace mmoire ( cas dimages par exemple), ces donnes ne sont places en mmoire que lorsquon les utilise puis lespace mmoire est libr. Le Compilateur PIC C LITE ne propose pas ce type dallocation. char *PtrImage ; PtrImage =new char[1000000]; // allocation dynamique en mmoire de 1000 0000 d octets. delete PtxImage ; // libre lespace allou 3.3. Structures et Unions, numrations

3.3.1.

Structures et unions

Le mots rserv struct permet de dclarer des variables composes de plusieurs champs placs en mmoire des adresses conscutives. Exemples : struct struct_complexe { double m_reel; double m_imaginaire; }im1,im2; struct struct_etudiant { char m_nom[10]; int m_note[5]; } etudiant1, etudiant2, etudiant3; On accde au champ dune variable structure en faisant suivre le nom de la variable du nom du champ ( on dit aussi le membre de la variable ). Exemples : im1.m_reel=2.3; im1.m_imaginaire=5; etudiant1.m_nom[]= "Toto";

Dclaration dune structure compose de 8 bits partir de ladresse 0x6. Le champ B0 est le bit de rang 0 de PORTB et le champ B7 est le bit de rang 7 de PORTB : struct { unsigned B0 : 1; // bit de rang 0 unsigned : 6; // bits de rang 1 6 inutiliss unsigned B7 : 1; // bit de rang 7 } PORTB @0x6; On pourra crire : if ( PORTB.B0) pour tester ltat du bit de rang 0 de port B.

Cours Langage C PICL C

Informatique Industrielle GE&II 1re anne 2004/2005

11
3.3.2. Union Le mot rserv union permet de dclarer des variables de diffrents types et tailles, variables qui se recouvrent en mmoire. x1.DoubleOctet union struct_16bits { unsigned int DoubleOctet; unsigned char Octet[2]; x1.Octet[1] x1.Octet[0] } x1,x2,x3; 3.3.3. Enumration

Le mot rserv enum permet de dclarer des noms dont les tats possibles sont dfinis par numration. Exemple 1 : enum {rouge,vert,orange} couleur_feu; La variable de nom couleur_feu peut se voir affecter les valeurs rouge (0) , vert (1) , orange (2) . Exemple 2 : enum {PB ,OK} EtatMachine; 3.4. Dfinition de noms de types par lutilisateur : typedef

Le mot rserv typedef permet de dclarer des noms de type par lutilisateur. //exemple de dfinition du nouveau nom de type byte : typedef unsigned char byte ; On pourra alors crire : byte x;

Souvent, on fera prcder les noms de type de t_ pour bien les diffrencier des noms de variables. //dfinition de t_complexe typedef struct stuct_complexe { double m_reelle; double m_imaginaire; } t_complexe; On pourra alors crire : t_complexe x; puis x. m_reelle=0.5 ; . m_imaginaire=2.5 ; //dfinition de t_booleen typedef enum { faux ,vrai} t_booleen; On pourra alors crire : t_booleen etat_moteur;

Cours Langage C PICL C

Informatique Industrielle GE&II 1re anne 2004/2005

12

Dclaration dun type dune structure compose de 8 bits du rang 0 au rang 7dun octet. typedef struct { unsigned pompe:1, evacuation:1, b2:1, b3:1, b4:1, b5:1, b6:1, b7:1; } t_bitv; On pourra alors crire : t_bitv actionneurs;

actionneurs.pompe=1;

3.5.

Constantes

Le mot rserv const permet de dclarer des noms de valeurs constantes par lutilisateur. Exemple : const unsigned char VERSION = 3;

On ne peut pas affecter une constante. VERSION =5; provoque un message derreur lors de la compilation.

3.6.

Variables locales et variables globales

En langage C tout nom de variable doit tre dclar. Une variable est globale si elle est dclare en dbut de programme. Elle est alors connue dans tout le programme. Une variable est locale si elle est dclare l'intrieure d'une fonction. Elle est alors connue seulement dans le corps de la fonction.

4.

Expressions / oprateurs

4.1.

Rgles dvaluation de lexpression

Les calculs se font en tenant compte de lordre de priorit que peut modifier lutilisation de parenthses. Si les oprateurs sont de mme ordre de priorit l' valuation progresse de gauche droite et s'arrte ds qu'on peut conclure.
Cours Langage C PICL C Informatique Industrielle GE&II 1re anne 2004/2005

13

4.2.

Oprateurs arithmtiques +, -, *, /, %, ++, --

Oprateurs portant sur deux oprandes + - * / % o o L'oprateur % donne le reste de la division entire (modulo). La division de deux entiers donne un quotient entier.

Exemple dinstructions : // variables de type int unite=x%10; dizaine=(x/10)%10; centaine=x/100; // variables de type double module = sqrt (x*x+y*y) // sqrt fonction racine carr Dans l'ordre de priorit dexcution, on aura : * et / , % puis + et Oprateurs portant sur un seul oprande i++ pour incrmentation de i ainsi i++ ; donne le mme rsultat que i = i+1 ; i - - pour dcrmentation de i ainsi i - - ; donne le mme rsultat que i = i -1 ;

++ ou plac devant le nom de la variable indique que lincrmentation ou la dcrmentation doit tre faite de avant les autres oprations.

4.3.

logique binaire sur mots (bits bits de mme rang) & , | , ~

Ces oprateurs ne s'appliquent qu'aux types octets (en gnral naturel : unsigned ), agissent bit bit sur la reprsentation interne en base 2. Dans l'ordre de priorit dexcution, on aura : ~ << >> & I ^ Complment 1 (permet de changer les tats des bits) Dcalage gauche (permet de multiplier par 2, 4, ......) Dcalage droite (permet de diviser par 2, 4, ..........) Et logique (permet de mettre des bits 0) Ou logique (permet de mettre des bits 1) Ou exclusif (permet de changer les tats des bits, de dceler des changements dtats des bits)

Exemple 1 de dcalage droite: unsigned char portb; portb=portb>>2; aprs 2 dcalages :

1 1 1 0 1 0 0 1 1 0 0 1 1 1 0 1 0 1 1 0 1 0 1 0 0 0 1 0 0 0 0 0 1 0 0

Exemple 2 de mise 1 du bit de rang 2 de portb:


Cours Langage C PICL C

ou bit bit

Informatique Industrielle GE&II 1re anne 2004/2005

14
portb=portb|0x04;

1 0 1 0 1 1 0 0
Remarque : le compilateur PIC CLITE permet de manipuler des noms de bits. Ainsi on peut crire : RB2=1 ;

Exemple 3 de mise 1 du bit de rang 2 de portb: portb | = 0x04;

Exemple 4 de mise 0 du bit de rang 2 de portb: portb & = 0xFB;

et bit bit

1 0 1 0 1 1 0 0 1 1 1 1 1 1 0 1 1 1 1 0 1 0 1 0 0 0

Remarque : le compilateur PIC CLITE permet de manipuler des noms de bits. Ainsi on peut crire : RB2=0 ;

4.4.

logique boolenne

&& , || , ! , comparaisons == , < , >, >= , <=

Appliqus des oprandes numriques, les oprateurs logiques produisent un rsultat "boolen" : 1 (pour vrai) ou 0 (pour faux). Dans l'ordre de priorit dexcution, on aura : La ngation Les comparaisons Les comparaisons Le et logique Le ou logique ! < <= = = (identique) && II

>= ! = (diffrent de)

>

Toute valeur diffrente de 0 est considr comme vrai en langage C.

Exemples dutilisation des oprateurs logiques:

if( (PresenceVoiture == 1) && (NbreVoitures < NbreMax)) { ouvrir_barriere(); NbreVoitures++; }

Autre exemple dutilisation :

Cours Langage C PICL C

Informatique Industrielle GE&II 1re anne 2004/2005

15

//t est-il le code ascii dune lettre ? if (((t>='a') && (t<='z')) || ((t>='A') && (t<='Z'))) { //cas dune lettre }

Cas particulier dutilisation dune expression toujours vrai : 1>0 . //pour une boucle sans fin while(1>0) {//debut de boucle sans fin //instructions dans la boucle }//fin de boucle sans fin

Autre cas particulier dutilisation dune expression toujours vrai : 1 . while(1) {} pour une boucle sans fin sans instructions dans la boucle

5.

Structures de contrle du droulement en squence 5.1. Boucles while, do while, for

5.1.1.

While (tant que) scrit en langage C :

Tant quune condition est vrai faire while(expression) { instructions; } //while expression

Exemple de test de PORTB suppos en entre dans une commande de machine laver : while(PORTB< 60 ) { chauffage() ; }

Exemple dattente que RB7 soit 1 (RB7 suppos en entre) dans le cas du test du LCD occup (carte IUT2 + LCD).
Cours Langage C PICL C Informatique Industrielle GE&II 1re anne 2004/2005

16

while(RB7==1){} //remarquer == pour la comparaison

Exemple de test de fin de message : while(*message!=0) //Note:la fin dun message est indique par la valeur 0 { LCD_car(*message); message++; }

Exemple de boucle sans fin : while(1) // faire toujours { PORTA=etat1; // tat 1 du port while(inter0==0){} //remarquer PORTA=etat2; // tat 2 du port while(inter1==0){} PORTA=etat3; // tat 3 du port while(inter2==0){} }

A == pour la comparaison A A

5.1.2.

Do While (faire tant que)

Faire tant quune condition est vrai scrit en langage C : do { instructions; } //do expression while (expression);

Exemple : float milieu; float a=0.0; float b=7.0; do { milieu=(a+b)/2; if(f(a)*(f(milieu))<0) b=milieu; else a=milieu; }
Cours Langage C PICL C

while((b-a)>0.001); f(x) ) x milieu

Informatique Industrielle GE&II 1re anne 2004/2005

17

Dans le cas de la figure la solution devra tre recherche entre a et milieu. On aura alors un segment de recherche 2 fois plus petit que le segment prcdent. On fixe comme condition darrt une prcision sur la valeur de la racine donc sur la largeur b-a.

Cours Langage C PICL C

Informatique Industrielle GE&II 1re anne 2004/2005

18

5.1.3.

Boucle de rptition For

Pour rpter un bloc dinstructions on crira : for(tat initial du compteur de boucles;condition d'arrt;gestion du compteur de boucles) { instructions; .....; }//fin de la boucle

Exemple de calcul de la somme des 100 valeurs dun tableau : S=0 ; // 0S for(i = 0 ; i <100 ; i ++) { S=S+tab[i];// tab[i]+SS }

Exemple de cration de 8 tops sur la broche RA3 : for(i=0;i<8;i++) // 8 tops d' horloge { RA3=1; // mise 1 tempo(2); //temporisation qui doit tre crite par ailleurs RA3=0; //mise 0 tempo(2); //temporisation }

Exemple de temporisation : for(i = 0 ; i <500 ; i ++) { //cas particulier ou on ne fait rien dans la boucle } Equivalent : for(i = 0 ; i <500 ; i ++); //(surtout ne pas omettre le ;)

Exemple dinitialisation 0 de toutes les valeurs dun tableau 2 dimensions: for(i=0;i<16;i++) // 8 tops d' horloge { for(j=0;j<8;j++) { tab_x[i,j]=0; 0 tab_x[i,j] } } Remarque : on utilisera i, j, k, comme noms dindices des boucles de rptition. Ces variables seront dclares de faon locale.
Cours Langage C PICL C Informatique Industrielle GE&II 1re anne 2004/2005

19

Exemple particulier de boucle sans fin : for(;;) { //programme mettre ici }

Exemple dune fonction dintgration par la mthode des rectangles : typedef double (*pfct)(double); //dclaration d'un pointeur sur une fonction qui renvoie une valeur de type //double et reoit une valeur de type double // fonction qui reoit les bornes a et b et le nombre de pas dintgration n ainsi que le nom de la fonction //intgrer // la fonction Integre retourne la valeur de lintgrale de a b de la fonction double Integre(double a,double b,double n,double(*pf)(double x)) { double Ip=0.0 ; double x,dx ; dx= abs(b-a)/n ;//largeur dun rectangle for(double x=a;i<=b;x=x+dx) // somme des f(a+ i*dx) { Ip=pf(x)+Ip; } Ip= dx*Ip //// somme des aires des rectangles return(Ip); } f(x) )

a dx

Exemple de fonction de tri selon les valeurs croissantes des valeurs dun tableau: Void tri(int iNbElement, typ *tab) { float temp; for(int i=0;i<=iNbElement-2;i++) { for(int j=i+1;j<=iNbElement-1;j++)//tab[0] tab[i]tab[i+1] tab[n] { if(tab[j]<tab[i]) Tableau tri Tableau restant trier { temp=tab[i];// tab[i] temp
Cours Langage C PICL C Informatique Industrielle GE&II 1re anne 2004/2005

20
tab[i]=tab[j];// tab[j] tab[i] tab[j]=temp; // temp tab[j] permutation } } } }

5.2.

Branchements conditionnels if , else

Dans le cas ou seulement si une condition est vrai il faut effectuer une ou plusieurs instructions on crira : if (expression) instruction ou bloc dinstructions effectuer si lexpression donne un rsultat vrai Exemple dun test de prsence de voiture dans une gestion de parking : if((PresenceVoiture == 1) && (NbreVoitures < NbreMax)) { ouvrir_barriere(); NbreVoitures++; }

Exemple de permutation de deux lments dun tableau lors dun tri des lments dun tableau : if(tab[j]<tab[i]) //alors quon souhaite tab[j]>tab[i] { temp=tab[i];// tab[i] temp tab[i]=tab[j];// tab[j] tab[i] tab[j]=temp; // temp tab[j] } Cas de lalternative double :si la condition est vrai alors effectuer linstruction 1 ou le bloc d'instructions 1 autrement faire linstruction 2 ou le bloc d'instructions 2. if (expression) { instructions; }//if exp else { instructions; .....; }//else exp } Exemple de choix dans la recherche de la solution approche de f(x)=0 . milieu=(a+b)/2 if(f(a)*(f(milieu))<0) { b=milieu; } else { a=milieu;
Cours Langage C PICL C

f(x) )

x milieu

Informatique Industrielle GE&II 1re anne 2004/2005

21

Dans le cas de la figure la solution devra tre cherche entre milieu et b

5.3.

Switch - Case (faire - selon le cas)

Faire selon la valeur dune expression un blocs dinstructions scrit : switch (expression) { case val0:{instructions;break;} case val1:{instructions;break;} case val2:{instructions;break;} case val3:{instructions;break;}

default :{instructions;} }//fin de faire selon la valeur de expression Il faut utiliser break sinon tous les cas qui suivent le premier cas vrai sont alors excuts. Exemple de programme de test du port B et daffectation du port A : void { main() while(1) //boucle sans fin car 1 est lquivalent de toujours vrai { TRISA=0; //PORT A en sortie switch (PORTB) //selon la valeur du PORT B { case 0: PORTA=0x01;break; // cas ou le PORT B vaut 0 case 1: PORTA=0x02;break; // si le PORT B vaut 1 case 3: PORTA=0x04;break; // si le PORT B vaut 3 case 6: PORTA=0x06;break; // si le PORT B vaut 6 default: PORTA=0x00; // autrement } } }

5.4.

Branchements inconditionnels

Break (interrompre), Continue (continuer), Goto (aller ) Return (retourner) Exit (sortir) Exemple dutilisation de break : switch (PORTB)
Cours Langage C PICL C Informatique Industrielle GE&II 1re anne 2004/2005

22
{ case 0: case 1: case 3: case 6: default: } PORTA=0x01;break; PORTA=0x02;break; PORTA=0x04;break; PORTA=0x06;break; PORTA=0x00;

Il faut utiliser break sinon tous les cas qui suivent le premier cas vrai sont alors excuts.

Cours Langage C PICL C

Informatique Industrielle GE&II 1re anne 2004/2005

23

6.

Fonctions 6.1. Introduction

Une fonction est un sous-programme utilis par le programme principal ou par d'autres fonctions. Si la fonction retourne un rsultat, elle est dite type, sinon elle est dite non type. Le programme principal est dsign par main()

6.2. 6.2.1.

Fonction non type dfinition ou implmentation ou encore criture de la fonction

1. On dfinit ainsi une fonction de nom nom_de_fonction : void nom ( type0 param0, type1 param1,....., typen paramn ) //ligne dite de prototypage { dclarations.... instructions.... }//nom param0,param1, paramn sont les paramtres de la fonction ou encore les arguments de la fonction.

2. On utilise ou encore on appelle ainsi une fonction de nom nom_de_fonction: nom_de_fonction(par1,par2,...,par3); par1,par2,...,par3 sont les paramtres de la fonction. Les noms utiliss sont choisis independemment des noms choisis lors de la dfinition de la fonction. 6.2.2. exemple de fonction sans paramtre :

void tempo1(void) { unsigned int i; for(i=0;i<2000;i++) {}//on boucle sur un bloc dinstructions vide } On utilise ainsi cette fonction de nom tempo (ne pas oublier les parenthses et le point-virgule). tempo1();

Autre exemple : gnration dun top d'horloge en RA2 void { LCD_Clk() RA2=1; asm("nop"); RA2=0; }

Cours Langage C PICL C

Informatique Industrielle GE&II 1re anne 2004/2005

24

On utilise ainsi cette fonction de nom LCD_Clk LCD_Clk();

6.2.3.

exemples de fonction avec paramtres :

Cas dun seul paramtre. Exemple : temporisation de dure fonction dune variable de type int void tempo2(int delai) { int i; for(i=0;i<delai;i++) { tempo1(); } } On utilise ainsi cette fonction de nom tempo2 tempo2(5); tempo2(200); tempo2(temps); //temps doit tre connue comme de type int et affect une valeur. tempo2(5.6);// nest pas valable

Autre exemple : //choix de positionnement du caractre sur le LCD //ligne octet valant 1 ou 2 // position octet valant 0 15 void LCD_pos(char ligne, char position) { LCD_busy(); // attendre que le lcd soit prt RS=0; RW=0; // mode criture dinstructions if(ligne==1) PORTB=0x80|position; if(ligne==2) PORTB=(0x80|position)+64; // +64 = adresse de la 2eme ligne LCD_Clk(); } On utilise par exemple ainsi cette fonction de nom LCD_pos LCD_pos(2, 10) ;//passage en ligne 2 en position 10

Autre exemple : sauvegarde la valeur de la variable compt en EEPROM ladresse adr eeprom_write(adr,compt);

Cette fonction permet dcrire dans lEEPROM des donnes.

Cours Langage C PICL C

Informatique Industrielle GE&II 1re anne 2004/2005

25

6.3.

Fonction type

- On dfinit ainsi une fonction de nom nom_de_fonction : type retourn nom_de_fonction( type0 param0, type1 param1,..., typen paramn ) { dclarations.... instructions.... return (resultat); }//nom

- On utilise ainsi une fonction de nom nom_de_fonction : identificateur = nom_de_fonction(par1,par2,...,par3); Exemple dune fonction de nom factoriel qui retourne le factoriel de la valeur passe en paramtre: // implmentation de la fonction factoriel // paramtre pass en entre : n de type entier // paramtre retourn : un rel, le factoriel du paramtre pass. float factoriel(int n) { //dbut de la fonction de calcul de factoriel int i; float produit; produit =1; for (i=1;i<=n;i++) { produit=produit*i; }//fin de for i return produit; }//Fin de factoriel On pourra alors crire dans un programme lappel de cette fonction : y=factoriel(x) ; Autre exemple : // implmentation de la fonction fmodule // paramtres passs en entre : x,y parties rel et imaginaire de type double // paramtre retourn : un double : le module double fmodule(double x, double y) { //dbut de la fonction de calcul du module double module; module=sqrt(x*x+y*y); return module; }//Fin de fmodule On pourra alors crire dans un programme lappel de cette fonction : ro=fmodule(x,y) ; Exemple de lecture de la valeur ladresse adr en EEPROM
Cours Langage C PICL C Informatique Industrielle GE&II 1re anne 2004/2005

26
valeur=eeprom_read(adr);

Cours Langage C PICL C

Informatique Industrielle GE&II 1re anne 2004/2005

27

6.4.

Arguments passs par valeur, par adresse, ou par rfrence

Trois cas sont possibles: type param correspond un passage par valeur. type *param correspond un passage par adresse. type &param correspond un passage par rfrence. Lors du passage par valeur dun paramtre loriginal de la valeur est prserv en faisant une copie pour la fonction. La fonction ne touche pas loriginal mais manipule une copie. Exemple de mauvaise implmentation de la fonction qui permute les valeurs de 2 variables : void fpermute0(int arg1, int arg2) { int temp; temp=arg1 ; arg1=arg2; arg2=temp ; } Appel de la fonction fpermute0 si x et y sont les noms des 2 variables dont les valeurs sont changer : fpermute0(x, y) ; Lors du retour aprs excution de la fonction les valeurs originales de x et y sont rcupres. La permutation de x et de y na pas t effectues sur les valeurs originales de x et y mais sur des copies. Exemple de passage par adresse : Implementation de la fonction qui permute 2 valeurs de 2 variables : void fpermute1(int *ptr_arg1, int *ptr_arg2) ptr_arg1 { int temp; temp= *ptr_arg1 ; // ( ptr_arg1 ) temp *ptr_arg1= *ptr_arg2; // ( ptr_arg2 ) ( ptr_arg1 ) ptr_arg2 *ptr_arg2= temp ; // temp ( ptr_arg2 ) } Appel de la fonction fpermute1 si x et y sont les noms des 2 variables dont les valeurs sont changer : fpermute1(&x, &y) ; //&x se lit adresse de x, &y se lit adresse de y Laccs aux 2 variables a t possible en fournissant leurs adresses . temp

mmoire dans la fonction et dans le programme dappel :

x originaux y

arg1 Copies de x et y arg2

mmoire dans la fonction et dans le programme dappel :

x y

temp

Exemple de passage par rfrence : Implementation de la fonction qui permute 2 valeurs de 2 variables : void fpermute2(int &arg1, int &arg2) { int temp; temp=arg1 ; arg1=arg2;
Cours Langage C PICL C Informatique Industrielle GE&II 1re anne 2004/2005

28
arg2=temp ; } Appel de la fonction fpermute2 : fpermute2(x, y) ; 6.5. La fonction main

La fonction main() est obligatoire dans un programme. Elle est comme le chef d'orchestre. Sans elle aucun programme n'est excut. Dans le cas du PIC16F84, cette fonction est lance lors de la mise sous tension. Remarque : Il ny aura quune fonction main() dans un programme. 6.6. Fonction dinterruption

Une fonction dinterruption correspond un programme dinterruption. Exemple dincrmentation dune variable lors dune interruption externe RB0 tester sur la carte IUT1 char g_nbre_interrupt_RB0; //variable globale void interrupt int_RB0(void) { g_nbre_interrupt_RB0++; INTF = 0;//autorisation nouveau de it externe de RB0 } void { main() __CONFIG(XT&WDTDIS&PWRTEN); //oscillateur XT Watch Dog Timer DISable g_nbre_interrupt_RB0=0; TRISA=0; //PORT A en sortie PORTA=0; //Sorties 0 INTCON=0b10010000;//validation it externe de RB0 while(1) { //boucle sans fin du programme principal ici if(g_nbre_interrupt_RB0<16) { PORTA= g_nbre_interrupt_RB0|0b10000; //affichage } else { PORTA=0x0 ;//diode verte allume } } }

Cours Langage C PICL C

Informatique Industrielle GE&II 1re anne 2004/2005

29

7.

Programme en langage C

Un programme C sera constitu de: 1. 2. 3. 4. 5. 6. une entte l'appel des bibliothques les dfinitions de types, les assignations la dclaration des constantes et des variables globales (le moins possible) la dclaration et l'criture des fonctions (presque tout). le programme principal.

1. une entte /* fichier xx.c dans xx.pjt auteur, date, version, cible, informations utiles fonction : compteur sur PORT B avec bouton de RAZ en RA1 et mmorisation de la valeur du compteur en EEPROM */ 2. l'appel des bibliothques #include <pic.h> 3. les dfinitions de types, les assignations typedef unsigned char byte; 4. la dclaration des constantes et des variables globales #define PORTBIT(adr,bit) ((unsigned)(&adr)*8+(bit)) static bit g_boutonRAZ @ PORTBIT(PORTA,1); 5. la dclaration et l'criture des fonctions // temporisation void tempo(void) { unsigned int i; for(i=0;i<2;i++);//temporisation } 6. programme principal void { main() __CONFIG(RC&WDTDIS&PWRTEN); //oscillateur RC Watch Dog Timer DISable byte compt; TRISB=0; compt=eeprom_read(5);Recuperation EEPROM du compteur en 5 PORTB=0; while(1) { compt++; if (g_boutonRAZ==1) compt=0;//remise zero PORTB=compt; tempo();//temporisation eeprom_write(5,compt);//sauvegarde EEPROM en adresse 5
Cours Langage C PICL C Informatique Industrielle GE&II 1re anne 2004/2005

30

}//fin de while(1) }//fin de main

Cours Langage C PICL C

Informatique Industrielle GE&II 1re anne 2004/2005

31

8.

Exemple 1 de programme en langage C PIC 16F84

/*

fichier xx.c dans xx.pjt auteur : titre : programme de gestion de la carte IUT PIC CAN 2001 cible : pic16F84, compilateur C:\PICLITE\BIN\PICL.EXE

*/ #include <pic.h> #define #define #define #define #define #define AFFICHEUR PORTB // vers l'afficheur 7 segements DIZAINE RA1 // validation de l'afficheur des dizaines UNITE RA0 // validation de l'afficheur des units CS RA2 // CS du convertisseur TLC548 ou 549 H RA3 // Horloge du convertisseur TLC548 ou 549 OUT RB7 // Sortie (srie) du convertisseur TLC548 ou 549

//transcodage binaire 4 bits 7 segments unsigned char tab_seg[]={63,6,91,79,102,109,125,7, 127,111,119,124,57,94,121,113}; /*initialisation : PORT B rang 0 en sortie, CS 0 et H 0 */ void init() { TRISB=0x80; TRISA=0x00; CS=1; H=0; } rang 6 en sortie, rang 7 en entre, PORT A

//temporisation environ 10 microsecondes x delai void tempo(int delai) { int i; for(i=0;i<delai;i++); //boucles } //lecture du convertisseur analogique-numrique unsigned char lire_convertisseur() { unsigned char octet; unsigned char j; octet=0; CS=0; tempo(2); //temporisation for(j=0;j<8;j++) // 8 tops d' horloge { H=1; octet=octet<<1; if (OUT==1) octet=octet|0x01; tempo(2); //temporisation H=0; tempo(2); //temporisation
Cours Langage C PICL C Informatique Industrielle GE&II 1re anne 2004/2005

32
} CS=1; return octet; } //affichage hexadcimal dun octet void affiche_octet(unsigned char octet) { UNITE= 1; DIZAINE=0; AFFICHEUR=tab_seg[octet>>4]; tempo(500); //attendre environ 5 ms DIZAINE=1; UNITE= 0; AFFICHEUR=tab_seg[octet&0x0F]; tempo(500); // attendre environ 5 ms } //programme principal daffichage de la valeur lue sur le convertisseur void main() { unsigned char octet; __CONFIG(XT&WDTDIS&PWRTEN); //oscillateur XT Watch Dog Timer DISable //__CONFIG(0xF29);// si 16F628 oscillator XT Watch Dog Timer disable //CMCON=7; //si 16F628 PORT B utilis comme port parallle init(); while(1) { octet=lire_convertisseur(); affiche_octet(octet); } }

9.

Exemple 2 de programme en langage C PIC 16F84

/* Programme pour la carte IUT2 TP12 fonctions de gestion du LCD pour essais en pas pas NBRE_PLACES=5 */ #include <pic.h> #define #define #define #define #define const RS RA0 RW RA1 E RA2 BUSY RB7 LCD PORTB NBRE_PLACES=120;

et tempo2(2) et i<5 dans tempo1

char message1[]="120 Places"; char message2[]="Reste "; //temporisation d'environ 1 milliseconde avec un quartz 4 MHz
Cours Langage C PICL C Informatique Industrielle GE&II 1re anne 2004/2005

33
void tempo1() { int i; for(i=0;i<50;i++); } //temporisation d'environ x millisecondes avec un quartz 4 MHz void tempo2(int delai) { int i; for(i=0;i<delai;i++) { tempo1(); } } //demande d'criture LCD_clk void LCD_clk() {//debut de la fonction LCD_clk E=1; asm("nop"); //attendre 1s E=0; }//fin de LCD_clk //fonction d'initialisation du LCD void LCD_init() { TRISA=0x18; TRISB=0; PORTA=0; //avant la temporisation pour stabiliser les lignes du LCD tempo2(20); LCD=0x3F; RS=0; //mode instruction du LCD RW=0; //criture dans le LCD LCD_clk(); tempo2(20); LCD=0x0F; RS=0; RW=0; LCD_clk(); tempo2(20); LCD=0x01; RS=0; RW=0; LCD_clk(); tempo2(20); } //attendre que le LCD soit prt void LCD_busy() { TRISB=0x80; //passe la ligne RB7 en entre E=1; RS=0; RW=1; while(RB7==1); E=0; TRISB=0x00; //passe la ligne RB7 en sortie }
Cours Langage C PICL C Informatique Industrielle GE&II 1re anne 2004/2005

34

//fonction envoi d'un caractre au LCD void LCD_car(char c) { LCD_busy(); RS=1; RW=0; LCD=c; LCD_clk(); } //criture d'un message au LCD void LCD_string(char *message) //*message signifie le contenu de message { while(*message!=0) { LCD_car(*message); message++; } } //choix de ligne 1 ou 2 et de position du curseur 1 16 void LCD_pos(char ligne, char position) { char adresse; if(ligne==1) adresse=position-1; if(ligne==2) adresse=position-1+64; LCD_busy(); RS=0; RW=0; LCD=(adresse)|0x80; LCD_clk(); } //initialisation des ports void PORT_init() { TRISA=0x18;//RA3 et RA4 en entres RA2, RA1, RA0 en sorties TRISB=0x00;// port B en sortie tempo2(20); } //initialisation du compteur TMR0 void TIMER0_init() { T0SE=0; T0CS=1; PSA=1; TMR0=0; } //fonction principale d'affichage du nombre de voitures void main() { char voitures_disponible; __CONFIG(XT&WDTDIS&PWRTEN); //si 16F84 osc. XT Watch Dog Timer DISable //__CONFIG(0xF29);// si 16F628 oscillator XT Watch Dog Timer disable //CMCON=7; //si 16F628 PORT B utilis comme port parallle PORT_init();//initialisation des ports TIMER0_init();//initialisation du compteur TMR0
Cours Langage C PICL C Informatique Industrielle GE&II 1re anne 2004/2005

35
LCD_init();//initialisation du LCD LCD_string(message1);//message premiere ligne LCD_pos(2,1); LCD_string(message2);//message seconde ligne while(1) { voitures_disponible=NBRE_PLACES-TMR0; LCD_pos(2,14);//ligne 2 position 14 du LCD LCD_car(voitures_disponible/100+0x30);//affichage des centaines LCD_car((voitures_disponible%100)/10+0x30);//des dizaines LCD_car(voitures_disponible%10+0x30);//des unites tempo2(50); } }

Cours Langage C PICL C

Informatique Industrielle GE&II 1re anne 2004/2005

S-ar putea să vă placă și