Documente Academic
Documente Profesional
Documente Cultură
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
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
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
christian.dupaty@ac-aix-marseille.fr
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
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
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
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.
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.
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; }
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
// 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.
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} ;
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'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)
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) ;
(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
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
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)
Pour
(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)