17
Développement logiciel pour microcontrôleurs PIC Langage C

Développement logiciel pour microcontrôleurs PIC …systemesembarques.e-monsite.com/medias/files/microcont...Une équivalence n’est pas une instruction du programme mais une directive

Embed Size (px)

Citation preview

Développement logicielpour

microcontrôleurs PICmicrocontrôleurs PIC

Langage C

Développement d ’un projet

Projet

Ecriture algorithme

Compilation

Erreurs ?oui

Ecriture

du

logiciel

Ecriture du source

Erreurs ?

Debug du programme

non

FonctionnementOK ?

oui

Programmationde la carte

Fin du projet

Test

du logiciel

sur le

matériel

non

Les types de données

char ou signed char 8bits -128 … 127

unsigned char 8bits 0 ... 255

int ou short 16bits -32768 … 32767

unsigned int 16bits 0 ... 65535

long 32

Type longueur domaine de valeur

long 32bits -2.147.483.648 ... 2.147.483.647

unsigned long 32bits 0 … 4.294.967.295

short long 24bits -8.388.608 ... 8.388.607

unsigned short long 24bits 0 … 16.777.215

float ou double 32bits -3,4 . 1038 ... 3,4 . 1038

double 64bits -1,7 . 10308 ... 1,7 . 10308

Déclaration des données en RAM

type nom;

unsigned char unit; // unit est un octet 0..255 placé en RAM

int maxi; // maxi mot 16 bit -32768…32767 placé en RAM

char lettre; // lettre est un caractère code ASCII placé en RAM

type nom = valeur_initiale;

Une variable doit être déclarée avant d ’être utilisée

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’; // caractère A code ASCII 65 en RAM

unsigned char unit;

unsigned char UNIT;

unsigned char Unit;

Ces 3 variables sont différentes !

Le langage C fait la différence entre les MAJUSCULES et les minuscules

Une équivalence n ’est pas une instruction du programme mais une directive pour le compilateur afin de faciliter la programmation.

Equivalences

Les équivalences sont remplacées par leur valeurpar le pré-processeur du compilateur.

#define nom valeurEspaces ou tabulations

#define maxi 150

temperature = maxi; // la variable temperature prend la valeur 150

#define led_allume 1

#define led_eteinte 0

led1 = led_allume; // la variable led1 prend la valeur 1

led2 = led_eteinte; // la variable led2 prend la valeur 0

Les fonctions

void main (void)

void init_port (void){

….…..

}

void buzzer (void){

….…..

}

prog

Initialisationdes ports

Led1 éteinte

BPactivé ?

void main (void){

init_port();led1 = 0;

while(1){

if(bp == 0) {

led1 = 1;buzzer();

}else led1 = 0;

}}

Led1 allumée

Gestion du buzzer

Led1 éteinte

Les opérateurs arithmétiques

Addition +a = 3;

c = a + 2; // c = 5

Soustraction -a = 3;

c = a - 2; // c = 1

Multiplication *a = 3;

b = 11;

c = a + b; // c = 33 c = a + b; // c = 33

Division /a = 75;

b = 3;

c = a / b; // c = 25

Modulo %Reste de la division

a = 75;

diz = a / 10; // diz = 7

unite = a % 10 // unite = 5 c ’est à dire le reste

Bases

Base 10 décimal

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

a = 26;

c = a + 857;

Base 16 hexadécimal

symboles : 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 précédé de 0x���...

a = 0x1a; // a = 26

a = 0x1A; // a = 26

a = 0x001a; // a = 26

Base 2 binairea = 0b11010; // a = 26

symboles : 0 1

la nombre est précédé de 0b���...

a = 0b11010; // a = 26

a = 0b00011010; // a = 26

Le programmeur utilisera la base la plus adaptée et la plus facile à manipuler

Le compilateur accepte aussi l ’utilisation de bases différentes dans un calcul :

- a = 0x01101 >> 3;

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

Les opérateurs logiques

ET &a = 0b11001100;

c = a & 0b10101010; // c = 0b1001000

OU |a = 0b11001100;

c = a | 0b00111100; // c = 0b11111100

Complément ~a = 0x03;

c = ~ a; // c = 0xFC

a = 0b11001100;

OU exclusif ^a = 0b11001100;

b = 0b10100010;

c = a ^ b; // c = 0b01101110

Décalage à DROITE >>a = 0b00110000;

c = a >> 2; // c = 0b00001100;

Décalage à GAUCHE <<a = 0b00110000;

c = a << 2; // c = 0b11000000;

Autres opérateurs

Incrément ++a = 55;

a++; // a = 56

Décrément --a = 20;

a--; // a = 19

Affectation =a = 55; // a prend la valeur 55

a = a + b; // la somme de a et b est mise dans a

Séparateur ;Séparateur ; a = 55; b = a + 1;

•Bloc d ’instruction { .. .. .. }

•Liste de variables ou de constantes

Séparateur , unsigned char TAB[5] = { 2, 5, 8, 20, 5 }; // tableau de 5 valeurs

•Début et fin des fonctions

•Dans les tableaux pour séparer les éléments

•Utilisé dans les tests IF..THEN SWITCH.. CASE

•Utilisé dans les boucles FOR WHILE DO..WHILE

• Etc ...

Instruction conditionnelle IF…. ELSE

Condition?

Action 1 Action 2

Vrai

Fausse

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

else c = c- b;

if( a > b )

{ c = c - a;

d = c - a;

}

else { c = c - b;

d = c - b;

Action1 et action2 sont un bloc d ’instructions

Action1 et action2 sont une seule instruction

if( condition ) action1;

else action2;

d = c - b;

}

if( a > b )

{ c = c - a;

d = c - a;

}

if( (a > b) && ( b > 0) ) c = c - a;

else c = c- b;

ELSE n ’existe pas

Condition multiples

Si la condition est vrai

•faire l ’action 1

•sinon faire action 2

if( a = b ) ...

else ...

Ne pas confondre :• l ’ affectation =• le test de comparaison ==

Le compilateur ne détectera pas d ’erreur mais le résultat ne sera pas celui escompté. . . .

Opérateurs de comparaison

Supérieur >

Supérieur ou égal >=

Inférieur <

Inférieur ou égal <=

Egal ==

Différent !=

if( a > b )

if( a >= b )

if( a < b )

if( a <= b )

if( a == b )

if( a != b )Différent != if( a != b )

Opérateurs logique de test

ET &&

OU ||

NON !

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

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

if( !( a == b) )

Simplification

if( a ) …

else …

ce test est :

• vrai si a > 0

• faux si a = 0

Instruction conditionnelle SWITCH … CASE

Remplace une suite de IF .. ELSE

•expression doit être un entier ou un caractère.

•Switch compare cette expression aux valeurs des différents case.

•L ’instruction break permet de sortir d ’un bloc. Ici cela permet de ne pas tester les case suivants.

switch ( expression )

{

case valeur1 : instruction(s) 1; break;

case valeur2 : instruction(s) 2; break;

case valeur3 : instruction(s) 3; break;

default : instruction(s) par défaut;

}

•Default est effectué si aucun des case n ’est effectué.

switch ( valeur )

{

case 1 : led1 = 1; led2 = 0; led3 = 0; break;

case 2 : led1 = 0; led2 = 1; led3 = 0; break;

case 7 : led3 = 1;

case 3 : led1 = 1; led2 = 1; break;

default : led1 = 0; led2 = 0; led3 = 0;

}

Valeur led1 led2 led3

0

1

2

3

4

5

6

7

0 0 0

1 0 0

0 1 0

1 1 x

0 0 0

0 0 0

0 0 0

1 1 1

Répondre par• 0• 1 • x si pas de modification

Boucle FOR

Condition?

Action

Sortie de la boucle

Initialisation for ( initialisation ; condition ; modification )

{

action;

… ;

}

Action

ModificationVersion 1

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

{

action;

}

Version 2

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

{

action;

}

Ces 2 boucles sont identiques.

Action est exécutée 5 fois

Version 2 simplifiée

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

{

action;

}

x est vrai si x > 0 donc la boucle sera exécutée tant que x > 0Attention aux conditions qui rendent la boucle infinie.

Boucle WHILE

while (condition)

{

action;

… ;

}

x = 0;

while ( x < 5 )

{

action;

x++;

}

x = 10;

while ( x < 5 )

Cette boucle est identique à une boucle FOR

Dans cette boucle action ne sera jamais exécutée car la condition est déjà fausse lors de la première

Tant que condition vraie faire...

Condition?

Action

Sortie de la boucle

while(1) est une boucle qui permet d ’exécuter indéfiniment un bloc d ’instructions.Cette boucle est volontairement rendue infinie en testant une condition toujours vrai : 1 étant > 0 donc vrai . . .On trouve très souvent une boucle while(1) dans la fonction main().

{

action;

x++;

}

déjà fausse lors de la première entrée.

while ( bouton == 0 )

{

action;

}

Soit un bouton poussoir qui donne 0 si il est appuyé.Ici on fait l ’action tant que le poussoir est maintenu appuyé.On sort de la boucle quant le bouton n ’est plus appuyé.

while ( 1 )

{

action;

… … ;

}

Boucle DO … WHILE

Faire... tant que condition vraie

do

{

action;

… ;

}

while (condition);

Action est toujours exécutée au moins une fois

que condition soit vraie ou fausse.

Condition?

Action

Nombre d ’exécutions de la boucle :

A la sortie de la boucle total =

5

10

x = 0;

total = 0;

do

{

total = total + x;

x++;

}

while ( x < 5 );

Sortie de la boucle

LES TABLEAUX

Un tableau permet de regrouper des variables ou des constantes de même type.

Ces variables ou constantes sont appelées élémentséléments du tableau.

Un tableau doit être déclaré avant son utilisation.

type nom[taille] = { éléments … } ;

Obligatoire comme pour les variables et constantes

Nom du tableau, respecter la case.

Indique le nombre d ’éléments du tableau.

L ’initialisation est facultative elle est de la forme := { élément0 , élément1 , .. .. , élémentx }

// x = 1 indice 0 = premier élément du tableau

// x = 40 indice 3 = quatrième élément du tableau

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

X = TABLEAU[0];

X = TABLEAU[3];

Nombre d ’exécutions de la boucle :

A la sortie de la boucle somme =

5

131

somme = 0;

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

{

somme = somme + TABLEAU[i];

}