Vous êtes sur la page 1sur 19

Programmation en langage C dun contrleur PIC laide du compilateur C C-CCS

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

PIC , MICROCHIP sont

des marques dposes par Microchip.

Programmation en C dun microcontrleur - page 1


Lyce LACHENAL - M. BERNARD - dit le 02/11/2008

Programmation en C dun C PIC avec CCS - C compiler


1. Gnralits sur le langage
1.1 Historique Le langage C a fait son apparition en 1972 pour le dveloppement du systme dexploitation Unix (Laboratoire BELL - Dennis Ritchie). Il est devenu un standard de la norme ANSI en 1988 apres 5 ans de travail => Naissance de la norme CAINSI En 1988, normalisation du langage C => Norme C-AINSI . Lui, ainsi que son petit frre le C++, sont trs utiliss pour le dveloppement dapplications sous station Unix et PC. Depuis quelques annes il a fait son entre dans le monde des microcontrleurs. Il permet de bnficier dun langage universel et portable pratiquement indpendant du processeur utilis. Il vite les tches dcritures pnibles en langage assembleur et limine ainsi certaines sources derreurs. Nous utilisons un des compilateurs C du commerce spcifique la programmation des microcontrleurs PIC , le compilateur C de chez CSS. 1.2 Qualits du langage : Le langage C est un langage de programmation volu, typ, modulaire et structur : -> Evolu : Le code est indpendant du processeur utilis -> Complet : Un code en C peut contenir des squences de bas niveau (assembleur) proche du matriel. -> Typ : Un type est lensemble des valeurs que peut prendre une variable (Entiers, rels, caractres etc ou dfinir par le programmeur) Modulaire et structur :Tout programme est dcomposable en tches simples (3 structures algorithmiques de base) qui seront regroupes sous forme de modules (fonctions) qui eux mme regroups de faon cohrente en tches plus complexes (structurs) formeront le programme. -> Souple : En C on peut tout faire mais une grande rigueur simpose. -> Efficace : On rflchis (devant sa feuille de papier) et on crit (peu). 1.3 Filire de dveloppement : On dsigne par filire de dveloppement lensemble des outils qui rendre en uvre pour passer du fichier texte (source cod en C) au code objet (code machine) tlcharg dans le microcontrleur. (voir reprsentation page suivante)
Fichiers Description du contenu du fichier (Extensions) Fichiers Description du contenu du fichier (Extensions)

.C .H .PJT .LST .SYM .STA

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.

.HEX .TRE .COF .ERR

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.

Programmation en C dun microcontrleur - page 2


Lyce LACHENAL - M. BERNARD - dit le 02/11/2008

76A 6F8 1 PIC

1.3 Structure dun programme en C

/* 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.

Programmation en C dun microcontrleur - page 3


Lyce LACHENAL - M. BERNARD - dit le 02/11/2008

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

Programmation en C dun microcontrleur - page 4


Lyce LACHENAL - M. BERNARD - dit le 02/11/2008

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

1 bit 8 bits 16 bits 32 bits

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

0 ou 1 0 255 0 65535 0 4 294 967 295

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

8 bits 32 bits 1 bit 8 bits 16 bits

0 255 X 0 ou 1 0 255 0 65535

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

Programmation en C dun microcontrleur - page 5


Lyce LACHENAL - M. BERNARD - dit le 02/11/2008

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

Programmation en C dun microcontrleur - page 6


Lyce LACHENAL - M. BERNARD - dit le 02/11/2008

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

<<

x = y << n // y = x dcal de n bits gauche

Programmation en C dun microcontrleur - page 7


Lyce LACHENAL - M. BERNARD - dit le 02/11/2008

2. Les structures algorithmiques


2.1 Prsentation -> Il existe diffrentes techniques pour reprsenter le fonctionnement dun systme automatis : GRAFCET, Algoritmes, Organigramme. -> Ces techniques sont galement utilises pour la recherche et la mise au point de programmes, qui ne se font en gnral pas directement dans le langage de programmation. -> On passe par des tapes de dgrossissement du problme pos. -> Pour cela on utilise des Algorithmes ou des Organigrammes. -> Ces techniques permettent de trouver une solution sur le papier quil faudra ensuite traduire dans le langage de programmation utilis.
Dfinition dun Algorithme Dfinition dun Organigramme

Suite finie doprations lmentaires constituant un schma de calcul ou de rsolution dun problme

Reprsentation schmatique dune solution un problme

Elments reprsentatifs dun algorithme

Elments reprsentatifs dun Organigramme

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.

Programmation en C dun microcontrleur - page 8


Lyce LACHENAL - M. BERNARD - dit le 02/11/2008

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

/* Remarque : la traduction en langage C est immdiate */

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

Algorigramme void main() { DEBUT


OUI

Langage C

Sinon action 2 Fin de SI FIN Action 1

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++;

if (condition vraie) { Action 1; } else { Action 2; } }

Programmation en C dun microcontrleur - page 9


Lyce LACHENAL - M. BERNARD - dit le 02/11/2008

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

On rencontre 3 formes diffrentes qui permettent LA RPTITION DACTIONS.

1/ STRUCTURE TANT QUE ( Rpetition tant que


Algorithme DBUT TANT QUE test vrai action Fin de TANT QUE FIN FIN
NON

le test est vrai) Langage C void main() {

Algorigramme DEBUT
OUI

Test Action }

while (condition vraie) { Action 1; }

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 ; }

Programmation en C dun microcontrleur - page 10


Lyce LACHENAL - M. BERNARD - dit le 02/11/2008

STRUCTURE ITERATIVE

2/ STRUCTURE REPETER ( Rptition jusqu que le test soit vrai)


Algorithme DBUT REPETER action jusqu que test vrai Fin de tant que FIN FIN Remarques : -> laction est effectue au moins une fois. -> tant que la condition est vraie, la squence daction est excute. -> les mots cls do et while sont des dlimiteurs de la squence : on peut se passer des accolades. exemples : do { compteur=compteur+1 ; // cette action sera excute au moins une fois } while (!(compteur==100) ; //tant que le while() est vrai soit (compteur==100) faux, on incrmente le compteur
NON

Algorigramme DEBUT Action


OUI

Langage C void main() { do { Action ; } while (condition vraie) }

Test

3/ boucle POUR ( Rptition un nombre de fois dtermines


Algorithme DBUT POUR compteur i variant de m n par pas p action Fin de POUR FIN
NON OUI

par un compteur) Langage C

Algorigramme DEBUT i m

i+p

action

void main() { For (i=m ; i<=n ; i=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 */

Programmation en C dun microcontrleur - page 11


Lyce LACHENAL - M. BERNARD - dit le 02/11/2008

STRUCTURE ITERATIVE

3/ boucle POUR ( Rptition un nombre de fois dtermines


Remarques (suite...): /************** Affiche les nombres de 0 10 **************/ main () { char i; for ( i = 0; i <= 10; i++) { printf("i = %d\n", i); /* i affich en dcimal et retour la ligne */ } }

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.

Programmation en C dun microcontrleur - page 12


Lyce LACHENAL - M. BERNARD - dit le 02/11/2008

STRUCTURE ITERATIVE

3/ boucle POUR ( Rptition un nombre de fois dtermines


Remarques (suite...): Linstruction break

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 */

Programmation en C dun microcontrleur - page 13


Lyce LACHENAL - M. BERNARD - dit le 02/11/2008

3. LES FONCTIONS ET PROCEDURES


3.1 Dfinition On appelle procdure ou fonction, un sous-programme qui est appel depuis le programme principal. Une fonction (ou procdure) est une srie d'instructions. Une fonction peut tre appele par une autre fonction et doit retourner une valeur sauf si elle est du type void. Elle peut prendre des arguments dont les noms et types sont dfinis entre les parenthses. Si la fonction n'attend aucun paramtre, on l'indique par le mot rserv void entre parenthses. Un paramtre dentre est la rfrence une variable manipule par la procdure ou la fonction. Un paramtre de sortie est une valeur renvoye par une fonction.

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 }

Programmation en C dun microcontrleur - page 14


Lyce LACHENAL - M. BERNARD - dit le 02/11/2008

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); }

// Cr une pause de 1 mS // Cr une pause de 10 x Tcycl = 10x200 ns = 2S // Cr une pause de 1 Seconde.

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

Programmation en C dun microcontrleur - page 16


Lyce LACHENAL - M. BERNARD - dit le 02/11/2008

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 :

#org 0x1F00, 0x1FFF {}

// Zone programme Protection Bootloader 16F876A


Lyce LACHENAL - M. BERNARD - dit le 02/11/2008

Programmation en C dun microcontrleur - page 18

LES FUSIBLES pour le PIC16F876A (notation CSS)


Note : Le fonctionnement du microcontrleur est dfini par des fusibles qui sont en fait des valeurs dfinies dans des registres spcifiques du PIC. Pour configurer le PIC la compilation il suffit de rajouter la directive ci-dessous avec les fusibles choisis ci-dessous. #fuses HS,NOWDT,NOPROTECT,NOLVP Configuration de lHorloge HS XT RC RC_IO LP Scurit PROTECT NOPROTECT CPD NOCPD WRT WRT_50% WRT_25% WRT_5% NOWRT Reset WDT NOWDT BROWNOUT NOBROWNOUT PUT NOPUT Dbogage DEBUG NODEBUG Programmation LVP NOLVP Programmation avec tension de programmation faible sur la broche B3 (PIC16) ou B5 (PIC18) [PGM] Pas de programmation base tension : broche B3 (PIC16) ou B5 (PIC18) utilise comme une E/S normale Autorise le mode dbogage avec la sonde de programmation et de dbogage In-Situ ICD mode dbogage dsactiv Activation du chien de garde (provoque le reset du C si un bit dun registre spcifique est rinitialis priodiquement par le programme) Pas de chien de garde Activation du BROWN ON RESET : Reset sur une dfaillance dalim Fonction BOR dsactiv. TIMER activ au RESET TIMER dsactiv au RESET Protection active : Impossible de lire le code dans le microprocesseur. Protection dsactive : possibilit de lire le code dans le microprocesseur. Protection du code mmoire dans lEEPROM : Seulement le CPU peut accder lEEPROM Pas de protection du code mmoire dans lEEPROM. Protection du code programme totale la lecture (interdiction de lire) : 100% du code protg Protection lecture : 50% des cases mmoires sont protges Protection lecture : 25% des cases mmoires sont protges Protection lecture : Seul les 255 dernires cases mmoire sont protges [1F00 1FFF] Pas de protection de la mmoire programme Oscillateur externe trs grande vitesse (Foscillation > 4 MHz) Oscillateur externe grande vitesse (200KHz<Foscillation< 4MHz) Oscillateur RC Interne 8 MHz (broche OSC1=E/S normale , OSC2=Fosc/4 ) Oscillateur RC Interne 8 MHz (broche OSC1 et OSC2 =E/S normales) Faible consommation : quartz 32 KHz.

Programmation en C dun microcontrleur - page 19


Lyce LACHENAL - M. BERNARD - dit le 02/11/2008