Theme - Station Meteo PIC - 2006 - Presentation Langage C

12
Microcontrôleur PIC – Présentation du langage C pour PIC TEln Présentation succinte du langage C Les commentaires se font en mettant « // » en début de ligne ou en entourant un bloc pour le mettre en commentaire par « /* » et « */ ». Exemple : // Ceci est un commentaire sur une ligne /* Ceci est un bloc mis en commentaire */ Chaque instruction se termine par un point virgule, chaque début et fin de blocs d'instructions sont entourés par { et }. La fonction principale d'un programme s'appelle toujours main : Exemple : void main() { \\ Votre code ici } Les variables que vous utiliserez pour le PIC seront de deux types : entier noté int, la variable sera comprise entre 0 et 255, déclaration : int nom_variable caractère noté char, la variable contiendra un caractère ascii, déclaration : char nom_variable flottant (nombre à virgule) noté float, déclaration : float nom_variable dans les trois cas vous pouvez initialiser les variables lors de leur création. Exemple : int i=0, j=100, k; char carac='a', car='@', car2; float pi=3.1415, coeff=-0.97; Vous pouvez aussi utiliser des tableaux à une dimension, la déclaration se fait : type_stocké nom_du_tableau[nombre_elements_tableau]. Attention le premier élément est numéroté à partir de 0 et donc le dernier élément sera nombre_elements_tableau-1. Exemple : int valeurs[3]; déclare un tableau de 3 éléments de type entiers. Le premier élément sera accessible par valeurs[0] et le dernier élément sera valeurs[2]. float mesures[2] = {14.65,-45.23}; déclare un tableau de 2 éléments de type flottant. Le premier élément (mesures[0]) est initialisé à 14,65 et le deuxième (mesures[1]) à -45,23. Tableau des opérateurs standards en langage C : reportez à la photocopie jointe à ce document. Le test « Si » Nous avons vu lors de l'examen des opérateurs l'expression conditionnelle. Il existe également bien sûr une structure de contrôle qui réalise l'exécution conditionnelle. Sa syntaxe est la suivante : if (<condition>) {   <instructions ...>} La condition est testée comme un booléen, c'est-à-dire qu'elle est considérée comme vraie si son évaluation n'est pas nulle. « 0 » est considéré comme la valeur booléenne FAUX, « différent de 0 » est considéré comme la valeur booléenne VRAI. Vous pouvez aussi utiliser les valeurs « TRUE » et « FALSE » dans vos tests. Dans le cas où une seule instruction est à exécuter quand la condition est vraie, Olivier DARTOIS – Jacques DUPRAT Page 1

Transcript of Theme - Station Meteo PIC - 2006 - Presentation Langage C

Page 1: Theme - Station Meteo PIC - 2006 - Presentation Langage C

Microcontrôleur PIC – Présentation du langage C pour PIC TEln

Présentation succinte du langage C

Les commentaires se font en mettant « // » en début de ligne ou en entourant un bloc pour le mettre en commentaire par « /* » et « */ ».Exemple :// Ceci est un commentaire sur une ligne/* Ceci est un bloc mis en commentaire */

Chaque  instruction  se  termine  par un  point  virgule,  chaque début et   fin  de blocs  d'instructions  sont entourés par { et }. La fonction principale d'un programme s'appelle toujours main :Exemple :void main(){

\\ Votre code ici}

Les variables que vous utiliserez pour le PIC seront de deux types :● entier noté int, la variable sera comprise entre 0 et 255, déclaration : int nom_variable

● caractère noté char, la variable contiendra un caractère ascii, déclaration : char nom_variable

● flottant (nombre à virgule) noté float, déclaration : float nom_variable● dans les trois cas vous pouvez initialiser les variables lors de leur création.

Exemple :int i=0, j=100, k;char carac='a', car='@', car2;float pi=3.1415, coeff=­0.97;

Vous pouvez aussi utiliser des tableaux à une dimension, la déclaration se fait :type_stocké   nom_du_tableau[nombre_elements_tableau].  Attention   le  premier  élément   est  numéroté  à partir de 0 et donc le dernier élément sera nombre_elements_tableau­1.Exemple :int valeurs[3]; déclare un tableau de 3 éléments de type entiers. Le premier élément sera accessible par valeurs[0] et le dernier élément sera valeurs[2].float mesures[2] = {14.65,­45.23}; déclare un tableau de 2 éléments de type flottant. Le premier élément (mesures[0]) est initialisé à 14,65 et le deuxième (mesures[1]) à ­45,23.

Tableau des opérateurs standards en langage C : reportez à la photocopie jointe à ce document.

Le test « Si »Nous avons vu lors de l'examen des opérateurs l'expression conditionnelle. Il existe également bien sûr une structure de contrôle qui réalise l'exécution conditionnelle. Sa syntaxe est la suivante :

if (<condition>) {   <instructions ...>}

La   condition   est   testée   comme   un   booléen,   c'est­à­dire   qu'elle   est   considérée   comme   vraie   si   son évaluation n'est pas nulle. « 0 » est considéré comme la valeur booléenne FAUX, « différent de 0 » est considéré   comme   la   valeur   booléenne   VRAI.   Vous   pouvez   aussi   utiliser   les   valeurs   « TRUE »   et « FALSE » dans vos tests. Dans le cas où une seule instruction est à exécuter quand la condition est vraie, 

Olivier DARTOIS – Jacques DUPRAT Page 1

Page 2: Theme - Station Meteo PIC - 2006 - Presentation Langage C

Microcontrôleur PIC – Présentation du langage C pour PIC TEln

on trouvera souvent cette instruction toute seule à la place du bloc entre accolades.Le test « Si » avec alternative :if (<condition>) {   <instructions ...>} else {   <instructions ...>}Là encore il est possible de remplacer l'un ou l'autre (ou les deux) blocs entre accolades par une unique instruction. Attention dans ce cas, il faut terminer cette instruction par un point­virgule.

Le test « Si » avec de multiples alternatives :if (<cond1>) {   <instructions ...> /* Si cond1 est vraie */} else if (<cond2>) {           <instructions ...> /* si cond1 fausse et cond2 vraie */       } else {           <instructions ...> /* si cond1 et cond2 fausses */       }}Exemple :if (val_can<128) { // si la valeur lu par le CAN est inférieur à 128   ouput_b(0x0F); // on met à 1 les 4 bits de poids faibles du port B} else {   ouput_b(0xF0); // sinon on met à 1 les 4 bits de poids forts du port B}

Le switch()switch (<expression>) {   case <val 1>:  <instructions ...>   case <val 2>:  <instructions ...>   ...   case <val n>:  <instructions ...>      default:  <instructions ...>}L'instruction  switch  permet  de  diriger   le  programme  vers  une   séquence  d'instructions   choisie   parmi plusieurs, suivant la valeur d'une expression qui doit être de type entier.

Le branchement se fait à l'étiquette case dont la valeur est égale à l'expression de tête (il ne doit y avoir au plus qu'une étiquette qui correspond). Si aucune étiquette ne correspond, le saut se fait à l'étiquette default si elle existe.

Attention, une fois le branchement effectué, le programme continue de s'exécuter dans l'ordre, y compris les case qui peuvent suivre. Pour empêcher ce comportement, on utilise souvent break à la fin des instructions qui suivent le case : son effet est de sauter directement après le bloc du switch.

Exemple :int val,c;c=1;val = mafonctiondecalcul(); /* une fonction définie ailleurs */switch (val) {    case 0:

Olivier DARTOIS – Jacques DUPRAT Page 2

Page 3: Theme - Station Meteo PIC - 2006 - Presentation Langage C

Microcontrôleur PIC – Présentation du langage C pour PIC TEln

    case 1: printf("Résultat 0 ou 1\n"); c=2; break;    case 2: printf("Résultat 2\n"); break;    case 4: printf("Résultat 4\n"); c=0; break;    default: printf("Cas non prévu\n");}Les bouclesLa boucle « for » ou « pour »:C'est une boucle beaucoup plus générale que dans d'autres langages. Son rôle ne se limite pas à la simple répétition en incrémentant un entier. Son utilisation est la suivante :for ( <inst. initiale> ; <cond. de poursuite> ; <inst. d'avancement> ) {    <instructions ...>}

L'instruction initiale est exécutée avant le début de la boucle, la condition de poursuite est testée à chaque début de boucle et l'instruction d'avancement est exécutée en dernière instruction à chaque tour de boucle.Exemple :int tab[100];

for (i=0; i<100; i++) {    output_b(tab[i]); /* exécutées pour i=0, i=1 ... i=99 */}

La boucle « while » ou « tant que »:while (<condition de poursuite>) {    <instruction ...>}Exemple :while (input_c()!=4) { // tant que la valeur lu sur le port C est différente de 4    output_toggle(PIN_B0); // on fait clignoter la DEL qui est reliée au bit de poids faible du port B}

La boucle « do...while » ou « faire...tant que »:Ici   le   test   est   effectué   en   fin   de   boucle.   Cette   boucle   est   donc,   contrairement   aux   deux   boucles précédentes, exécutée au moins une fois, même si la condition est fausse dès le début de la boucle. 

do {    <instructions ...>} while (<condition de poursuite>);

Important : Consultez l'aide en ligne du compilateur

Présentation du langage C pour PIC

Pour   réaliser   les   exemples   qui   suivent   vous   devez   avoir   en   votre   possession   la   documentation   de présentation   des   PICs   et   du   cheminement   de   programmation   de   ceux­ci.   Cette   documentation   sert uniquement à présenter des exemples.

Olivier DARTOIS – Jacques DUPRAT Page 3

Page 4: Theme - Station Meteo PIC - 2006 - Presentation Langage C

Microcontrôleur PIC – Présentation du langage C pour PIC TEln

1. Ex. n°1 : Positionner des sorties - Faire clignoter une DELNous allons donc réaliser notre premier programme en langage C. Nous allons faire clignoter la DEL verte PC0 de la maquette inter+dels. Dans l'EDI, créez un nouveau fichier avec le nom « del.c » puis saisissez les lignes suivantes :

Les lignes 1 à 3 sont des commentaires car les lignes commencent par « // ».La ligne 5 précise quel type de µC nous allons utiliser et inclut un fichier utile à la compilation.La ligne 10 devra être décommentée si vous programmez votre PIC avec TinyBootLoader (décommenté = enlever les « // » devant).La ligne 12 précise les « fusibles » à programmer dans le PIC.La ligne 13 permet de préciser à quel fréquence le quartz de votre carte oscille. Dans la plupart des cas cette valeur sera 4000000 pour un quartz à 4MHz ou 20000000 pour un quartz à 20MHz.La  ligne 15  indique le début de notre programme principal (fonction « main »), vous ouvrez donc une accolade. La  ligne 17 permet de faire boucler indéfiniment notre programme (« while (true) » signifie « tant que vrai »). Les instructions entre les accolades seront donc exécutées sans arrêt.La ligne 18 permet d'envoyer (output) vers le port C (_c) la valeur entre paranthèse (ici 0 en hex= 0x00). Toutes les diodes du port C seront donc éteintes.Au passage vous remarquez que la fin d'une instruction se termine par « ; ».La ligne 19 permet d'attendre le nombre de ms indiqué entre paranthèse (ici 500ms donc 0,5s).La ligne 20 envoie la valeur 1 sur le port C, vous allumez donc la diode relié au bit de poids faible du port C (ici la DEL verte PC0).La ligne 21 permet d'attendre à nouveau 500ms.La ligne 22 indique la fin de la boucle « while(true) ».La ligne 23 indique la fin de notre programme car c'est l'accolade fermante de la fonction « main() ».

Sauvegardez votre programme puis compilez­le. Programmez votre PIC et testez votre programme avec la 

Olivier DARTOIS – Jacques DUPRAT Page 4

Page 5: Theme - Station Meteo PIC - 2006 - Presentation Langage C

Microcontrôleur PIC – Présentation du langage C pour PIC TEln

carte inters+dels. Cela fonctionne...félicitations sinon reprenez le tout étape par étape. N'oubliez pas que l'on peut aussi simuler les programmes dans Isis comme dans le schéma ci­dessous :

RA0/AN02

RA1/AN13

RA2/AN2/VREF­4

RA4/T0CKI6

RA5/AN4/SS7

OSC1/CLKIN9

OSC2/CLKOUT10

RC1/T1OSI/CCP2 12

RC2/CCP1 13

RC3/SCK/SCL 14

RB7/PGD 28RB6/PGC 27

RB5 26RB4 25

RB3/PGM 24RB2 23RB1 22

RB0/INT 21

RC7/RX/DT 18RC6/TX/CK 17

RC5/SDO 16RC4/SDI/SDA 15

RA3/AN3/VREF+5

RC0/T1OSO/T1CKI 11

MCLR/Vpp/THV1

U1

PIC16F876PROGRAM=..\..\..\Documents and Settings\Olivier\Mes documents\TestCCS\del.HEXCLOCK=4MHz

Olivier DARTOIS ­ Jacques DUPRATTELN 2005

D1LED­GREEN

R1

220

Simulation Clignotement DEL sur PC0

Exercice1 :1. Faites clignoter plus rapidement votre DEL puis faites clignoter la del verte PC1.2. Allumez alternativement les diodes vertes PC0,PC2,PC4 puis PC1,PC3,PC5.3. Faites un chenillard qui parcours les 6 diodes jaunes puis les 6 diodes vertes.

2.Ex. n°2 : Lire des entrées – Lire l'état des intersPour   notre   deuxième   exemple,   nous   allons   lire   l'état   des   interrupteurs   de   la   maquette   inters+dels connectés au port B (inters PB0 à PB3) et afficher l'état de ceux­ci sur les quatres DELs du port C (DELs verte PC0 à PC3). Dans l'EDI, créez un nouveau fichier avec le nom « inters.c » puis saisissez les lignes suivantes :

Olivier DARTOIS – Jacques DUPRAT Page 5

Page 6: Theme - Station Meteo PIC - 2006 - Presentation Langage C

Microcontrôleur PIC – Présentation du langage C pour PIC TEln

Nous commentons seulement les lignes nouvelles.La ligne 14 permet de déclarer une variable de type entier (int). Cette variable sert à stocker le résultat d'un calcul ou la valeur d'un des ports du PIC. Une variable de type « int » permet de stocker des valeurs de 0 à 255 (8 bits). Pour stocker des nombres à virgules vous utiliserez le type flottant (float) coder sur 32 bits.La ligne 17 lit l'état des lignes connectées au port B (input_b) et vous stockez cette valeur dans la variable « val_inter ».La  ligne   18  permet   de   mettre   sur   le   port   C   la   valeur   « val_inter »   et   donc   d'allumer   les   DELs correspondantes aux inters en position « 1 ».

Sauvegardez votre programme puis compilez­le. Programmez votre PIC et testez votre programme avec la carte inters+dels. Si à chaque fois que vous actionnez un inter PB0 (à PB3) la diode PC0 (à PC3) s'allume votre programme fonctionne correctement sinon vérifiez le tout et recommencez.La schéma de simulation peut être le suivant :

RA0/AN02

RA1/AN13

RA2/AN2/VREF­4

RA4/T0CKI6

RA5/AN4/SS7

OSC1/CLKIN9

OSC2/CLKOUT10

RC1/T1OSI/CCP2 12

RC2/CCP1 13

RC3/SCK/SCL 14

RB7/PGD 28RB6/PGC 27

RB5 26RB4 25

RB3/PGM 24RB2 23RB1 22

RB0/INT 21

RC7/RX/DT 18RC6/TX/CK 17

RC5/SDO 16RC4/SDI/SDA 15

RA3/AN3/VREF+5

RC0/T1OSO/T1CKI 11

MCLR/Vpp/THV1

U1

PIC16F876PROGRAM=inters.HEXCLOCK=4MHz

Olivier DARTOIS

TELN 2005

PC0R1 220

Simulation Lecture Inters

PC1R2PC2

PC3R3

R4

PB0

PB2

PB1

PB3

R510k

R810k

+5V

et Aff ichage sur DELs

Jacques DUPRAT

Remarque : Les résistances R5 à R8 sont des résistances de tirage vers le haut (fixe un potentiel +5V donc un « 1 » logique lorsqu'un inter est ouvert). Le port B du PIC possède en interne des résistances de tirages vers le haut. Celles­ci sont activées par l'instruction port_b_pullups(true) et désactivées par l'instruction port_b_pullups(false). Si vous activez dans votre programme les résistances de tirage vers le haut alors les résistances R5 à R8 ne sont plus nécessaires.

Exercice2 :Faites  un  programme qui   lit   l'état  des   inters  PB0 à  PB3 et  qui  allume  les  dels  du port  C avec  les conditions suivantes:– si PB0 et PB1 sont à 1 alors vous allumez la diode verte PC0 et uniquement celle­ci.– si PB2 et PB3 sont à 1 alors vous allumez la diode verte PC1 et uniquement celle­ci.– si PB0 et PB3 sont à 1 alors vous faites clignoter les diodes PC0 et PC1.– dans tous les autres cas la diode verte PC2 devra être allumé.Indication : utilisez une structure « switch ».

Olivier DARTOIS – Jacques DUPRAT Page 6

Page 7: Theme - Station Meteo PIC - 2006 - Presentation Langage C

Microcontrôleur PIC – Présentation du langage C pour PIC TEln

3.Ex. n°3 : La conversion analogique-numériqueLa plupart des capteurs délivrent une tension proportionnelle au phénomène qu'ils mesurent. Pour être exploitable cette tension doit être numérisée à l'aide d'un convertisseur analogique numérique (CAN ou DAC en anglais : Digital to Analog Converter). Le µC PIC possède des entrées analogiques sur le port A (entrées AN0 à AN4). Deux de ces entrées peuvent être configurées pour fixer la limite basse (VREF­) et haute (VREF+) de la numérisation. La résolution du convertisseur interne du PIC est de 10 bits (soit 1024 valeurs possibles). Nous utiliserons une résolution plus faible sur 8 bits qui est la valeur par défaut du convertisseur (soit 256 valeurs possibles).

Dans notre exemple nous allons numériser la tension présente sur l'entrée AN2 et afficher le résultat sur les 6 DELs du port C. 

Quand nous aurons une tension de 0V sur l'entrée AN2, toutes les DELs du port C seront éteintes. Quel sera la valeur de la tension présente lorsque les six premières dels du port C seront allumées ?

Dans l'EDI, créez un nouveau fichier avec le nom « can.c » puis saisissez les lignes suivantes :

Nous commentons seulement les lignes nouvelles.La  ligne 14 permet de déclarer une variable de type entier qui va permettre de stocker le résultat de la conversion analogique­numérique.La ligne 16 permet d'initialiser le port A en analogique et de préciser quelle entrée va être utilisé pour la conversion. Les valeurs possibles pour cette fonction sont :

Olivier DARTOIS – Jacques DUPRAT Page 7

Page 8: Theme - Station Meteo PIC - 2006 - Presentation Langage C

Microcontrôleur PIC – Présentation du langage C pour PIC TEln

Valeurs Description

NO_ANALOGS Toutes les entrées du port A en mode numérique

ALL_ANALOGS Toutes les entrées du port A en mode analogique

AN0_AN1_AN2_AN4_VSS_VREF Entrées AN0, AN1, AN2 et AN4 en analogique, AN3 Tension Reférence haute (VREF+)

AN0_AN1_AN3 Entrées AN0, AN1 et AN3 en analogique, AN2 et AN4 en numérique

AN0_AN1_VSS_VREF Entrées AN0 et AN1 en analogique, AN3 Tension Reférence haute (VREF+), AN2 et AN4 en numérique

AN0_AN1_AN4_VREF_VREF Entrées AN0, AN1 et AN4 en analogique, AN2 Tension de Référence  basse (VREF­), AN3 Tension de Référence haute (VREF+)

AN0_AN1_VREF_VREF Entrées AN0 et AN1 en analogique, AN2 Tension de Réf. basse (VREF­), AN3 Tension de Réf. haute (VREF+), AN4 en numérique

AN0 Entrées AN0 analogique, toutes les autres entrées en numérique

AN0_VREF_VREF Entrées AN0 analogique,AN2 Tension de Réf. basse (VREF­), AN3 Tension de Réf. haute (VREF+), AN1 et AN4 en numérique

La ligne 17 détermine l'horloge utilisé pour la conversion.La ligne 18 permet de sélectionner l'entrée à numériser. Dans notre cas seul le canal 0 est utilisé donc on sélectionne celui­ci sinon il suffit de préciser le numéro de canal.La ligne 19 permet au convertisseur de s'initialiser en attendant 100ms.La ligne 22 permet de lire le résultat de la conversion et stocke celui­ci dans la variable val_can.La ligne 23 envoie sur cette valeur vers le port C et allume les DELs en conséquence.

Sauvegardez votre programme puis compilez­le. Programmez votre PIC et testez votre programme avec la carte inters+dels. Tournez lentement le potentiomètre relié à la voie AN2. Lorsque vous faites varier cette tension les DELs du port C doivent s'éteindre ou s'allumer en fonction de la valeur convertie. Vérifiez l'état des DELs pour une tension de 0V, 1V (mesurez la tension au potentiomètre avec un multimètre) puis comparez­là avec la théorie. Vérifiez votre réponse à la question de la page précédente en allumant les 6 premières diodes vertes et en relevant au multimètre la tension sur le potentiomètre.

Le schéma de simulation pour cet exemple sera :

RA0/AN02

RA1/AN13

RA2/AN2/VREF­4

RA4/T0CKI6

RA5/AN4/SS7

OSC1/CLKIN9

OSC2/CLKOUT10

RC1/T1OSI/CCP2 12

RC2/CCP1 13

RC3/SCK/SCL 14

RB7/PGD 28RB6/PGC 27

RB5 26RB4 25

RB3/PGM 24RB2 23RB1 22

RB0/INT 21

RC7/RX/DT 18RC6/TX/CK 17

RC5/SDO 16RC4/SDI/SDA 15

RA3/AN3/VREF+5

RC0/T1OSO/T1CKI 11

MCLR/Vpp/THV1

U1

PIC16F876PROGRAM=can.HEXCLOCK=4MHz

Olivier DARTOIS

TELN 2005

PC0R1 220

Simulation CAN

PC1R2

PC2

PC3

R3

R4

et Aff ichage sur DELs

Jacques DUPRAT

PC4

PC5

PC6

PC7

R5

R6

R7

R8220

RV1

1k

+5V

Olivier DARTOIS – Jacques DUPRAT Page 8

Page 9: Theme - Station Meteo PIC - 2006 - Presentation Langage C

Microcontrôleur PIC – Présentation du langage C pour PIC TEln

Exercice3 :Configurez  le convertisseur  analogique numérique  du PIC pour  qu'il  prenne comme valeur basse de conversion la tension Vref­ et comme valeur haute de conversion la tension Vref+. Réglez Vref+ à 3V et Vref­ à 1V. Affichez sur les dels vertes du port C le résultat de la conversion.Comparez   le   quantum  dans   cette   configuration   et   le   quantum  précédent.  Quel   est   l'intérêt   de   cette configuration ?

4.Ex. n°4 : Utilisation de la voie sérieLa   communication   avec   le   « monde »   extérieure   (au   µC   PIC)   est   très   importante   aujourd'hui.   En particulier   la   communication   par   voie   série   vers   un   ordinateur   permet   d'accéder   à   la   puissance   de stockage et de calculs qu'un µC ne possède pas forcement.Nous allons réaliser une conversion puis transmettre le résultat de cette conversion par la voie série vers le PC. Nous utiliserons le logiciel TinyBootLoader pour visualiser les résultats.

Dans l'EDI, créez un nouveau fichier avec le nom « série.c » puis saisissez les lignes suivantes :

La  ligne 12  permet de définir les caractéristiques de la communication sur la voie série ainsi que les broches utilisées pour celle­ci. Dans notre exemple, vous transmettrez à une vitesse de 19200 baud, la broche d'émittion sera RC6 (portC, 6ème broche), la broche de réception sera RC7 (portC, 7ème broche) enfin il n'y aura pas de bit de parité (parity=None). Du coté de votre logiciel de dialogue sur la voie série (HyperTerminal), il faudra régler les mêmes paramètres.La ligne 17 définit une variable de type flottant (float) donc elle pourra stocker un nombre à virgule.La ligne 18 définit une constante (const) de type flottant. Son nom sera « Quantum » est vaudra 5V/255 

Olivier DARTOIS – Jacques DUPRAT Page 9

Page 10: Theme - Station Meteo PIC - 2006 - Presentation Langage C

Microcontrôleur PIC – Présentation du langage C pour PIC TEln

soit 0,0196V. Cette constante permet de transformer une valeur compris entre 0 et 255 fourni par le CAN en une tension compris entre 0V et 5V.La ligne 27 permet d'obtenir le résultat de la conversion du CAN, de le multiplier par le Quantum afin d'obtenir dans la variable tension la valeur de la tension présente sur l'entrée AN0.La  ligne 28  permet d'envoyer des  informations  sur  la  voie  série.  La  fonction utilisée est   la   fonction « printf ». Cette fonction est relativement complexe et est expliquée dans la documentation officielle du compilateur C. Dans notre cas, nous envoyons vers la voie série le texte qui est compris entre guillements ou « %2.2f » est remplacé par la valeur de la tension :

• le « \r » permet de ramener le curseur au début de la ligne.• le « \n » permet de sauter une ligne.• le « %2.2f » permet de formater le flottant tension (lettre 'f' dans '%2.2f') pour qu'il s'affiche avec 

deux chiffres avant la virgule et deux chiffres aprés la virgule.

Sauvegardez votre programme puis compilez­le. Programmez votre PIC et testez votre programme   en injectant   une   tension   analogique   variable   (alimentation   par   exemple)   sur   la   ligne   AN0.   Connectez l'interface de communication sur le connecteur HE10­10 correspondant de votre carte gestion et sur le PC lancez le programme TinyBootLoader. Les valeurs de la tension numérisée par le PIC sur la voie AN0 devraient apparaitre alors dans l'onglet « Terminal » si vous vous êtes bien connecté. Faites varier votre tension analogique et constatez les changements.

Le schéma de simulation pour Isis utilise des composants virtuels et en particulier le composant « Virtual Terminal ». Saisissez le schéma suivant et testez­le :

RA0/AN02

RA1/AN13

RA2/AN2/VREF­4

RA4/T0CKI6

RA5/AN4/SS7

OSC1/CLKIN9

OSC2/CLKOUT10

RC1/T1OSI/CCP2 12

RC2/CCP1 13

RC3/SCK/SCL 14

RB7/PGD 28RB6/PGC 27

RB5 26RB4 25

RB3/PGM 24RB2 23RB1 22

RB0/INT 21

RC7/RX/DT 18RC6/TX/CK 17

RC5/SDO 16RC4/SDI/SDA 15

RA3/AN3/VREF+5

RC0/T1OSO/T1CKI 11

MCLR/Vpp/THV1

U1

PIC16F876PROGRAM=serie.HEXCLOCK=4MHz

Olivier DARTOIS

TELN 2005

Numérisation voie AN0et envoie valeur sur voie série

Jacques DUPRAT

RV1

1k

+5V

RXD

RTS

TXD

CTS

VIRTUAL TERMINAL

BAUDRATE=19200DATABITS=8PARITY=NONESTOPBITS=1

5.Ex. n°6 : Utilisation d'un afficheur LCDPour que  les  affichages de données  soient  plus  attrayant  vous  pouvez  utiliser  un  afficheur  LCD.  Le modèle que nous utiliserons fait 2 lignes de 16 caractères. Le compilateur CCS est fourni avec un pilote d'afficheur LCD, nous allons donc utiliser cette bibliothèque de fonction :

● lcd_init() : fonction d'initialisation de l'afficheur LCD. A appeler en premier.

Olivier DARTOIS – Jacques DUPRAT Page 10

Page 11: Theme - Station Meteo PIC - 2006 - Presentation Langage C

Microcontrôleur PIC – Présentation du langage C pour PIC TEln

● lcd_putc(c)  :   fonction  qui  permet d'envoyer un caractère vers  l'afficheur LCD.  Les caractères spéciaux « \f » (effacement écran), « \n » (passer à la deuxième ligne) peuvent être utilisés dans la chaine de caractères que vous envoyez au LCD.

● lcd_gotoxy(x,y) : fonction qui permet de déplacer le curseur de l'afficheur.● lcd_getc(x,y)  : fonction qui permet de récupérer le caractère qui se trouve sous le curseur. Vous 

n'utiliserez pas cette fonction.

Pour que votre afficheur fonctionne sur vos maquettes, il faut rajouter avant la ligne « #include <lcd.c> » la ligne « #define use_portb_lcd TRUE » pour dire au compilateur que l'afficheur est connecté au port B du PIC.

Nous allons réaliser un programme qui affiche un message de bienvenue sur l'afficheur pendant 3s puis nous   testerons   l'appui   des   boutons   K1   et   K2   et   nous   afficherons   un   message   en   conséquence   sur l'afficheur.

Pour cela, dans l'EDI, créez un nouveau fichier avec le nom « lcd.c » puis saisissez les lignes suivantes :

La ligne 6 indique que vous réaliserez la programmation avec le logiciel TinyBootLoader.La  ligne 16 permet d'initialiser l'afficheur LCD. Les  lignes 17 et 18  affichent un message sur les deux lignes de l'afficheur LCD.La ligne 23 permet de récupérer la valeur du port C et de la stocker dans la variable val_portC.

Olivier DARTOIS – Jacques DUPRAT Page 11

Page 12: Theme - Station Meteo PIC - 2006 - Presentation Langage C

Microcontrôleur PIC – Présentation du langage C pour PIC TEln

La ligne 24 permet de récupérer l'état des deux interrupteurs K1 et K2 en éliminant tous les autres bits. Sur le schéma structurel, vous voyez que lorsqu'un bouton poussoir est enfoncé vous positionnez le bit correspondant à  1.  Si  le bouton est relaché,   le bit correspondant est à  0 (résistance de rappel vers la masse). K1 est relié à PC4 et K2 est relié à PC5. Pour éliminer les bits non significatifs vous faites donc un ET logique entre la valeur lue sur le port C et la valeur binaire 00110000.La ligne 25 teste si la valeur lue sur le port C est égale à 16 (symbole == dans la condition de test du si). En effet K1 relié à PC4 donc en décimal si ce bit est à 1 son poids vaut 16 en décimal. Si c'est le cas alors vous affichez un message sur l'afficheur LCD.Les lignes 26 et 27 sont quasiment identiques dans le raisonnement à la ligne 25.

Modifiez   votre   programme  pour   afficher   un  message   si   les  deux  boutons  K1  et  K2   sont   enfoncés. Envoyez sur la voie série l'état des boutons et visualisez dans TinyBootLoader ce qu'envoie le PIC.

Le schéma de simulation de ce montage est le suivant :

RA0/AN02

RA1/AN13

RA2/AN2/VREF­4

RA4/T0CKI6

RA5/AN4/SS7

OSC1/CLKIN9

OSC2/CLKOUT10

RC1/T1OSI/CCP2 12

RC2/CCP1 13

RC3/SCK/SCL 14

RB7/PGD 28RB6/PGC 27

RB5 26RB4 25

RB3/PGM 24RB2 23RB1 22

RB0/INT 21

RC7/RX/DT 18RC6/TX/CK 17

RC5/SDO 16RC4/SDI/SDA 15

RA3/AN3/VREF+5

RC0/T1OSO/T1CKI 11

MCLR/Vpp/THV1

U1

PIC16F876PROGRAM=LCD.HEXCLOCK=4MHz

+5V

Afficheur LCD

Olivier DARTOIS

TELN 2005

Jacques DUPRAT

R110k

R210k

K1 K2

+5V

D7

14D

613

D5

12D

411

D3

10D

29

D1

8D

07

E6

RW

5R

S4

VSS

1

VD

D2

VEE

3LCD1LM016L

6.Les fonctions disponibles en langage C pour PICReportez­vous à l'aide intégré dans le compilateur C et aux documentations mises à votre disposition sur le réseau.

Olivier DARTOIS – Jacques DUPRAT Page 12