Академический Документы
Профессиональный Документы
Культура Документы
Sommaire
Gnralits sur le langage . Structure dun programme en C .. Les constantes et quivalences .. Les variables ... Les pointeurs .. Les bases reconnues par le compilateur ... Les oprateurs .... Les algorithmes et algorigrammes .... Structures algorithmiques : la structure linaire ... Structures algorithmiques : la structure alternative ... Structures algorithmiques : la structure itrative TANT QUE ... Structures algorithmiques : la structure itrative REPETER ... Structures algorithmiques : la structure itrative POUR ..... Les procdures et fonctions .... Bibliothque standard : La fonction temporisation .... Bibliothque standard : communication sur la liaison srie RS232.. Bibliothque standard : la fonction printf() ..... Bibliothque standard : la fonction putc() ....... Bibliothque standard : la fonction getc() ....... Bibliothque standard : la fonction puts() ....... Le Bootloader .......... Les fusibles .............
2 3 4 5 6 6 6 8 9 9 10 11 11 14 15 16 17 17 18 18 18 19
Fichier source en langage C. Entte de dfinition des broches, Registres, Bits de Registres, Fonctions, et directives de pr-compilation. Fichier de projet (pas obligatoire). Fichier qui montre chaque ligne du code C et son code assembleur associ gnr. Indique la correspondance entre le nom des symboles (variables, bits, registres) et leur adresses hexadcimale en mmoire. Fichier statistique sur lespace mmoire occup. etc.
Code objet (excutable) tlcharg dans le C Montre lorganisation du programme sous forme darbre (dcoupages en fonction) et lutilisation de la mmoire pour chaque fonction. Code machine + Informations de dbugage Erreurs ventuelles rencontres durant la compilation.
/* EXEMPLE DE PROGRAMME */ #include <p16f876A.h> #define duree 10000 char c; float pht; void tempo(unsigned int compte); void main(void) { PORTB = 0x00; Acolades qui TRISB = 0x00; ouvrent et Boucle inifnie while(1) terminent { PORTB++; une fonction tempo(duree); ou un en} semble dinstructions } void tempo(unsigned int compte) { while(compte--); }
Commentaires entre /* et */ ou apres // Bibliothque du composant utilis, contient la dfinition des variables internes PORT A, PORT B Indispensable ! Equivalence : remplaces par leur valeur a la compilation Variables globales (non utilises ici) : Char : Octet / Float : Rel. Prototype de la fonction tempo , indispensable car le cors de cette fonction est la fin du programme. Programme principal (main), Void indique quil ny a pas de paramtre dentre. Reprsentation des nombres : 12 cod en dcimal reprsente 12 0xC cod en hexadcimal reprsente 12 0b00001100 cod en binaire reprsente 12
Fonction (sous programme), en C il ny a que des fonctions Un paramtre entier en entre, pas de rsultat retourn, du type y=sin(x) compte est une variable locale car dclare dans la fonction, elle nexiste que lors de lexcution de la fonction.
Quelques informations dcritures : Un programme en C utilise deux zones mmoires principales : -> La zone des variables est un bloc de RAM o sont stockes des donnes manipules par le programme. -> la zone des fonctions est un bloc de ROM qui reoit le code excutable du programme et les constantes. Chaque ligne dinstruction se termine par un ; . Le dbut dune squence est prcd du symbole { . La fin dun squence est suivie du symbole } . Dclarer une variable ou une fonction, cest informer le compilateur de son existence. Les noms des variables que lon utilise (variables, fonctions) sont des identificateurs. Leur criture doit respecter les critres suivants : -> Utiliser les caractres de lalphabet, de a z et de A Z, les chiffres de 0 9 (sauf pour un premier caractre), le signe _ (underscore). -> Ne doit pas contenir despaces ou de caractres accentus. Ne doit pas dpasser 32 caractres. -> tre reprsentatif de leur rle dans le programme (pour une meilleure lecture et comprhension du programme). ATTENTION : Respect de la casse , lidentificateur MaFonction nest pas la mme chose que mafonction . Constantes : Elles sont ranges dans la ROM et ne sont pas modifiables. Exemple : const int i=16569 , char c=ox4c ; Equivalences : Dclars aprs la directive #define elles sont remplaces par leur valeur lors de la compilation. Exemple : #define pi 3.14 #define A 0x0F Attention : il ny a pas de ; aprs une directive define. Notes : Spcificit du compilateur CCS 1. (dclaration #BIT) Il est possible de dclarer un BIT associ a une variable ou une constante avec ce compilateur Exemple : #bit id=x.y #bit PB3=PortB.3 #bit LED_R=PortB.4
id = nom du bit (identificateur) x = nom de la variable ou la constante y = position du bit 1. (dclaration #BYTE) Il est possible de dclarer un identificateur un registre (ou case mmoire) situ en mmoire partir de son adresse. Exemple : #byte PortA = 5 // adresse du PORT A #byte PortB = 6 // adresse du PORT B #byte PortC = 7 // adresse du PORT C #byte Option_Reg = 0x81 // adresse du registre Option_Reg
Variables : Elles sont ranges dans la RAM soit une adresse fixe (statique), soit dans une pile LIFO (dynamique) Exemple : char a,b=28,c=A;
1.4 Les variables Il existe diffrents types de variables reconnus par le compilateur :
Par dfaut, tous ces types de donnes sont non signs, ils peuvent tre sign en rajoutant le mot cl signed devant le
Type Description taille domaine sign domaine non sign
int1 int8 int16 int32 char float short int long void
type.
Dfini un nombre de 1 bit Dfini un nombre de 8 bits Dfini un nombre de 16 bits Dfini un nombre de 32bits
X -128 + 127 -32768 + 32767 [ -2 147 483 648 2 147 483 647] -128 + 127 3.4 x 10^-38 3.4 x 10^+38 X -128 + 127 -32768 + 32767
un caractre (cod en interne comme un octet) Nombre virgule (rel) sur 32 bits Idem que int1 Idem que int8 Idem que int16 type non spcifi
Exemples de dclarations :
Exemple :
char a,b=A; int1 led; signed char c; // les variables est signe -> [-128 127]
1.5 Les vecteurs Un vecteur est un tableau (matrice) de taille et de nombre de dimension quelconque. Exemple un tableau permettant de stocker une phrase (chaine de caractres) est un tableau une dimension (1 ligne de caractres) les lments (champs) du vecteur sont toujours du mme type. Exemple : char message[20] // message est un tableau de caractres : 20 positions. remarque : les 20 lments de ce vecteur sont : message[0], message[1],., message[19] 1.6 Les chaines de caractres : Ce sont des vecteurs de 1 dimension dont les champs sont des caractres (type char). Le dernier lment est le caractre ascii null (ou \0) ( a ne pas confondre avec le symbole du zro ($30). Exemple : char *chaine= "bonjour" Remarque : La taille de la chaine nest pas spcifie
1.7 Les pointeurs : Un pointeur est une adresse mmoire qui peut tre utilis pour accder une donne. Le pointeur est un nombre non sign de 8 bits. Manipuler un pointeur, cest manipuler ladresse dune donne (adressage indirect) Lopration dindirection est le : * Exemple : char *porta ; porta=0x05 *porta=0x80;
// pointeur de 8 bits vers un octet // initialisation du pointeur // placer la valeur 0x80 ladresse 0x05
1.8 Les bases du compilateur CCS. On a la possibilit dcrire les chiffres de cette manire : Le dcimal : A = 10 ; Loctal : A = 012 ; Lhexadcimal A = 0x0A ; Le binaire A = 0b00001010 ; Pour les caractres : Exemple la lettre A code ASCII 65(Dcimal) ou $41(Hexadcimal), peut scrire : LETTRE = 65 ; LETTRE = 0x41 ; LETTRE = A ; 1.9 Les oprateurs du langage C
Lors de son excution, un programme est amen effectuer des oprations qui peuvent tre purement arithmtiques, de comparaison, daffectation, etc
Type Symbole Exemple
Oprateur daffectation Affectation addition soustraction moins unitaire multiplication division Reste de la division entire (modulo)
= x=10 ; y=a+b
Oprateurs arithmtiques
+ * / % a = a+b ; x= 5 + a a= a-b ; y= c-51 a = -b a=a*a;b=y*8 c=9/b; d=a/b r=a%b
Oprateurs logiques de comparaison => Le rsultat de la comparaison peut prendre deux valeurs vrai ou faux ET logique OU logique Non logique
&& || ! c = a $$ b // c est vrai si a et b sont vrais, sinon c est faux c = a || b // c = 1 si a ou b sont non nuls, sinon c=0 c = !c ; a=!b // c prend le complment de ce quil valait
Type
Symbole
Exemple
Oprateurs de comparaison => Le rsultat de la comparaison peut prendre deux valeurs vrai ou faux galit diffrent suprieur suprieur ou gal infrieur infrieur ou gal
== != > >= < <= if a==b ; if c==9 if c!=a if a>b ; if 8 >a if a>=b if a>b ; if 8 >a if a>=b
Oprateurs binaires de comparaison bit bit => Le rsultat de la comparaison peut prendre deux valeurs vrai ou faux ET binaire OU binaire OU exclusif binaire complment 1 dcalage de n bits droite dcalage de n bits gauche
Exemples (a et b deux entiers) tel que : a = 1100 0111 0101 0011 (0xC753) b = 0001 1001 1010 1110 (0x19AE) a & b = 0000 0001 0000 0010 (0x0102) a | b = 1101 1111 1111 1111 (0xDFFF) a ^ b = 1101 1110 1111 1101 (0xDEFD) ~ a = 0011 1000 1010 1100 (0x38AC) ~ b = 1110 0110 0101 0001 (0xE651) a<<2 = 0001 1101 0100 1100 (0x1D4C) & | ^ ~ >> x = a $ b // c est vrai bit bit si bit bit a et b sont vrais x = a | b // c est vrai bit bit si bit bit a ou b sont vrais x = a ^ b // c est vrai bit bit si bit bit a ou exclu b sont vrais a=~b x = y >> n // y = x dcal de n bits droite
<<
Suite finie doprations lmentaires constituant un schma de calcul ou de rsolution dun problme
Dbut : Mot dlimiteur qui annonce lintroduction dun algorithme Action : Opration sur des donnes : LIRE, AFFICHER, FAIRE, ECRIRE Test : Embranchement ; Ce symbole est utilis pour reprsenter une dcision ou un aiguillage. Fin : Mot dlimiteur qui annonce la sortie dun algorithme
DEBUT
NON
OUI
FIN
2.2 les structures algorithmiques On peut trouver les trois familles algorithmiques suivantes : A. Structure linaire B. Structure alternative C. Structure itrative.
STRUCTURE LINEAIRE
Une structure linaire est une suite dactions excuter successivement dans lordre de leur nonc. Cest UNE SQUENCE. On utilise des verbes daction caractristiques des diffrentes phase de traitement. Algorithme DBUT ECRIRE... DEBUT ECRIRE... PortA=0x55; FAIRE... AFFICHER AFFICHER... FIN } Algorigramme void main() { print(); FAIRE Langage C
FIN
STRUCTURE ALTERNATIVE
Il y a UN CHOIX dans les actions excuter. Ce choix est fait en fonction dun rsultat dun test. Algorithme DBUT SI test vrai Alors action 1
NON
Langage C
Test Action 1
FIN Remarques : 1/ La clause else peut etre omise exemple : If (compteur<1000) { compteur = compteur+1 ; } 2/ On peut emboiter des if (placer des if en cascade : if... If. else if... else else if Regle : toujours associer le else au if sans else le plus proche soigner lindentification pour prserver la lisibilit du programme Exemple : if (x > 80) if (y > 25) break; else y++; else x++;
STRUCTURE ALTERNATIVE
Remarques (suite) : Alternative Multiple : switch et case Une seule variable entrane des choix multiples : Exemple : switch (choix) case c1 : < sequence 1> /* excute si la variable choix == C1 */ case c2 : < sequence 2> /* excute si la variable choix == C2 */ case c3: < sequence 3> /* excute si la variable choix == C3 */ . case cn: < sequence n> /* excute si la variable choix == Cn */ default: < sequence_par_defaut> /* excute si aucune des conditions ci-dessus est vrai */ Note : - Si une squence est excute, toutes les suivantes le seront galement sauf si elle se termine par linstruction break. - La squence par dfaut na de sens que si la squence n (au moins) se termine par break. - la variable de contrle est de type entier, les conditions ci sont des constantes numriques.
STRUCTURE ITERATIVE
Algorigramme DEBUT
OUI
Test Action }
Remarques : -> laction nest pas obligatoirement effectue au moins une fois. -> tant que la condition est vraie, la squence daction est excute. -> la condition est value avant excution. exemples : while (x < x) { y=0; // cette action ne sera jamais excute } while (3) ; // Provoque un bouclage infini - remarquer que la squence daction est vide while (x ) { // calcule = = y * 10 * x x-- ; y*=10 ; }
STRUCTURE ITERATIVE
Test
Algorigramme DEBUT i m
i+p
action
in
FIN
Remarques : -> la squence est excute tant que la condition est vraie. En gnral, lopration agit directement ou indirectement sur la condition. exemples : for (a=0 ; a<=10; a++) /* pour 0 a 10 */ for ( ; a<=10; a++) /* pas dinitialisation de a */ for (a=0 ; ; a++) /* pas de condition (tjrs fausse) : boucle infinie */ for (a=0 ; a<=10; ) /* pas dopration finale : a doit etre incrmenter dans les actions */
STRUCTURE ITERATIVE
par un compteur)
Autre criture : /************** Affiche les nombres de 0 10 **************/ main () { char i; for ( i = 0; i <= 10;) { printf("i = %d\n", i++); /* i affich en dcimal et retour la ligne et incrmenter i*/ } } Ou encore : /************** Affiche les nombres de 0 10 **************/ main () { char i; i=0; /* Initialiser i */ for (; i <= 10;) { printf("i = %d\n", i++); /* i affich en dcimal et retour la ligne et incrmenter i*/ } } Pour nafficher que des valeurs paires : /************** naffiche que les nombres pairs de 0 10 **************/ main () { char i; i=0; /* Initialiser i */ for (; i <= 10;i++) /*incrmenter i*/ { printf("i = %d\n", i++); /* i affich en dcimal et retour la ligne et incrmenter i*/ } } // remarque : par boucle i est incrment deux fois.
STRUCTURE ITERATIVE
par un compteur)
Elle permet de sortir immdiatement dune boucle au moyen dun saut inconditionnel linstruction qui suit la boucle. Exemple : main () { char i; for ( i = 0; i <= 10; i++) { if (i==5) break; printf("i = %d\n", i); } } Linstruction continue Elle permet de ne pas excuter la squence comprise entre continue et la fin de boucle tout en poursuivant le bouclage. Il sagit l aussi dun saut inconditionnel. Exemple : main () { char i; for ( i = 0; i <= 10; i++) { if (i==5) continue; /* lorsque i==5 on nexcute plus la fin de boucle */ printf("i = %d\n", i); /* i affich en dcimal et retour la ligne */ } } /* dans ce programme, les nombres 0 4 et 6 10 sont affichs. La boucle est cependant excute 11 fois */
/* lorsque i==5 on quitte la boucle / seuls les nombres 0 5 seront affichs */ /* i affich en dcimal et retour la ligne */
3.2 Syntaxe
La syntaxe dune fonction est la suivante:
Paramtre(s) en entre Fonction Appel de la fonction Valeur retourne en sortie
Type_de_la_valeur_de_retour Nom_de_la_fonction (type noms_des_paramtres) { liste dinstructions; // Une ou plusieurs instructions spares par des ; return (valeur) // Valeur renvoyer la fin de la fonction } Remarque : -> Si la fonction ne renvoi pas de valeur (type de la valeur de retour = VOID), la ligne return (valeur) est inutile. -> Tous les paramtres dentres deviennent des variables locales de la fonction. a/ Exemple de fonction sans paramtre dentre et de sortie : Pour appeler la fonction dans un programme :
initialisation();
initialisation
Dclaration de la fonction :
Appel de la fonction
void initialisation(void) { TrisB=(0); TrisA=(0); TrisC=(0x8F); Adcon1=7; // Toutes les broches du PortA en numrique }
b/ Exemple de fonction avec des paramtres dentre et pas de valeur retourne en sortie : Pour appeler la fonction dans un programme :
Paramtre en entre dure (int8) Tempo_Sec Appel de la fonction
Tempo_Sec(10);
Dclaration de la fonction :
void Tempo_Sec(int8 duree) { delay_ms(1000*duree); /* Appel dune autre fonction Delay_ms (avec comme paramtres 1000 * duree) */ }
c/ Exemple de fonction avec des paramtres dentre et une valeur retourne en sortie : Pour appeler la fonction dans un programme :
Paramtre en entre a et b (int8) Tempo_Sec Appel de la fonction Valeur retourne en sortie (int 8)
c=Max(10,30);
Dclaration de la fonction :
int8 Max(int8 a, int8 b) { if(a>b) //si 'a' est suprieur 'b' return a; //on retourne 'a' else //sinon return b; //on retourne 'b' }
4. Les bibliothques standards
Il existe un ensemble de fonctions dj existantes que lon peut utiliser dans nos programmes. Ces fonctions sont stockes dans des librairies (tel que stdio.h par exemple) que lon doit faire rfrence en dbut de programme. Exemple : #include <stdio.h>
Fonctions de temporisation
Le compilateur intgre des fonctions trs pratiques pour grer les dlais, savoir : delay_cycles(valeur) ; // temporisation en NB de cycles delay_us(valeur) ; // temporisation en S delay_ms(valeur) ; // temporisation en mS Remarque : Pour pouvoir utiliser ces fonctions, il faut indiquer par la ligne ci-dessous la frquence du Quartz de votre application. Cette ligne doit tre dfinie au dbut du programme. #use delay (clock=frquence_du_quartz) Exemples : #use delay (clock=4000000) // Quartz de 4Mhz #use delay (clock=20000000) // Quartz de 20Mhz
Programmation en C dun microcontrleur - page 15
Lyce LACHENAL - M. BERNARD - dit le 02/11/2008
Fonctions de temporisation Le compilateur intgre des fonctions trs pratiques pour grer les dlais, savoir : delay_cycles(nbcycle) ; // temporisation en NB de cycles delay_us(valeur) ; // temporisation en S delay_ms(valeur) ; // temporisation en mS valeur peut tre un int16 (de 0 65535) ou une constante de de 0 65535. nbcycle est une constante de de 1 255. Remarque : Pour pouvoir utiliser ces fonctions, il faut indiquer par la ligne ci-dessous la frquence du Quartz de votre application. Cette ligne doit tre dfinie au dbut du programme. #use delay (clock=frquence_du_quartz) Exemples : /**** #use delay (clock=4000000) Quartz de 4Mhz ****/ #use delay (clock=20000000) // Quartz de 20Mhz void main () { delay_us(1000); delay_cycles(10); delay_ms(1000); }
La communication via la liaison srie RS232 Il est possible de rediriger les oprations de lecture et dcriture vers la liaison srie que lont peut rcuprer via lhyperterminal de Windows. Avantage : Afficher des valeurs issue du C ou lui en envoyer. Les fonctions que nous pouvons utiliser : - printf() ; - putc() ; - puts() ; - getc() ; - gets() ; - kbhit() ; Remarque : Pour pouvoir utiliser ces fonctions, il faut indiquer par la ligne ci-dessous que lon souhaite utiliser la liaison RS232 comme priphrique dE/S. Cette ligne doit tre dfinie au dbut du programme aprs la ligne qui dfinie la vitesse du quartz. #use delay (clock=20000000) // Quartz de 20Mhz #use rs232(baud=19200, xmit=PIN_C6, rcv=PIN_C7) //Cblage liaison + vitesse de transfert en bauds
Ecriture formate de donnes : printf() Cette fonction permet denvoyer une chaine de caractre formate sur la liaison RS232. Syntaxe : printf (chaine) ou printf (Cchaine, valeurs...) chaine peut tre une constante de type chaine ou un tableau de char termin par le caractre null. Cchaine est une chaine compose (voir ci-dessous). valeurs est une liste de variables spares par des virgules. La Cchaine doit etre compose de chaines de caractres constante et darguments de mise en forme des valeurs reprsent par le symbole % (formatage) Le formatage des variables : %c : caractre ascii %d : entier (int8 ou int 16) sign affich en base dcimale %o : entier (int8 ou int 16) sign affich en base octale %u : entier (int8 ou int 16) non sign affich en base dcimale %lu : entier long (int32) non sign affich en base dcimale %ld : entier long (int32) sign affich en base dcimale %x : entier (int8 ou int 16) affich en base hexadcimale en minuscules %X : entier (int8 ou int 16) affich en base hexadcimale en majuscules (pour les autres arguments voir la documentation de CCS-Compiler page 196) Rappel : Il faut avoir initialiser la gestion de la liaison RS232 avec la directive #use RS232() (voir prcdemment) Exemple : #use delay (clock=20000000) // Quartz de 20Mhz #use rs232(baud=19200, xmit=PIN_C6, rcv=PIN_C7) void main () { printf("Bonjour !"); printf("\r\nMin: %2X Max: %2X\n\r",min,max); // \n=LF (saut de ligne), \r=CR (retour la premire colonne) printf("%dh %dm %ds ,heu,min,sec); } Ecriture formate de donnes : putc() Cette fonction permet denvoyer un caractre formate sur la liaison RS232. Syntaxe : putc (char) char est un caractre 8 bits Rappel : Il faut avoir initialiser la gestion de la liaison RS232 avec la directive #use RS232() (voir prcdemment) Exemple : #use delay (clock=20000000) // Quartz de 20Mhz #use rs232(baud=19200, xmit=PIN_C6, rcv=PIN_C7) void main () { putc('A'); for(i=0; i<10; i++) putc(buffer[i]); putc(13); }
Programmation en C dun microcontrleur - page 17
Lyce LACHENAL - M. BERNARD - dit le 02/11/2008
Ecriture formate de donnes : getc() Cette fonction permet de recevoir un caractre formate sur la liaison RS232. Syntaxe : variable=getc () variable est un caractre 8 bits Rappel : Il faut avoir initialiser la gestion de la liaison RS232 avec la directive #use RS232() (voir prcdemment) Exemple : #use delay (clock=20000000) // Quartz de 20Mhz #use rs232(baud=19200, xmit=PIN_C6, rcv=PIN_C7) void main () { printf("Continuer (O,N)?"); do { reponse=getch(); } while (reponse!='O' && reponse!='N'); } Ecriture formate de donnes : puts() Cette fonction permet denvoyer une chaine de caractres sur la liaison RS232, termine par le passage a la ligne (LF) Syntaxe : variable=puts(chaine) chaine est une chaine de caractres constante termin par le caractre null Rappel : Il faut avoir initialiser la gestion de la liaison RS232 avec la directive #use RS232() (voir prcdemment) Exemple : #use delay (clock=20000000) // Quartz de 20Mhz #use rs232(baud=19200, xmit=PIN_C6, rcv=PIN_C7) void main () { puts( " ------------- " ); puts( " | Salut ! | " ); puts( " ------------- " ); }
5. Le bootloader Le bootloader est un programme programm une premire fois dans le microcontrleur qui sexcute au reset du C. Apres stre excuter au dmarrage, il donne la main au reste du programme (votre programme). Son rle est de grer la liaison srie et de permettre de tlcharger par cette liaison votre code excutable dans le pic IN SITU en utilisant sur le pc le logiciel Pic downloader . Le PIC donn aux lves contient dj ce morceau de programme. Attention : Il est impratif de protger en mmoire le bootloader en incluant dans votre programme la ligne suivante :