Vous êtes sur la page 1sur 34

Langage C

Dveloppement logiciel sur micro-contrleurs PIC en C

Daprs Christian Dupaty, Acadmie d'Aix-Marseille

#include <stdio.h> main() { puts(" Bonjour tous "); }

Bibliothques en C (texte) *.c

Fichiers header *.h

Bibliothques pr compiles (fichiers objet)

Editeur de lien

Prprocesseur
Remplace les #define et effectue les #include Fichier source C contenant la fonction main

Compilateur C
Transforme le fichier C en un fichier objet (code machine), les fonctions pr compiles sont dclares dans les fichiers *.h

LINKER
Lie (donne des adresses aux fonctions) tous les fichiers objets et cre un fichier excutable

FLUX DE DONNEES DUN COMPILATEUR C

Fichier de symboles pour debug

Programme excutable

Syntaxe du C
#include <stdio.h> #define pi 3.14 float d,c;
Header de la bibliothque standard in/out. (pour printf) Equivalence : Le pr-processeur remplacera tous les pi par 3.14 Dclaration de deux variables relles globales En tte du programme principal int main() Dbut de la fonction main { Calculs d=2.0 ; c=pi*d ; Appel de la fonction puts (envoie une chane puts("bonjour tous\n"); de caractres sur le priphrique de sortie) printf("la circonfrence est %f m\n",c); appel de la printf (affiche des chanes } formats, ici c est affich sous format rel) Fin de la fonction main

La syntaxe du C allumer une led


#include "essai.h" void init_micro(); void main() { init_micro(); output_low(PIN_A0); }

Librairies : les fichiers header *.h contiennent en gnral des quivalences ou les prototypes des fonctions pr-compliles ou non : ici essai.h contient les configurations des fusibles du C. Prototype : cest la dclaration dune fonction, il indique au compilateur le type de la fonction et ses paramtres de passage.

En tte de la fonction principale (main) Appel de la fonction init_micro. (pas de paramtre dentre) Appel de la fonction output_low. (permet de mettre un bit 0,

le paramtre dentre est ladresse du bit) void init_micro() { setup_adc_ports(NO_ANALOGS); setup_adc(ADC_OFF); setup_psp(PSP_DISABLED); setup_spi(FALSE); setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1); setup_timer_1(T1_DISABLED); setup_timer_2(T2_DISABLED,0,1); setup_comparator(NC_NC_NC_NC); setup_vref(VREF_LOW|-2); }

christian.dupaty@ac-aix-marseille.fr

Les types de donnes standard


Type signed char ou char unsigned char signed int ou int unsigned int long int unsigned long int float double void Longueur 8 bits 8 bits 16 bits 16 bits 32 bits 32 bits 32 bits 64 bits Domaine de valeurs -128 127 0 255 -32768 32767 0 65535 -2 147 483 648 2 147 483 647 0 4 294 967 295 3.4 * (10-38) 3.4 * (10+38) 1.7 * (10-308) 1.7 * (10+308) vide

christian.dupaty@ac-aix-marseille.fr

Les types de donnes propres PICC


Par dfaut, les types entiers (int, char) de base sont non signs! Ils peuvent tre prcds de signed pour forcer le type sign.

Type
int1 ou short char int ou int8 int16 ou long int32 float void

Longueur
1 bit 8 bits 8 bits 16 bits 32 bits 32 bits -

Domaine de valeurs
0 ou 1 0 255 0 255 0 65535 0 4 294 967 295

3.4 * (10-38) 3.4 * (10+38)


vide

Exemples de dclaration
trois caractres char tata,blabla,alea ; tableau de 100 entiers int table[100] ; char tableau[ ]={10,0x1c,A,55,4} char *p ; le symbole * dsigne un pointeur sur un type dfini p est un pointeur sur des caractres Remarque: un nombre entier en hexadcimal est prcd de 0x ou 0X, (0x1FB9) un nombre entier en dcimal n'a pas besoin de prfixe un nombre rel se note 13.145 ou 1.3145e+1. Dans les compilateurs pour C: notation binaire 0b11010001

Equivalences
directive #define Les quivalences sont remplaces par leur valeur par le pr-processeur #define pi 3.14 #define fruit pomme

Constantes
elles

sont ranges dans la ROM et ne sont donc pas modifiables. const int i=16569, char c=0x4c ; const float pi=3.14; Le mot rserv const dfinit une constante

VARIABLES LOCALES ET GLOBALES


Les variables sont stockes en RAM afin dtre modifiables au cours du programme. Elles peuvent tre une adresse fixe (static) ou dans une pile (volatile). GLOBLALES LOCALES
Dclares en dehors dune fonction toujours statiques Dclares dans une fonction

soit une adresse fixe (statique)

static char toto;


soit dans une pile LIFO (automatique)

char tata; ou auto char tata;

Branchement : if - else
Condition du test : ==, <,>,<=,>=, !=,&&,|| if (A>B) printf( A est suprieur B); else printf(A est infrieur ou gal B); si (A>B) alors afficher( A est suprieur B) sinon afficher(A est infrieur ou gal B)

Boucle WHILE
i=0; while (i<100) { a=a+i; i++ ; } i 0 tant que (i<100) faire: a a+i i i+1

Si la condition de boucle est fausse au dpart la boucle nest jamais effectue

Boucle DO WHILE
do { a=a+i; i++ ; } while (i<100) faire: a a+i i i+1 tant que (i<100)

Mme si la condition de boucle est fausse au dpart la boucle est effectue au moins une fois

Branchement switch-case
switch (c ) { case '+' : resultat=a+b;break; case '-' : resultat=a-b;break; case '*' : resultat=a*b;break; case '/' : resultat=a/b;break; default : resultat=a+b; } suivant la valeur de (c )
dbut suivant

si '+' : resultat a+b si '-' : resultat a-b si '*' : resultat a*b si '/' : resultat a/b par default : resultat a+b
fin suivant

Cette structure est une extension de la structure alternative si..alors..sinon et permet une meilleur compacit du code.

Boucle FORde dpart Action(s)


Condition pour rester dans la boucle

for (i=0 ;i<100 ;i++) { a=a+i; printf("%d\n",a); }

Action(s) effectuer en dernier dans la boucle

Action(s) effectuer dans la boucle

peut se traduire par: i 0 tant que (i<100)) faire a a+i afficher_valeur(a) i i+1

Cette structure est une extension de la structure rptitive tant que faire et permet une meilleure compacit du code.

Contrle des boucles


break permet de sortir de la boucle en cours (for, while, do while, switch) continue permet de sauter directement litration suivante dune boucle
for(i=0 ;i<100 ;i++) { if (i<50) continue else a=a+i; }

exit permet de quitter directement le programme (inutile sur micro contrleur)

christian.dupaty@ac-aix-marseille.fr

POINTEURS
Ce sont des variables qui contiennent ladresse dune autre variable. Sur micro-contrleur un pointeur est une valeur sur 16bits. Un pointeur est dclar par une * prcde du type de donne pointe Le signe & devant une donne indique ladresse de celle ci et sa valeur.

char *toto ; dclare un pointeur toto sur un caractre float *tata ; dclare une pointeur tata sur un rel.
Au sein d'un programme *toto dsigne la valeur pointe par toto, alors que toto dsigne l'adresse laquelle est stocke cette valeur. L'intrt des pointeurs est de manipuler des adresses donc des zones entires de donnes comme par exemple une chane de caractres.

manipulation de pointeurs
On

pourra se servir des pointeurs pour accder directement un port du C:

// Une led est cble sur PB4, allume sur un tat bas char *portB; //portB est un pointeur sur un octet. portB = 0x06; //on dfinit l'adresse du pointeur ici le portb l'adresse $06 while(true) { *portB=0b11111111; //on fait clignoter la led.
delay_ms(300); *portB=0b11101111; delay_ms(600);

}
Sous PICC, il existe plusieurs autres possibilits pour accder aux ports ou aux registres du C. Celle-ci est plus gnrale et plus transposable d'autres compilateurs et d'autres marques de C.

TABLEAUX
Un tableau est un regroupement de variables de mme type C'est une faon plus commode, dans certains cas, d'utiliser les pointeurs. le tableau est affect avec les valeurs entre { } int chiffres[ ]={1,2,4,8,16,32,64}; la taille du tableau est automatiquement ajuste 7 entiers.

int TAB[20]={1,12,13,-100};

TAB est un tableau de 20 entiers dont seuls les 4 premiers sont affects

TAB reprsente l'adresse de dbut du tableau, pour accder aux diffrentes valeurs du tableau, on utilise un indice qui dmarre 0, ici TAB[0] vaut 1, TAB[1] vaut 12, TAB[2] vaut 13 etc toto est tableau de 10 rels sans affectation.

float toto[10]; char TATA[2][3]={{1,2,3},{4,5,6}}

TATA est un tableau 2 dimensions, on utilise 2 indices.

Chanes de caractres
Ce sont des tableaux de caractres cods en ASCII finissant par la valeur $00, une chane est entoure de " char message[ ]= "bonjour"; char message[ ]={b,o,n,j,o,u,r,0x00} ;

deux faons diffrentes de dclarer et d'affecter une chane de caractres

Prsentation de PIC C
PIC C : un environnement de dveloppement en C complet pour PIC. (diteur, compilateur, dbugger, moniteur rs232 ) un nombre assez important de fonctions intgres et de bibliothques. prise en main rapide Ses inconvnients: On notera surtout un non respect de la norme C ANSI (comme on l'a dj vu pour les types), des fonctions parfois mal documentes

L'utilisation de PIC C
PIC C comprend un "wizard" (assistant) qui permet de se passer de connatre parfaitement les registres et les bits de configuration. On choisit:

le C les ports de communication (RS232, SPI, IC) les timers les entres analogiques et le format (8 bits ou 10 bits) les interruptions utilises les composants connects

Cet assistant cre automatiquement le bout de programme ncessaire qu'il serait fastidieux d'crire la main.

L'utilisation de PIC C (suite)


On se retrouve avec un texte de ce type:
#include "C:\Program Files\PICC\my examples\test.h" void main() {

l'assistant a cr un fichier .h dans lequ se trouve les configurations

l'assistant a plac au dbut du programm setup_adc_ports(NO_ANALOGS); principal toutes les initialisations setup_adc(ADC_OFF); ncessaires setup_psp(PSP_DISABLED); setup_spi(SPI_MASTER|SPI_L_TO_H|SPI_CLK_DIV_4); setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1); setup_timer_1(T1_DISABLED); setup_timer_2(T2_DISABLED,0,1); setup_comparator(NC_NC_NC_NC); setup_vref(FALSE);
}

Pratique de PIC C

TP1
Voir texte du TP et notice de CCS

Entres/sorties caractres
Les

deux fonctions dE/S sur caractre Elle sont dfinies pour le matriel support des communications
char int

getchar(void)
Lit un caractre en entre (CLAVIER par exemple)

putchar(char)

Envoie un caractre (LCD par exemple)

Entres/sorties Chanes
A partir de getchar et putchar
void char
affiche une chane de caractres

puts(char *chane) ;

*gets(char *chane) ;
saisie une chane de caractre finie par un RC et retourne un pointeur sur le premier caractre de cette chane

PRINTF
printf(format, liste de valeurs)
char a=10 ; float b=3.1412 printf(" dcimal %d, hexa %x, reel %f " ,a,a,b) ;

affichera : dcimal 10, hexa A, reel 3,1412


sprintf(chane, format, liste de valeurs) crit dans chane

Formats sur printf


%c

(char) %s (chane de caractres, jusqu'au \0) %d (int) %u (entier non sign) %x ou X (entier affich en hexadcimal) %f (rel en virgule fixe) %p (pointeur) % (pour afficher le signe %)
christian.dupaty@ac-aix-marseille.fr

\ n nouvelle ligne \ t tabulation \ b backspace \ r retour chariot \ f form feed \ ' apostrophe \ \ antislash \ " double quote \ 0 nul

Bibliothques standards C ANSI


ctype.h

islower limits.h indique les limites des types string.h traitement sur les chanes math.h fonctions mathmatiques stdlib.h conversion de chaines (atoi atof) gnration dun nombre alatoire (rand, srand) allocation dynamique de mmoire (malloc, calloc), tri (qsort) time.h fonctions lie lheure et la gnration de nombre alatoires
christian.dupaty@ac-aix-marseille.fr

trouver les types ex: isdigit (chiffre) ou

Oprateurs unaires
() [] ! ~ + ++ -& * Appel de fonction Indice de tableau Ngation logique (NOT) Complment binaire bit bit Moins unaire Plus unaire Pr ou postincrment Pr ou postdcrment Adresse de Indirection tableau[3]=5; b=~a b=-a; b=+a; b=a++; b=a--; b=&a; b=*a;

Oprateurs binaires
* / + << >> & ^ | Multiplication Division Plus binaire Moins binaire Dcalage gauche Dcalage droite ET entre bits OU exclusif entre bits OU entre bits c=a*b; c=a/b; c=a+b; c=a-b; c=a<<b; c=a>>b; c= a & b; c= a ^b; c= a|b;

TESTS
< Strictement infrieur if (a < b) <= Infrieur ou gal if (a >= b) > Strictement suprieur if (a > b) >= Suprieur ou gal if (a >= b) == Egal if (a ==b) != Diffrent if (a != b) && ET logique if ((a==5) && (b==2)) || OU logique if ((a==5) ||(b==2)) ?: Condition z=(a>b)?a:b (Si a>b a z=a sinon z=b)

Affectations et Auto-affectations
= *= /= %= += -= &= ^= |= <<= >>= Affectation simple a=b; Affectation produit a*=2 (a=a*2) Affectation quotient a/=2 (a= a/2) Affectation reste a%=2 (a= le reste de a/2) Affectation somme a+=2 (a=a+2) Affectation diffrence a-=2 (a=a-2) Affectation ET entre bits a&=5 (a=a&5) Affectation OU EX entre bits a^=5 (a=a^5) Affectation OU entre bits a|==5 (a=a|=5) Affectation dcalage gauche a<<=5 (a=a<<5) Affectation dcalage droite a>>=5 (a=a>>5)

Merci de votre attention


Exercez vous, un langage sapprend par la pratique Compilateur C/C++ gratuits : DOS : TURBO C/C++ V1.01 www.borland.fr WINDOWS : DEV-C++ www.bloodshed.net
trs performant, orient C++ mais on peut faire du C, utilis par beaucoup de programmeurs chevronns; certaines fonctions de TurboC++ ne sont pas supportes

Pour

PIC: CC5x http://www.bknd.com/cc5x/

(C'est un bon compilateur limit 1k de code compil par module, intgrer MPLAB. Trs peu de fonctions intgres : impossible de faire tourner des programmes crits pour PICC avec CC5x, il faut recrire ses librairies)