Vous êtes sur la page 1sur 21

Dveloppement logiciel

pour
microcontrleurs PIC
Langage C
T.Berenguer

Dveloppement dun projet


Projet
Ecriture algorithme

Ecriture
du
logiciel

Ecriture du source
Compilation

Erreurs ?

oui

non

Test

Debug du programme

du logiciel
sur le
matriel

Fonctionnement
OK ?
oui
Programmation
de la carte

Fin du projet

non

Flux de donnes dun projet

Fichiers source

fichier1.c

fichier2.c

fichier3.asm
Assembleur

Compilateur

Fichiers objet

mcc18
fichier1.o

mcc18
fichier2.o

MPASMWIN

fichier3.o

Bibliothques

Script pour le
linkage

lib1.lib

script.lkr

mplink

Editeur de liens

Fichiers de sortie

Debug

projet.cof

projet.hex

projet.map

Programmation
du composant

Programme source en C
Commentaire

/* bla bla
bla bla */

sur plusieurs lignes

Insertion dun fichier


#include
< nom.ext >
#include
" nom.ext "
Commentaire
sur 1 ligne

dfini dans options


dans dossier local

// bla bla

Dfinition quivalence
#define
symbole

valeur

Dclaration des variables

m , c , d u sont des octets en RAM

Unsigned, char, void, while, if sont


des mots rservs. Il y en a 32 en C.
Fonction principale

Son nom est main, cest un mot rserv.

Le point virgule indique la fin dune


instruction. On peut mettre plusieurs
instructions sur une ligne.

Un couple daccolades indique le dbut { et


la fin } dun bloc dinstructions.
Les accolades indiques aussi le dbut et la
fin des fonctions.

Les types de donnes

Type

longueur

domaine de valeur

char ou signed char

8bits

-128

127

unsigned char

8bits

...

255

int ou short

16bits

-32768

32767

unsigned int

16bits

...

65535

long

32bits

-2.147.483.648

...

2.147.483.647

unsigned long

32bits

4.294.967.295

short long

24bits

-8.388.608

...

8.388.607

unsigned short long

24bits

16.777.215

float ou double

32bits

-3,4 . 1038

...

3,4 . 1038

double

64bits

-1,7 . 10308 ...

1,7 . 10308

Dclaration des donnes en RAM

Une variable doit tre dclare avant dtre utilise


type

nom;

unsigned char unit;

// unit est un octet 0..255 plac en RAM

int maxi;

// maxi mot 16 bit -3276832767 plac en RAM

char lettre;

// lettre est un caractre code ASCII plac en RAM

type

nom = valeur_initiale;

unsigned char unit = 10;

// unit est un octet initialis 10 en RAM

int maxi = 1024;

// maxi mot 16 bit initialis 1024 en RAM

char lettre = A;

// caractre A code ASCII 65 en RAM

unsigned char unit;


unsigned char UNIT;
unsigned char Unit;

Ces 3 variables sont diffrentes !


Le langage C fait la diffrence entre les MAJUSCULES et les minuscules

Dclaration des donnes en ROM

Elles sont ranges dans la ROM et ne sont donc pas modifiables

rom

type

nom = valeur_initiale;

rom unsigned char unit = 10;

// unit est un octet initialis 10 en ROM

rom int maxi = 1024;

// maxi mot 16 bit initialis 1024 en ROM

rom char lettre = A;

// caractre A code ASCII 65 en ROM

Equivalences

Les quivalences sont remplaces par leur valeur


par le pr-processeur du compilateur.

#define

nom

valeur
Espaces ou tabulations

Une quivalence nest pas une instruction du programme mais une directive pour le compilateur afin de faciliter la programmation.

#define

maxi

temperature = maxi;

150
// la variable temperature prend la valeur 150

#define

led_allume

#define

led_eteinte

led1 = led_allume;

// la variable led1 prend la valeur 1

led2 = led_eteinte;

// la variable led2 prend la valeur 0

Les fonctions
prog
Initialisation
des ports
Led1 teinte

BP
activ ?

Led1 teinte

Led1 allume
Gestion du
buzzer

void buzzer (void)


{
.
..
}
void init_port (void)
{
.
..
}

void main (void)


{
init_port();
led1 = 0;
while(1)
{
if(bp == 0)
{
led1 = 1;
buzzer();
}
else led1 = 0;
}
}

Les oprateurs arithmtiques

Addition

a = 3;
c = a + 2;

// c = 5

Soustraction

Multiplication

a = 3;
c = a - 2;

a = 3;
b = 11;
c = a + b;

// c = 33

Division

a = 75;
b = 3;
c = a / b;

Modulo
Reste de la division

// c = 1

a = 75;
diz = a / 10;

// diz = 7

unite = a % 10

// unite = 5

cest dire le reste

// c = 25

Bases

Base 10

a = 26;

dcimal

symboles : 0 1 2 3 4 5 6 7 8 9

c = a + 857;

Base 16
symboles :

hexadcimal
0 1 2 3 4 5 6 7 8 9 a b c d e f A B C D E F

la nombre est prcd de 0x...

Base 2
symboles :

binaire
0 1

la nombre est prcd de 0b...

a = 0x1a;

// a = 26

a = 0x1A;

// a = 26

a = 0x001a;

// a = 26

a = 0b11010;

// a = 26

a = 0b00011010;

// a = 26

Le programmeur utilisera la base la plus adapte et la plus facile manipuler


Le compilateur accepte aussi lutilisation de bases diffrentes dans un calcul :
-

a = 0x01101 >> 3;

b = ( c * 2 ) + ( a / 0b1010 );

Les oprateurs logiques

ET

&

a = 0b11001100;
c = a & 0b10101010;

// c = 0b1001000

OU
Complment

a = 0b11001100;
c = a | 0b00111100;

// c = 0b11111100

a = 0x03;

c = ~ a;

// c = 0xFC

OU exclusif

a = 0b11001100;

b = 0b10100010;
c = a ^ b;

Dcalage DROITE

>>

// c = 0b01101110

a = 0b00110000;
c = a >> 2;

// c = 0b00001100;

Dcalage GAUCHE

<<

a = 0b00110000;
c = a << 2;

// c = 0b11000000;

Autres oprateurs

Incrment

a = 55;

++

a++;

// a = 56

Dcrment
Affectation

--

a = 55;

// a prend la valeur 55

a = a + b;

// la somme de a et b est mise dans a

Sparateur

a = 20;
a--;

// a = 19

a = 55;

b = a + 1;

Dbut et fin des fonctions

Bloc dinstruction

{ .. .. ..

Liste de variables ou de constantes

Dans les tableaux pour sparer les lments


Utilis dans les tests IF..THEN
Utilis dans les boucles FOR

SWITCH.. CASE
WHILE

DO..WHILE

Etc ...

Sparateur

unsigned char TAB[5] = { 2, 5, 8, 20, 5 };

// tableau de 5 valeurs

Instruction conditionnelle IF. ELSE

if( a > b )

Action1 et action2 sont une seule instruction

Condition
Condition
??

c = c - a;

else

Fausse

c = c- b;

if( a > b )

Action1 et action2 sont


un bloc dinstructions

{ c = c - a;

Vrai

d = c - a;

Action
Action1 1

Action
Action22

}
else

{ c = c - b;
d = c - b;
}

Si la condition est vrai


faire laction 1
sinon faire action 2

ELSE nexiste pas

if( a > b )
{ c = c - a;
d = c - a;

if( condition )
else

action1;
action2;

Condition multiples

if( (a > b) && ( b > 0) )


else

c = c - a;
c = c- b;

Oprateurs de comparaison

Suprieur

>

if( a > b )

Suprieur ou gal

>=

if( a >= b )

Infrieur

<

if( a < b )

Infrieur ou gal

<=

if( a <= b )

Egal

==

if( a == b )

Diffrent

!=

if( a != b )

if( a = b ) ...
else ...
Ne pas confondre :
l affectation =
le test de comparaison ==
Le compilateur ne dtectera pas derreur mais
le rsultat ne sera pas celui escompt. . . .

Simplification
Oprateurs logique de test

ET

&&

if( (a > b) && ( b > 0) )

OU

||

if( (a > b) || ( b > 0) )

NON

if( !( a == b) )

if( a )
else

ce test est :
vrai si a > 0
faux si a = 0

Instruction conditionnelle SWITCH CASE


Remplace une suite de IF .. ELSE

switch ( expression )
{

expression doit tre un entier ou un caractre.


Switch compare cette expression aux valeurs des
diffrents case.

case valeur1 : instruction(s) 1;

break;

case valeur2 : instruction(s) 2;

break;

case valeur3 : instruction(s) 3;

break;

default : instruction(s) par dfaut;


Linstruction break permet de sortir dun bloc.
Ici cela permet de ne pas tester les case suivants.

Default est effectu si aucun des case nest


effectu.
Valeur
switch ( valeur )
{
case 1 : led1 = 1;

led2 = 0;

led3 = 0;

break;

case 2 : led1 = 0;

led2 = 1;

led3 = 0;

break;

case 3 : led1 = 1;

led2 = 1;

break;

default : led1 = 0;

led2 = 0;

led3 = 0;

case 7 : led3 = 1;

Rpondre par
0
1
x si pas de modification

led1

led2

led3

Boucle FOR

Initialisation
Initialisation

for ( initialisation ; condition ; modification )


{
action;
;

Condition
Condition
??

}
Sortie de
la boucle

Action
Action
Modification
Modification

Version 1

Version 2

for( x = 0 ; x < 5 ; x++ )

for( x = 5 ; x > 0 ; x-- )

{
action;

Version 2 simplifie
action;

for( x = 5 ; x ; x-- )

Ces 2 boucles sont identiques.


Action

Attention aux conditions qui rendent la boucle infinie.

est excute 5 fois

action;
}
x est vrai si x > 0 donc la
boucle sera excute tant que
x>0

Boucle WHILE
while (condition)
{

x = 0;
while ( x < 5 )

;
Sortie de
la boucle

faire...

Cette boucle est identique une boucle FOR

action;

Condition
Condition
??

Action
Action

Tant que condition vraie

{
action;

x++;
}
Dans cette boucle action ne sera
jamais excute car la condition est
dj fausse lors de la premire
entre.

x = 10;
while ( x < 5 )
{
action;
x++;
}

while ( 1 )
{
action;

Soit un bouton poussoir qui donne 0 si il est appuy.


Ici on fait laction tant que le poussoir est maintenu appuy.
On sort de la boucle quant le bouton nest plus appuy.

;
}
while(1) est une boucle qui permet dexcuter indfiniment un bloc dinstructions.
Cette boucle est volontairement rendue infinie en testant une condition toujours vrai : 1 tant > 0 donc vrai . . .
On trouve trs souvent une boucle while(1) dans la fonction main().

while ( bouton == 0 )
{
action;
}

Boucle DO WHILE
Faire... tant que condition vraie

Action
Action

Action est toujours excute au moins une fois

do

que condition soit vraie ou fausse.

{
action;

Condition
Condition
??

;
}
while (condition);

Sortie de
la boucle
x = 0;
total = 0;
do
{
total = total + x;
x++;
}
while ( x < 5 );

Nombre dexcutions de la boucle :


A la sortie de la boucle total =

5
10

LES TABLEAUX
Un tableau permet de regrouper des variables ou des constantes de mme type.
Ces variables ou constantes sont appeles lments du tableau.
Un tableau doit tre dclar avant son utilisation.

type

nom[taille] = { lments } ;

Linitialisation est facultative elle est de la forme :


= { lment0 , lment1 , .. .. , lmentx }

Indique le nombre dlments du tableau.


Nom du tableau, respecter la case.
Obligatoire comme pour les variables et constantes

unsigned char TABLEAU[5] = { 1 , 10 , 30 , 40 , 50 } ;


X = TABLEAU[0];

// x = 1

indice 0 = premier lment du tableau

X = TABLEAU[3];

// x = 40

indice 3 = quatrime lment du tableau

somme = 0;
for(i = 0 ; i < 5 ; i++ )
{
somme = somme + TABLEAU[i];
}

Nombre dexcutions de la boucle :


A la sortie de la boucle somme =

5
131

...C

Fin de la premire partie


suivre...