Vous êtes sur la page 1sur 7

STI2DSIN

INITIATION AU LANGAGE C SUR MICROCONTROLEUR PIC (CORRECTION) dure 3 heures environ

page 1 / 7

INITIATION AU LANGAGE C SUR PIC DE MICROSHIP


I. Historique du langage C
1972 : naissance du C dans les laboratoires BELL par Dennis Ritchie et dveloppement du systme d'exploitation UNIX. 1978 : vulgarisation du langage et sortie du livre de B. Kernighan et D. Ritchie "The C programming language". 1983 : normalisation A.N.S.I du langage C. Ce travail commence en 83 et dure 5 ans. 1988 : existence d'une norme : " C-ANSI ". La 2me dition du livre de Kernighan et Ritchie devient la rfrence.

IV. Structure dun programme en C


/* Tout ce qui se trouve entre ces symboles est du commentaire */ // Ce qui est droite de ces symboles est galement du commentaire void main() // Un programme en C comporte au moins une fonction // principale appele main. // Nous verrons plus loin le terme void. Les accolades dfinissent lintrieur de la fonction. Les espaces doivent tre remplacs par _ Les fonctions sont spare par un ; Attention la casse car le C fait la diffrence entre minuscules et majuscules. On aligne les accolades et on dcale le corps de la fonction par souci de lisibilit.

II.

Les qualits du langage C

// // fonction_1() ; // fonction_2() ; // fonction_n() ; // // // //

Le langage C est : PORTABLE : Les modifications d'un programme pour passer dun systme un autre sont minimes. COMPLET : Un texte C peut contenir des squences de bas niveau (proches du matriel) en assembleur. SOUPLE : Tout est possible en C mais une grande rigueur simpose. EFFICACE : On rflchit (devant une feuille de papier) et on crit (peu).

Le programme doit galement contenir la dfinition des diffrentes fonctions cres par le programmeur (voir IX. Les Fonctions). Les fonctions doivent tre dfinies (au moins leur prototype) avant dtre appeles par une autre fonction. Le langage C comporte des bibliothques de fonctions prdfinies sous forme de fichiers comportant lextension .h. Ces fonctions seront ajoutes au programme excutable lors de ldition de liens. Pour incorporer dans un programme un fichier .h, on utilise la commande #include <fichier.h> place habituellement en dbut de fichier. Exemples :
#include <htc.h> // // // // // htc.h contient des fonctions ralisant des temporisations logiciels. Grce ce fichier .h, le compilateur connat ladresse de chaque registre et port Ex : PORTB correspond ladresse 06, etc.

III. Notion de filire de dveloppement


On dsigne ainsi lensemble des outils qui interviennent entre le texte source C et le code objet tlcharg dans le microcontrleur PIC. Les tapes de gnration dun programme crit en langage C sont : Ldition du fichier source mon_programme.C avec un diteur de texte (simple sans mise en forme du texte). La compilation du fichier source pour obtenir un fichier objet : mon_programme.ASM. La compilation est la transformation des instructions C en instructions assembleur pour microcontrleur PIC. Ldition de liens permet dintgrer des fonctions prdfinies. Le programme auxiliaire diteur de liens (linker ou binder) gnre partir du fichier mon_programme.ASM un fichier excutable mon_programme.HEX compatible avec le PIC. Remarque : le cours suivant repose sur le compilateur PICC de HI-TECH
Code source : mon_programme.C

#include <pic16f877a.h>

V.

Composition dun programme en C

Un programme en C utilise 2 zones mmoire principales : La zone des VARIABLES est un bloc RAM o sont stockes des donnes manipules par le programme. La zone des FONCTIONS et CONSTANTES est un bloc ROM qui recevra le code excutable du programme. Avant dutiliser une variable, une fonction ou une constante, il faut la dclarer afin dinformer le compilateur de son existence. Leur nom que l'on utilise est un identificateur. Leur criture doit : Utiliser les lettres de l'alphabet, de a z, et de A Z, les chiffres de 0 9 (sauf pour le premier caractre), le soulign ( _ ). Ne contenir ni espace, ni caractre accentu. tre reprsentative de leur rle dans le programme.

Compilateur

Code objet :

mon_programme.ASM

diteur de liens

Programme excutable :

mon_programme.HEX

Lancement du programme

STI2DSIN

INITIATION AU LANGAGE C SUR MICROCONTROLEUR PIC (CORRECTION) dure 3 heures environ

page 2 / 7

VI.

Les diffrents types de valeur du langage C


+

B. Les oprateurs arithmtiques


Exemple : a = 5 ; b = 4 ; x = a+b ; // rend la somme de a et b. // x vaut 9 Exemple : a = 5 ; b = 4 ; x = a-b ; // rend la soustraction de a et b. // x vaut 1 Exemple : a = 5 ; b = 4 ; x = a*b ; // rend la multiplication de a et b. // x vaut 20 Exemple : a = 10 ; b = 3 ; x = a/b ; // rend le quotient de la division // entire de a et b. // x vaut 3 Exemple : a = 10 ; b = 3 ; x = a%b ; // // // // rend le reste de la division entire de a et b. x vaut 1 % se prononce modulo

Toutes les valeurs (constantes et variables) utilise en C sont classes selon des types. Un type dcide de loccupation mmoire de la donne. Pour dclarer correctement une variable ou une constante, il faut donc savoir auparavant ce quelle va contenir. On distingue les types suivants :
char a ; unsigned char b ; int c ; unsigned int d ; long e ; // Dclare un entier sign 8 bits [-128 +127 ] // Dclare un caractre non sign 8 bits [0 255] // Dclare un entier sign 16 bits [-32768 +32767 ] // Dclare un entier non sign 16 bits [0 65535] // Dclare un entier sign 32 bits // [-2147483648 +2147483647] // Dclare un entier non sign 32 bits // [0 4292967295] // Dclare un rel sign 32 bits dont la valeur // absolue est comprise entre 3,4.10-38 et 3,4.10+38 // Dclare un rel sign 64 bits dont la valeur // absolue est comprise entre 1,7.10-308 et 1,7.10+308 // Dclare un rel sign 80 bits dont la valeur // absolue est comprise entre 3,4.10-4932 et 3,4.10+4932

unsigned long f ;

float g;

C. Les oprateurs de manipulation de bits


~ Exemple : a = 0b0110 ; x = ~a ; // rend le complment de a. // x vaut 0b1001

double h;

&

long double i;

Exemple : a = 2 ; b = 3 ; x = a&b ; // rend le ET bit bit de a et b. // x vaut 0b10 Exemple : a = 2 ; b = 5 ; x = a|b ; // rend le OU bit bit de a et b. // x vaut 0b111 Exemple : a = 2 ; b = 7 ; x = a^b ; // rend le OU EXCLUSIF bit // bit de a et b. // x vaut 0b101 Exemple : a = 2 ; b = 1 ; x = a>>b ; // // // Exemple : a = 2 ; b = 3 ; x = a<<b ; // // // rend la valeur de a dcale droite de b bits. x vaut 0b01 rend la valeur de a dcale gauche de b bits. x vaut 0b10000

VII. Reprsentation des diffrentes bases et des codes ASCII


^ int a = 4 ; int b = 0b1010 ; int p = 0x00FF ; char c = x ; // Un nombre seul reprsente un nombre dcimal. // Un nombre prcd de 0b est un nombre binaire. >> // Un nombre prcd de 0x est un nombre hexadcimal. // Un caractre entre reprsente son code ASCII. <<

VIII.

Les oprateurs

A. Loprateur daffectation
Cet oprateur a dj t utilis dans les exemples prcdents. Il permet, entre autres, dinitialiser une variable.
= Exemple : a = 5 ; PORTB = 0 ; // Range 5 dans a. // le PORTB est mis 0

D. Les oprateurs de tests


Remarque : En C, FAUX est la valeur 0, VRAI est tout ce qui est
> Exemple : a = 6 ; x = a>4 ;

0.

// rend VRAI si a est suprieure // 4. FAUX sinon. // x vaut VRAI // rend VRAI si a est suprieure ou // gale 2. FAUX sinon. // x vaut VRAI

>=

Exemple : a = 2 ; x = a>= 2 ;

Attention : Le transfert de la valeur va toujours de la droite vers la gauche du signe gal.

STI2DSIN
< Exemple : a = 6 ; x = a<3 ;

INITIATION AU LANGAGE C SUR MICROCONTROLEUR PIC (CORRECTION) dure 3 heures environ


// rend VRAI si a est infrieure // 3. FAUX sinon. // x vaut FAUX // rend VRAI si a est infrieure ou // gale 6. FAUX sinon. // x vaut VRAI // rend VRAI si a est gale 5. // FAUX sinon. // x vaut FAUX // rend VRAI si a est diffrente // de 2. FAUX sinon. // x vaut VRAI

page 3 / 7

Exemple : Programme en C appelant des fonctions prdfinies et des fonctions crites par le programmeur.
#include <pic16f877a.h> // Fichier de dfinition des adresses des // registres du PIC 16F877A // Fichier de fonctions prdfinies pour // temporisations logicielles Note prof : <delay.h> le fichier se trouve dans le rpertoire des fichiers dentte du compilateur "delay.h" le fichier se trouve dans le mme rpertoire que le fichier source

<=

Exemple : a = 3 ; x = a<= 6 ;

==

Exemple : a = 6 ; x = a == 5 ;

#include <delay.h> // // // //

!=

Exemple : a = 4 ; x = a != 2 ;

// Directives dassemblage

&&

Exemple : a = 9 ; b = 1 ; // ET LOGIQUE : rend VRAI si les x = (a == 9) && (b != 8); // deux tests sont VRAIS. // FAUX sinon. // x vaut VRAI Exemple : a = 6 ; b = 3 ; // OU LOGIQUE : rend VRAI si au x = (a == 5) || (b != 3); // moins un des deux tests // est VRAI. FAUX sinon. // x vaut FAUX Exemple : a = 1 ; x = !a ; y = !(a == 5) ; // NEGATION LOGIQUE : rend VRAI si // a est FAUX. FAUX sinon. // x vaut FAUX et y vaut VRAI // Dfinitions des fonctions crite par le programmeur void PORTB_en_sortie(void) { TRISB=0; }

||

// PORTB en sortie si TRISB=0

Remarque : Les oprateurs ont une priorit. Cette priorit nest pas forcment celle des mathmatiques et varie dun langage informatique un autre. Il vaut donc mieux utiliser les parenthses pour viter tous problmes.

void Allumer_LED_PORTB(void) { PORTB=0xFF; // RB0 RB7 mis 1 } void Eteindre_LED_PORTB(void) { PORTB=0x00; // RB0 RB7 mis 0 }

IX. Les Fonctions A. Prsentation


Un programme en C est un ensemble de fonctions : La fonction principale main qui est la premire fonction appele lors de lexcution du programme. Les fonctions crites par le programmeur qui doivent tre dclares avant leur appel. Fonctions prdfinies issues des bibliothques standards du compilateur (dont le code nest pas crit par le programmeur mais insr dans le programme par lditeur de liens grce au fichier.h).
} // Fonction principale void main(void) { PORTB_en_sortie(); while(VRAI) { // // // // Eteindre_LED_PORTB() ; // __delay_ms (250) ; // } Allumer_LED_PORTB(); __delay_ms(250) ; fonction crite par le fonction prdfinie Note prof : Le fichier ajout au projet MPLAB fonction crite par le fonction prdfinie programmeur htc.c doit tre en plus du htc.h programmeur

// fonction crite par le programmeur // Rpter toujours // voir La structure alternative ou slection page 5

Pour quun programme soit structur, chaque fonction doit effectuer une tche bien spcifique.

STI2DSIN

INITIATION AU LANGAGE C SUR MICROCONTROLEUR PIC (CORRECTION) dure 3 heures environ

page 4 / 7

B. Syntaxe dcriture dune fonction


<type de la valeur de retour> nom_fonction(<liste des paramtres reus par la fonction>) { dfinitions des variables locales ; instructions ; } Remarques : La liste des paramtres reus peut-tre vide. La valeur de retour peut tre de nimporte quel type : int, float void si la fonction ne retourne pas de valeur, Une variable dfinie dans une fonction nexiste que dans celle-ci (variable locale). Exemple de fonction dont la liste des paramtres reus est vide et ne retournant pas de valeur :
La fonction ne retourne pas de valeur La liste des paramtres reus est vide

C. Appel de fonction avec passage de paramtres par valeur


La valeur du paramtre pass est recopie dans une variable locale la fonction appele. Une modification de cette variable na aucun effet sur la variable la fonction appelante. Exemple de fonction main appelant Ma_fonction_somme :
void main() { int a,x,y,z ; x = 1 ; y = 2 ; a = 5 ;

// dclaration de quatre entiers a, x, y et z; // initialisation des variables locales

z = Ma_fonction_somme(x,y) ; // z vaut la somme de x et de y. }

Dans la fonction main, la variable locale a vaut 5. Dans la fonction Ma_fonction_somme, la variable locale a vaut 1 et la variable locale b vaut 2. Aprs appel de la fonction Ma_fonction_somme, la variable a de la fonction main vaut toujours 5. Bien sr, z vaut 3.

void Allumer_LED_PORTB(void) { PORTB=0xFF; // RB0 RB7 mis 1 }

X.

Les variables Globales (Permanentes) et Locales (Temporaires)

Exemple de fonction recevant 2 entiers et retournant la somme de ces derniers :


La fonction retourne une valeur de type entier La fonction reoit deux paramtres de type entier

Une variable globale (ou permanente) est dclare en en-tte du programme. Elle est valide pendant toute la dure d'excution du programme car elle fait l'objet d'une rservation mmoire permanente en RAM. Elle peut tre utilise et modifie par toutes les fonctions du programme. Une variable locale (ou temporaire) est dclare lintrieur dune fonction. Son existence est limite la dure dexcution de cette fonction. Elle est donc ignore par les autres fonctions. Elle peut (bien que cette faon de procder soit dconseille), porter le mme nom qu'une variable globale ou qu'une autre variable locale se trouvant dans une autre fonction. Par dfaut, une variable locale est range en pile LIFO mais elle peut tre range en RAM une adresse fixe (statique). Elle nen demeure pas moins visible qu lintrieur de la fonction o elle a t dclare. Attention : la pile et la mmoire RAM des PIC sont trs limites. Exemple :
Void fonction_exemple() { int a=12 ; // variable locale a en pile. static char b ; // variable locale b en RAM une adresse fixe. }

int Ma_fonction_somme(int a, int b) { int resultat ; // dclaration dune variable locale appele // resultat resultat = a+b ; // Les variables a et b ont t dclares et // initialises lors de lappel de la fonction // linstruction return permet de retourner // une valeur la fonction appelante.

return resultat ; }

STI2DSIN

INITIATION AU LANGAGE C SUR MICROCONTROLEUR PIC (CORRECTION) dure 3 heures environ

page 5 / 7

XI. Algorithme A. Dfinition


Un algorithme est un ensemble de rgles opratoires rigoureuses, ordonnant un processeur dexcuter dans un ordre dtermin une succession doprations lmentaires, pour rsoudre un problme donn. Cest un outil mthodologique gnral qui ne doit pas tre confondu avec le programme proprement dit. Un algorithme peut tre : Reprsent graphiquement par un organigramme (ou ordinogramme). crit sous forme littrale avec un langage algorithmique.

C. Structures algorithmiques fondamentales


Les oprations relatives la rsolution dun problme peuvent en fonction de leur enchanement, tre organises selon trois familles de structures : Structures linaires, Structures alternatives, Structures rptitives.

1.

La structure linaire ou squence

La structure linaire se caractrise par une suite dactions excuter successivement dans lordre de leur nonc. Organigramme
Dbut

B. Organigramme
Lorganigramme est une reprsentation graphique normalise utilise pour analyser ou dcoder un problme. Il utilise des symboles reprsentant des traitements, des liaisons, des donnes Un organigramme bien reprsent doit tre flch et ferm, compris entre un dbut et une fin.

Langage algorithmique

Exemple en langage C

Dbut algorithme :
Opration 1

Opration 2

SYMBOLE

DSIGNATION
Opration 3

FAIRE opration 1 FAIRE opration 2 FAIRE opration 3 Fin algorithme.

void main( ) { fonction_1( ) ; fonction_2( ) ; fonction_3( ) ; }

Traitement Opration ou groupe dopration sur des donnes, instructions, etc.

Fin

Sous-programme Portion de programme considre comme une simple opration. Entre-Sortie Mise disposition dune information traiter ou enregistrement dune information traite.
FAUX VRAI

2.

La structure alternative ou slection

La structure alternative noffre que deux issues possibles sexcluant mutuellement. Les structures alternatives dfinissent une fonction de choix ou de slection entre lexcution de lun ou de lautre des deux traitements. galement dsignes par structures conditionnelles, elles sont reprsentatives de saut ou rupture de squence.

Embranchement Test, exploitation de conditions variables impliquant le choix dune parmi deux. Symbole utilis pour reprsenter une dcision. Dbut, fin ou interruption Dbut, fin ou interruption dun organigramme

a) La structure alternative complte


Organigramme Langage algorithmique Exemple en langage C

FAUX

Condition

VRAI

SI condition VRAIE ALORS action 1

Sens conventionnel des liaisons. Le sens gnral de liaison doit tre : De haut en bas, De gauche droite.

Action 2

Action 1

SINON action 2 FIN SI

if( condition = = VRAI ) { fonction_1( ) ; } else { fonction_2( ) ; }

STI2DSIN

INITIATION AU LANGAGE C SUR MICROCONTROLEUR PIC (CORRECTION) dure 3 heures environ

page 6 / 7

b) La structure alternative rduite


Organigramme Langage algorithmique Exemple en langage C

b) Tant que Faire


Dans cette structure on commence par tester la condition, si elle est vraie alors le traitement est excut. Organigramme Langage algorithmique Exemple en langage C

FAUX

Condition

VRAI

SI condition VRAIE ALORS action

Action

if( condition = = VRAI ) { fonction( ) ; }

Condition VRAI Action

FAUX

TANT QUE condition VRAIE FAIRE action FIN TANT QUE

FIN SI

while( condition = = VRAI ) { fonction( ) ; }

3.

Les structures rptitives

4.

La structure rptition contrle

Une structure rptitive ou itrative rpte lexcution dun traitement.

a) Faire Tant que


Dans cette structure, le traitement est excut une premire fois puis sa rptition se poursuit jusqu ce que la condition soit vrifie.

Dans cette structure la sortie de la boucle ditration seffectue lorsque le nombre souhait de rptition est atteint. Do lemploi dune variable de boucle (indice I) caractrise par : Sa valeur initiale. Sa valeur finale. Son pas de variation.

Organigramme Organigramme Langage algorithmique Exemple en langage C


I = Vi

Langage algorithmique

Exemple en langage C for( I = Vi ; I > 0 ; I = I 1 ) { fonction( ) ; } quivalent :

FAIRE
Action

do { action fonction( ) ; } while(condition = = VRAI) ;


VRAI

POUR I = Vi I = 0 et par pas de 1


I>0? FAUX

FAIRE action
Action

FAUX Condition VRAI

TANT QUE condition VRAIE

I=Vi; while(I>0) { I=I-1 fonction( ); I=I-1; } Remarque : En C, la squence est excute tant que la condition est vraie. FIN POUR

STI2DSIN

INITIATION AU LANGAGE C SUR MICROCONTROLEUR PIC (CORRECTION) dure 3 heures environ

page 7 / 7

XII. Les masques


Les masques sont utiliss en informatique pour tester ltat dun ou plusieurs bits dun mot binaire. Ils permettent galement de forcer un ou plusieurs bits un tat dsir (0 ou 1). On utilise, pour effectuer des masques, les proprits de la logique de Boole savoir : llment absorbant et llment neutre du OU, du ET et du OU EXCLUSIF.

C. Un masque pour faire basculer ltat dun bit


Soit ltat du PORTB = 0b100X0111. On veut faire basculer ltat de RB4 sans modifier les autres bits.

PORTB :

1 0 0 X0 1 1 1
+ 0 0 0 1 0 0 0 0

quivalent en C :

A. Un masque pour forcer un bit 1


Masque : Soit ltat du PORTB = 0b10010111. On veut forcer le bit 3 1 sans modifier les autres bits. Proprit utilise : lment absorbant et lment neutre du OU logique. PORTB : Masque : Rsultat : + Rsultat :
PORTB = PORTB ^ 0b00010000 ;

_ 1 0 0 X 0 1 1 1

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

quivalent en C :

quivalent : RB4 = !RB4 ;

D. Un masque pour tester ltat dun bit


PORTB = PORTB | 0b00001000 ;

Rappel : En C, FAUX est la valeur 0, VRAI est tout ce qui est

0.

0 0 0 0 1 0 0 0

On veut tester ltat du bit 5 du PORTB. Si RB5 = 1 alors on appelle la fonction action_1(), sinon, on appelle la fonction action_2() ; Il y a deux solutions : Masque en ET : if(PORTB & 0b00100000) { action_1() ; // alors RB5 = 1 } else { action_2() ; // sinon RB5 = 0 } Masque en OU : if(PORTB | 0b11011111 == 0xFF) { action_1() ; // alors RB5 = 1 } else { action_2() ; // sinon RB5 = 0 }

B. Un masque pour forcer un bit 0


Soit ltat du PORTB = 0b10010111. On veut forcer le bit 1 0 sans modifier les autres bits. Proprit utilise : lment absorbant et lment neutre du ET logique. PORTB : Masque : Rsultat : .

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

quivalent en C :

PORTB = PORTB & 0b11111101 ;

1 0 0 1 1 1 0 1

Remarque : Le fichier pic16f877a.h contient la dfinition de chaque bit des registres et ports de notre PIC. Ceci permet de les forcer directement sans passer par les masques : Pour forcer le bit 3 du PORTB 1 : Pour forcer le bit 1 du PORTB 0 :
RB3=1 ; RB1=0 ;

Remarque : grce au contenu du fichier pic16f877a.h, on peut galement crire :


if(RB5) { action_1() ; } else { action_2() ; } // sinon RB5 = 0 // alors RB5 = 1

Il faut prendre connaissance de la syntaxe et de la casse des registres, des ports et des bits en ditant le fichier pic16f877a.h. Les masques restent trs utiles pour la manipulation des bits non dfinis dans ce fichier