Vous êtes sur la page 1sur 123

V.TOURTCHINE. Programmation en mikroC.

Application pour les microcontrleurs de la famille PIC

REPUBLIQUE ALGERIENNE DEMOCRATIQUE ET POPULAIRE


MINISTERE DE LENSEIGNEMENT SUPERIEUR ET DE LA RECHERCHE SCIENTIFIQUE

UNIVERSITE MHAMED BOGARA DE BOUMERDES


FACULTE DES SCIENCES - DEPARTEMENT PHYSIQUE

Spcialit : INFOTRONIQUE &


IMAGERIE ET APPAREILLAGE BIOMEDICAL

V. TOURTCHINE

Programmation en mikroC. Application pour les microcontrleurs de la famille PIC

/******************************* COMMUNICATION SERIE RS232 ========================= Cet exemple illustre l'utilisation de fonction Software_UART de la bibliothque du compilateur mikroC PRO. Microcontrl.: 16F887 Oscillat.: HS,10.0000 Mhz Fichier: COMMUNIC_RS232.c ******************************** / char error, byte_read; void main() { ANSEL = 0; ANSELH = 0; TRISC = 0x00; /*Configurer PORTB en sortie */ PORTC = 0; Initialiser Soft_UART en 9600 bods Soft_UART_Init(&PORTC, 7, 6, 9600, 1); if (error > 0)

Manuscrit labor selon le programme officiellement agre et confirme par le Conseil Scientifique de la Facult des Sciences

BOUMERDES - 2012
-0-

V.TOURTCHINE. Programmation en mikroC. Application pour les microcontrleurs de la famille PIC

I. LANGAGE ET COMPILATEUR mikroC POUR PIC


Le langage mikroC pour PIC a trouv une large application pour le dveloppement de systmes embarqus sur la base de microcontrleur. Il assure une combinaison de l'environnement de programmation avance IDE (Integrated Development Environment) , et dun vaste ensemble de bibliothques pour le matriel, de la documentation complte et dun grand nombre des exemples. Le compilateur mikroC pour PIC bnficie d'une prise en main trs intuitive et d'une ergonomie sans faille. Ses trs nombreux outils intgrs (mode simulateur, terminal de communication Ethernet, terminal de communication USB, gestionnaire pour afficheurs 7 segments, analyseur statistique, correcteur d'erreur, explorateur de code, mode Dbug ICD...) associ sa capacit pouvoir grer la plupart des priphriques rencontrs dans l'industrie (Bus I2C, 1Wire, SPI, RS485, Bus CAN, USB, gestion de cartes compact Flash et SD/MMC, gnration de signaux PWM, afficheurs LCD alphanumriques et graphiques, afficheurs LEDs 7 segments, etc...) en font un outil de dveloppement incontournable pour les systmes embarqus, sans aucun compromis entre la performance et la facilit de dbogage.

1.1 Compilateur mikroC PRO pour PIC


La nouvelle version appele mikroC PRO dispose de trs nombreuses amliorations du compilateur mikroC : nouvelles variables utilisables, nouvelle interface IDE, amlioration des performances du linker et de l'optimisateur, cycle de compilation plus rapide, code machine gnr plus compact (jusqu' 40 % suivant les cas), nouveaux PIC supports, environnement de dveloppement encore plus ergonomique, nouveaux exemples d'applications, etc...

1. Dans la suite nous utiliserons le compilateur mikroC PRO v.1.65 2. La simulation des applications de programmation nous ralisons laide du logiciel PROTEUS v.7.6 SP

1.2 Installation du compilateur mikroC PRO v. 1.65


Pas 1 : Cliquer sur licne mikroC_PRO_1.65.exe (Si la fentre du Contrle de compte dutilisateur souvre, cliquer sur oui), et attendre que les donnes de linstallation se dcompressent.

-1-

V.TOURTCHINE. Programmation en mikroC. Application pour les microcontrleurs de la famille PIC Pas 2 : Cliquer sur Next

Pas 3 : Cocher la case : I accept the terms in the License Agreement et cliquer sur Next

-2-

V.TOURTCHINE. Programmation en mikroC. Application pour les microcontrleurs de la famille PIC

Pas 4 : Avant de cliquer sur Next, il est recommand de laisser la case Install For All Users coch. Cliquer sur Next

Pas 5 : Cliquer sur Next

-3-

V.TOURTCHINE. Programmation en mikroC. Application pour les microcontrleurs de la famille PIC Pas 6 : Cliquer sur Install (Noter bien lendroit dinstallation)

Pas 7 : Cliquer sur OUI pour lassociation du format de fichier .c avec le logiciel mikroC PRO

-4-

V.TOURTCHINE. Programmation en mikroC. Application pour les microcontrleurs de la famille PIC Pas 8 : Cliquer sur Finish

Pas 9 : Aller dans le rpertoire M_License et copier les deux fichiers qui sy trouvent.

Pas 10 : Coller pour remplacer les deux fichiers copis auparavant dans le rpertoire o mikroC PRO a t install. Pas 11 : Cliquer deux fois sur le fichier mikroC_PRO_PIC.key pour enregistrer ses informations sur le registre de votre ordinateur. Pas 12 : Lancer le programme MikroC PRO en cliquant deux fois sur mikroCPIC1618.exe

1.3 IDE mikroC PRO Lancer le compilateur mikroC PRO en cliquant sur licne

mikroC PRO for PIC.lnk

Cest sur la figure 1.1 que vous obtenez lorsque vous dmarrez l IDE mikroC PRO pour la premire fois. Une description dtaill de toutes les options disponibles dans ce compilateur prendre trop de temps, de sorte que nous allions sauter cette tape. Au lieu de cela, nous allons dcrire salement le processus dcriture dun programme en langage mikroC, un simulateur de contrle. Pour plus dinformations reportez-vous laide [F1]. -5-

V.TOURTCHINE. Programmation en mikroC. Application pour les microcontrleurs de la famille PIC

Menu

Toolbar

Projet Manager

Code Explorer

Code Editor

Project Settings
(paramtres principaux du microcontrleur)

Error Window

Fig. 1.1 Lenvironnement IDE du compilateur microC PRO

Editeur de code (voire la figure 1.1 : Code Editeur) Lditeur de code est le mme que toute diteur de texte standard pour lenvironnement de Windows, y compris Copie, Coller , Annuler les actions etc Il possde en plus des ressources comme suit : Coloration syntaxique rglable Assistant de code Assistant de paramtre Mise en forme automatique

Dans la bote de dialogue Obtions (figure 1.2) vous pouvez configurer la coloration syntaxique, l'aide pour le code et paramtres, la correction automatique etc. Pour accder ce dialogue cliquez sur Tools > Options du menu droulant ou sur l'icne Assistant de code Si vous imprimez les premires lettres du mot et puis appuyez sur Ctrl + Espace, tous les identificateurs autoriss correspondant aux caractres imprims seront offerts dans une fentre (voir la figure 1.3). Maintenant, nous pouvons continuer rduire le choix de taper ou d'utiliser la sourie pour slectionner l'option approprie dans la propose et appuyez sur Entre.

-6-

V.TOURTCHINE. Programmation en mikroC. Application pour les microcontrleurs de la famille PIC

Fig.1.2. Bote de dialogue Options

Fig.1.3. Assistant de code Mise en forme automatique Afin d'obtenir une lisibilit maximale, il est possible de gnrer automatiquement la mise en forme de certaines instructions. Par exemple, tapez l'instruction IF, puis CRTL + J. A ce stade, l'diteur ajoute tout seul les instructions. A vous ensuite de complter le programme.

Affichage syntaxique color Toujours dans le but d'obtenir une lisibilit maximale de votre programme, il vous est possible de configurer entirement les couleurs de chaque partie du listing (figure 1.2). Par exemple les commentaires en "vert", les instructions en "noir", les valeurs numriques en "bleu clair", etc. Outils intgrs Le compilateur "MikroC PRO" pour PIC intgre diffrents petits outils trs pratiques qui vous simplifieront lcriture des programmes de vos applications.

-7-

V.TOURTCHINE. Programmation en mikroC. Application pour les microcontrleurs de la famille PIC

a) Mini terminal USART Le "MikroC PRO" intgre un petit terminal de communication USART RS-232 (Universal Synchronous Asynchronous Receiver) pour lequel vous pourrez configurer le dbit, les commandes RTS et DTR....

b) Mini gestionnaire 7 segments Le "MikroC PRO" intgre un petit utilitaire qui vous permettra de slectionner la valeur dcimale ou hexadcimale fournir pour piloter un afficheur 7 segments.

c) Table de conversion ASCII Le "MikroC PRO" intgre un petit utilitaire qui vous permettra d'afficher une table de conversion ASCII (trs utile lorsque vous travaillez avec des afficheurs LCD).

d) Gestion des LCD graphiques Le "MikroC PRO" intgre un petit utilitaire qui vous permettra de convertir des fichiers BMP en donnes pouvant tre affiches sur plusieurs types de LCD graphiques.

-8-

V.TOURTCHINE. Programmation en mikroC. Application pour les microcontrleurs de la famille PIC

1.4 Cration dun nouveau projet Le mikroC PRO pour PIC organise des applications dans des projets, compos d'un seul fichier de projet (extension. mcppi) et un ou plusieurs fichiers sources (extension). Les fichiers source peut tre compil que si elles font partie d'un projet. Le fichier projet contient les informations suivantes : Nom du projet et une description facultative Composant cible Option du composant Frquence dhorloge du composant La liste des fichiers source du projet avec les chemins Fichiers d'image Fichiers binaires (* mcl.) D'autres fichiers

La meilleure faon de crer un projet cest l'aide de l'Assistant Nouveau projet (menu Project> New ProjeCt ) ou en cliquant sur l'icne Nouveau projet du projet. partir de la barre d'outils

-9-

V.TOURTCHINE. Programmation en mikroC. Application pour les microcontrleurs de la famille PIC

Nouvelles tapes de l'Assistant de projet


Commencez crer votre nouveau projet, en cliquant sur le bouton Next :

Premier pas - Slectionnez le priphrique dans le priphrique dans la liste droulante.

- 10 -

V.TOURTCHINE. Programmation en mikroC. Application pour les microcontrleurs de la famille PIC

Deuxime pas - Saisir la valeur de frquence de l'oscillateur.

Troisime pas - Spcifiez l'emplacement o votre projet sera enregistr.

- 11 -

V.TOURTCHINE. Programmation en mikroC. Application pour les microcontrleurs de la famille PIC

Quatrime pas - Ajout pour le projet un fichier sil sont disponibles en ce moment. vous pouvez toujours ajouter des fichiers de projet plus tard en utilisant Project Manager.

- 12 -

V.TOURTCHINE. Programmation en mikroC. Application pour les microcontrleurs de la famille PIC Cinquime tape - Cliquez sur Finish pour crer votre nouveau projet.

A ce stade, une nouvelle fentre vide (fig. 1.4) saffiche afin que vous pussiez y saisir votre programme.

Ici vous devez saisir votre code-source

1.5 Compilation
- 13 -

V.TOURTCHINE. Programmation en mikroC. Application pour les microcontrleurs de la famille PIC

Lorsque vous avez cr le projet et crit le code source, il est temps de le compiler. Slectionnez Project Build partir du menu droulant ou cliquez sur l'icne Build dans la barre d'outils du projet.

Si plus d'un projet est ouvert, vous pouvez compiler tous ouverts projets en slectionnant Project
Build All dans le menu droulant, ou cliquez sur licne

de la barre d'outils du projet.

Barre de progression s'affiche pour vous informer sur l'tat de la compilation. Si il y a des quelques erreurs, vous en serez inform dans la fentre d'erreur (fig. 1.4).

Fig. 1.4 Avertissement des rreures

Aprs la compilation russie, le compilateur mikroC PRO pour PIC gnre des fichiers de sortie dans le dossier du projet (dossier qui contient le fichier projet. mcppi). Les fichiers de sortie sont rsums dans le tableau ci-dessous: Format
Intel HEX Binary

Description Code hexadcimal dans le format Intel. Fichier est utilis pour programmer PIC Fichier compil pour la bibliothque mikroC. Les distributions binaires sont des routines qui susceptibles - 14 -

Type de fichier
.hex .mcl

V.TOURTCHINE. Programmation en mikroC. Application pour les microcontrleurs de la famille PIC dtre inscrits dans d'autres projets. .lst Lmage globale de lallocation de mmoire du PIC pour : adresses dinstructions, les registres et les tiquettes du programme. Le fichier en assembleur avec des noms symboliques, .asm obtenus partir de liste des fichiers.

List File

Assembler File

1.5 Fichiers Sources Cration dun nouveau fichier source Pour crer un nouveau fichier source, procdez comme suit : Slectionne New depuis le menu File ou pressez Ctrl+N ou cliquez sur licne New Fill depuis la barre doutils File. Une nouvelle fentre souvrira dans laquelle vous pourrez saisir votre code source. Slectionnez alors Save depuis le menu File ou pressez Ctrl+S ou cliquez sur licne Save File depuis la barre doutils File et nommez ce dernier comme vous le voulez.

Ouvrir un fichier existant Slectionnez Open depuis le menu File ou pressez Ctrl+Q ou cliquez sur licne Open File depuis la barre doutils File. Dans la boite de dialogue Ouvrir, slectionnez alors lemplacement du fichier que vous dsirez ouvrir et cliquez sur le bouton Ouvrir. Le fichier slectionn saffiche dans sa propre fenetre. Si le fichier slectionn est dj ouvert, sa fenetre ddition (Editor) deviendra alors active.

Sauvegarder un fichier
Assurez-vous que la fentre contenant le fichier que vous voulez sauvegarder est active. Slectionnez ensuite Save depuis le menu File ou pressez Ctrl+S ou cliquez sur licne Save Fail de la barre doutils File.

Sauvegarder un fichier sous un nom diffrent


Assurez-vous que la fentre contenant le fichier que vous voulez sauvegarder est active. Slectionnez ensuite Save As depuis le menu File. Une bote - 15 de dialogue Save [nom du fichier] .c as saffichera alors. Dans cette bote, slectionnez lemplacement dans lequel vous voulez sauvegarder le fichier.

V.TOURTCHINE. Programmation en mikroC. Application pour les microcontrleurs de la famille PIC

II. INTRODUCTION AU LANGAGE DE PROGRAMMATION MICROC


2.1 Structure d'un programme en mikroC La structure la plus simple d'un programme en mikroC, cest le programme reprsent dans le code-source 2.1, qui nous permettra de faire clignoter une LED connecte au PORTB (par exemple bit 0 du PORTB) du microcontrleur PIC avec une priode de 2 secondes (1 seconde allume et une seconde teinte). 2.1.1 Rgles gnrale dcriture en microC Les instructions propres au langage microC doivent tre crites en minuscule (void main (void)). Les instructions particulires aux microcontrleurs doivent tre crites en majuscule (TRISB). Les retours la ligne et les espaces servent uniquement arer le code Toutes instructions ou actions se terminent par un point virgule ; . Code-source 2.1
/**************************************************************************** LED clignotante ============== Ce programme fait clignoter dune LED connecte au PORTB (broche RB0) avec un des intervalles d'une seconde. Microcontrleur : 16F84A Oscillateur : HS, 4.0000 Mhz

- 16 -

V.TOURTCHINE. Programmation en mikroC. Application pour les microcontrleurs de la famille PIC


Fichier : LED.c Date : Juillet 2012 ****************************************************************************/ void main() { for(;;) // Boucle sans fin { TRISB = 0; // Configuration du PORTB en sortie PORTB.0 = 0; // RB0 = 0 Delay_Ms(1000); // Pause dune seconde PORTB.F0 = 1; // RB0 = 1 Delay_Ms(1000); // Pause dune seconde } // Fin de la boucle }

Examinons le fichier LED.c du code-source

2.1.2 Commentaires
Les commentaires sont utiliss pour prciser le fonctionnement du programme et pour une annotation du programme. Les lignes de commentaires sont ignores et non compil par le compilateur. En mikroC les commentaires de programmes peuvent tre de deux types: de longs commentaires, stendant sur plusieurs lignes, et de courts commentaires, occupant une seule ligne. Un commentaire au dbut d'un programme peut dcrire brivement le fonctionnement du programme et de fournir le nom de l'auteur, le nom du fichier programme, la date laquelle le programme a t crit, et une liste des numros de version, ainsi que les modifications dans chaque version. Comme montre le Code-source 2.1 les longs commentaires commencent par le caractre /* et se termine par le caractre */ . De mme, de courts commentaires commencent par le caractre // et il na pas besoin d'un caractre de terminaison.

2.1.2 Dbut et fin d'un programme


En langage microC, un programme commence avec les mots-cls: void main()

Aprs cela, une accolade ouvrante est utilise pour indiquer le dbut du corps de programme. Le programme se termine par une accolade fermante. Ainsi, comme indiqu dans le Code-source 2.1, le programme a la structure suivante : void main() { // Votre code ici } - 17 -

V.TOURTCHINE. Programmation en mikroC. Application pour les microcontrleurs de la famille PIC

2.1.3 Fin dune instruction


Le point virgule gnre. j = 5; j = 5

; indique la fin dune instruction,

sinon une erreur du compilateur sera

// correcte // erreur

2.1.4 Espaces blancs


Les espaces blancs sont des espaces, des flans, les tabulations et les caractres de nouvelle ligne. Le compilateur microC ne tient pas compte tous les espaces blancs. Ainsi, les trois squences suivantes sont identiques : int i; char j; ou int i; char j; ou int i; char j; De mme, les squences suivantes sont identiques : i=j+2 ; ou i=j +2 ;

2.2 Elments de programmation en mikroC


2.2.1 Les variables. Dfinition et dclaration de variables
Une variable est une portion rserve dune mmoire laquelle on a donn un nom. On peut stocker ou lire les informations de ces variables. Toute variable utilise dans un programme doit auparavant tre dfinie. La dfinition dune variable consiste la nommer et lui donne un type et ventuellement lui donner une valeur initiale (initialiser). Cest cette dfinition qui rserve (alloue) la place mmoire ncessaire en fonction du type. Lorsque le programme que lon ralise est dcompos en plusieurs modules, une mme variable, utilise dans plusieurs modules, doit tre dclare dans chacun de ces modules. Par contre, on ne dfinira cette variable que dans un seul de ces modules. Cest au moment de ldition des liens que lon mettra en correspondance les variables apparaissant dans plusieurs modulez (variable partage, mot-cl extern). La position de la dclaration ou de la dfinition dune variable dtermine sa porte cest--dire sa dure de vie et sa visibilit. Les variables globales sont dclares en dehors de toute fonction. - 18 -

V.TOURTCHINE. Programmation en mikroC. Application pour les microcontrleurs de la famille PIC Les variables locales sont dclares lintrieur des fonctions et ne sont pas visible lextrieur de la fonction dans laquelle celle-ci est dfinie. Les noms des variables ne peuvent contenir que des lettres de a z et partir de A Z, le trait de soulignement "_" et les chiffres de 0 9. Les noms des variables dans mikroC n'est pas sensible la casse, de sorte que Sum, som et soM reprsente le mme identifiant. Voici quelques identificateurs valides: temperature_V1 Pressure no_hit dat2string SUM3 _vtext ... mais voici quelques identificateurs incorrectes: 7temp % Suprieur int j23.07.04 (priode) // ne peut pas commencer par un chiffre // ne peut pas contenir de caractres spciaux // ne peut pas rpter un mot-cl // ne peut pas contenir de caractres spciaux

Certains noms sont rservs pour le compilateur lui-mme et ne peut pas tre utiliss comme noms de variables dans un programme. Le tableau 2.1 donne une liste alphabtique de ces noms rservs. Tableau 2.1 Noms rservs en mikroC enum signed extern float for goto if int long register return short sizeof static struct switch typedef union unsigned void volatile while

asm auto break case char const continue default do double else

- 19 -

V.TOURTCHINE. Programmation en mikroC. Application pour les microcontrleurs de la famille PIC

Le langage mikroC prend en charge les types de variables indiques dans le tableau 2.2. Tableau 2.2: Types de variables en mikroC Type Taille (bits) Plage

unsigned

char

8 8 16 32 8 8 16 32 32 32 32

0 255 0 255 0 65535 0 4294967295 -128 127 -128 127 -32768 32767 - 2147483648 2147483647 1.17549435082E-38 1.17549435082E-38 1.17549435082E-38 6.80564774407E38 6.80564774407E38 6.80564774407E38

unsigned short int unsigned int unsigned long int signed char signed short int signed int signed long int float double long double

(unsigned) char or unsigned short (int) Les variables appeles (unsigned) char ou unsigned short (int), sont des variables non signes de 8 bits avec une plage de 0 255. Dans l'exemple suivant deux variables de 8 bits nommes total et sum sont crs, et sum est affecte la valeur dcimale 150: unsigned char total, sum; sum = 150; ou char totale, sum; sum = 150; Les variables peuvent affecter des valeurs au cours de leur dclaration. Ainsi, les dclarations ci-dessus peuvent aussi tre crites comme suit: char total, sum = 150; - 20 -

V.TOURTCHINE. Programmation en mikroC. Application pour les microcontrleurs de la famille PIC

signed char or (signed) short (int) Les variables appeles signed char, ou (signed) short (int) sont des variables signes de 8 bits avec une gamme de -128 +127. Dans l'exemple suivant, une variable signe de 8 bits nomme counter est cr avec une valeur de 50 : signed char counter =- 50; soit short counter = -50; soit short int counter = -50;

(signed) int Les variables appels (signed) int sont des variables signes de 16 bits avec une gamme ayant de - 32768 +32767. Dans l'exemple suivant d'un entier sign nomm Big est : int Big; unsigned (int) Les variables appels unsigned (int) sont des variables non signs de 16 bits avec une gamme de 0 65535. Dans l'exemple suivant une variable de 16 bits nomme count est affecte la valeur dcimale de 12000 : unsigned int count = 12000;

(signed) long (int) Les variables appels (signed) long (int) sont des variables signes de 32 bits avec une gamme de - 2147483648 +2147483647. Un exemple est suivant : signed long LargeNumber;

unsigned long (int) Les variables appels unsigned long (int) sont des variables non signes de 32 bits ayant une gamme de 0 4294967295. Un exemple est suivant: unsigned long VeryLargeNumber;

float or double or long double Les variables appeles float ou double ou long double, sont des variables virgule flottante mis en uvre en utilisant le mikroC de format 32 bits. Nombres virgule flottante comprise entre 1.17549435082E-38 + 6.80564774407E38. Dans l'exemple suivant, une variable flottante nomme area est affecte la valeur 12.235: - 21 -

V.TOURTCHINE. Programmation en mikroC. Application pour les microcontrleurs de la famille PIC

float area ; area = 12.235; Pour viter toute confusion lors de l'laboration du programme, il est recommand de prciser le signe de la variable (sign ou non sign) ainsi que le type de variable. Par exemple, utiliser unsigned char au lieu de char seulement, et unsigned int au lieu de unsigned seulement.

2.2.2 Constantes
Constantes reprsentent des valeurs fixes (numrique ou caractre) dans des programmes qui ne peuvent pas tre changes. En mikroC, constantes peuvent tre entiers, flottants, caractres, les chanes, ou des types numrs. Integer Constants Les constantes entires (Integer Constants) peuvent tre en dcimal, hexadcimal, octal ou binaire. Le type de donnes d'une constante est tir par le compilateur partir de sa valeur. Mais suffixes peut tre utilis pour changer le type d'une constante. Dans le tableau 2.2, nous avons vu que les constantes dcimales (signed long int) peuvent avoir des valeurs de 2147483648 + 4294967295. Par exemple, nombre constant 210 est stock comme un entier non sign ( unsigned char) ou (unsigned short int). De mme, nombre constant - 200 est stock comme un entier sign (signed int). Le suffixe u ou U force la constante d'tre non sign (unsigned) et le suffixe l ou L force la constante d'tre longue (long). Utilisation de U (ou u) et L (ou l) oblige la constante d'tre unsigned long. Les constantes sont dclares en utilisant le mot-cl const et sont stockes dans le flash de mmoire du microcontrleur PIC. Par exemple, MAX est dclar comme la constante 100 : const MAX =100; Les constantes hexadcimales commencent par les caractres 0x ou 0X et peuvent contenir des donnes numriques de 0 9 et les caractres hexadcimaux de A F. Dans l'exemple suivant, TOTAL est la constante de la valeur hexadcimale FF: const TOTAL = 0xFF;

Les constantes octales ont un zro au dbut du nombre et peuvent contenir des donnes numriques de 0 7. Dans l'exemple suivant, une constante CNT est affecte une valeur octale 17 : const CNT = 017;

- 22 -

V.TOURTCHINE. Programmation en mikroC. Application pour les microcontrleurs de la famille PIC Les constantes binaires commencent par 0b ou 0B et ne peuvent contenir que 0 ou 1. Par exemple une constante nomme Min est dclare comme ayant la valeur binaire 11110000: const Min = 0b11110000 Floating Point Constants Les constantes virgule flottante (Floating Point Constants) se compose de: Entier dcimal Point dcimal Partie dcimale fractionnaire e ou E et l'ordre du signe MikroC limite les valeurs de constantes virgule flottante par la gamme : 1.17549435082 * 10-38 ... 6.80564774407 * 1038. Dans l'exemple suivant, une constante nomme TEMP est dclare comme ayant la valeur fractionnelle 37.50 : const TEMP = 37.50 ou const TEMP = 3.750E1 Character Constants Une constante de caractre (Character Constants) est un caractre renferm dans des guillemets simples. Par exemple, une constante nomme First_Alpha est dclare comme ayant la valeur du caractre A : const First_Alpha = A; String Constants Les constantes de chane (String Constants ) sont des squences fixes de caractres stockes dans la mmoire flash du microcontrleur. La chane doit commencer et se terminer par un guillemet " . Un exemple dune constante de type chane est la suivante : "Il s'agit d'un exemple de chane constante" Une constante chane peut tre tendue travers une frontire en ligne en utilisant une barre oblique inverse "\" :

"C'est la premire partie de la chane \ et c'est la poursuite de la chane " Cette dclaration de la constante chane est la mme que : "C'est la premire partie de la chane et c'est la poursuite de la chane " - 23 -

V.TOURTCHINE. Programmation en mikroC. Application pour les microcontrleurs de la famille PIC

Enumerated Constants Les constantes numres (Enumerated Constants) sont de type entier et sont utilises pour faire un programme plus facile suivre. Dans l'exemple suivant, une constante nomme couleur stocke les noms de couleurs. Le premier lment de couleur a la valeur 0: enum couleur {noir, marron, rouge, orange, jaune, vert, bleu, gris, white};

2.2.3 Squences d'chappement


Les squences d'chappement (Escape Sequences) sont utilises pour reprsenter les caractres ASCII non imprimables. Tableau 2.3 montre quelques squences d'chappement couramment utiliss et de leur reprsentation en langage microC. Par exemple, la combinaison de caractres \n reprsente le caractre de nouvelle ligne. Un caractre ASCII peut galement tre reprsent en prcisant son code hexadcimal, aprs une barre oblique inverse. Par exemple, le caractre de nouvelle ligne peut galement tre reprsent comme \x0A .

Tableau 2.3: Quelques squences d'chappement Valeur de la Squence squence d'chappement Hex Caractre \ a \ b \ t \ n \ v \ f \ r \ xH 0X07 0X08 0X09 0XLF 0X0B 0X0C 0X0D BEL (cloche) BS (backspace) HT (tabulation horizontale) 0A (saut de ligne) VT (tabulation verticale) FF (saut de page) CR (retour chariot) Chane de chiffres Hex

- 24 -

V.TOURTCHINE. Programmation en mikroC. Application pour les microcontrleurs de la famille PIC

2.2.4 Variables statiques


Les variables statiques (Static variables ) sont des variables locales utilises dans les fonctions lorsque la dernire valeur d'une variable entre les appels successifs de la fonction doit tre prserve. Comme le montre l'exemple suivant, les variables statiques sont dclares en utilisant le mot cl static : statique unsigned int count ;

2.2.5 Variables externes


Utilisation du mot (extern) devant un nom de variable dclare cette variable comme externe. Il indique au compilateur que la variable est dclare ailleurs dans un code-source distincte

module. Dans l'exemple suivant, les variables sum1 et SUM2 sont dclars comme externes entiers non signs : extern int sum1, SUM2 ;

2.2.6 Variables volatiles


Les variables volatiles (Volatile Variables ) sont importantes dans d'interruption des programmes et de routines dentres-sorties. Utilisation de mot-cl volatile indique que la valeur de la variable peut changer au cours de la dure de vie du programme indpendant de l'coulement normal du programme. Dans l'exemple suivant, la variable Led est dclare comme un volatile non sign : volatile unsigned char Led;

2.2.7 Variables numres


Les variables numres sont utilises pour rendre un programme plus lisible. Dans une variable numre, une liste de rfrences est spcifie et la valeur du premier lment est fix 0, l'autre lment est mis 1, et ainsi de suite. Dans l'exemple suivant, la Semaine de type est dclar comme un liste numre et LUN = 0, MAR = 1, WEN = 2, et ainsi de suite : enum Semaine {LUN, MAR, MER, JEU, VEN, SAM, DIM}; Il est possible d'impliquer les valeurs des lments dans une liste numre. Dans le exemple suivant, noir = 2, bleu = 3, rouge = 4, et ainsi de suite. enum couleurs {noir = 2, bleu, rouge, blanc, gris}; De mme, dans l'exemple suivant, noir = 2, bleu = 3, rouge = 8, et gris = 9: enum couleurs {black = 2, bleu, rouge = 8, gris}; Les variables de type de recensement peuvent tre dclares par les spcifiant aprs la liste - 25 -

V.TOURTCHINE. Programmation en mikroC. Application pour les microcontrleurs de la famille PIC des articles. Par exemple, pour dclarer la variable My_Week de la Semaine de type numr, utilisez la dclaration suivante: enum Semaine {LUN, MAR, MER, JEU, VEN, SAM, DIM} My_Week; Maintenant, nous pouvons utiliser My_Week comme une variable dans un programme: My_Week = MER ou My_Week = 2 // le mme que ci-dessus // assigne 2 My_Week

Aprs avoir dfini Semaine comme un type numr, nous pouvons dclarer des variables This_Week et Next_Week de type Semaine : enum Semaine This_Week, Next_Week;

2.2.8 Tableaux
Les tableaux (Arrays) sont utiliss pour stocker des lments lis dans le mme bloc de mmoire et en vertu d'un nom spcifi. Un tableau est dclar en spcifiant son type, le nom, et le nombre dlments stocker. Par exemple: unsigned int Total [5] ; Ce tableau de type unsigned int est nomm Total et dispose de cinq lments. Le premier lment d'un tableau est index 0. Ainsi, dans cet exemple, Total[0] se rfre au premier lment du tableau et Total[4] se rfre au dernier lment. Le tableau Total est stock dans un mmoire ayant cinq emplacements conscutifs comme suit: Total[0] Total[1] Total[2] Total[3] Total[4] Les donnes peuvent tre stockes dans le tableau en spcifiant le nom du tableau et de l'indice. Par exemple, pour stocker 25 dans le deuxime lment du tableau, nous devons crire: Total[1] = 25; De mme, le contenu d'un tableau peut tre lu en spcifiant le nom du tableau et de son index. Par exemple, pour copier l'lment de tableau dindex 2 une variable appele Temp , nous devons crire: Temp = Total[2]; Le contenu d'un tableau peut tre initialis lors de la dclaration du tableau en attribuant d'une squence de valeurs spares par des virgules dans le tableau. Voici un exemple dun tableau ayant 12 lments des mois[0] = 31, mois[1] = 28, et ainsi de suite: - 26 -

V.TOURTCHINE. Programmation en mikroC. Application pour les microcontrleurs de la famille PIC

unsigned char mois[12] = {31,28,31,30,31,30,31,31,30,31,30,31}; www.newnespress. Le mme tableau peut galement tre dclar sans spcifier sa taille: unsigned char mois[ ] = {31,28,31,30,31,30,31,31,30,31,30,31}; Des tableaux de caractres peuvent tre dclars de manire similaire. Dans l'exemple suivant, un tableau de caractres nomms Hex_Letters est dclare avec 6 lments: unsigned char Hex_Letters[ ] ={A, B, C, D, E, F}; Les chanes sont des tableaux de caractres avec un terminateur null. Les chanes peuvent tre dclares soit par enfermant la chane entre guillemets, ou en spcifiant chaque caractre du tableau au sein de apostrophes et puis en terminant la chane avec un caractre nul. La chane de deux dclarations dans l'exemple suivant est identique :
unsigned char Mystring[ ] = COMP;

et unsigned char Mystring[ ] = {C, O, M, P, \0}; Dans le langage de programmation microC, nous pouvons aussi dclarer des tableaux aux dimensions multiples. Tableaux unidimensionnels sont gnralement appels vecteurs, et des tableaux bidimensionnels sont appels matrices. Un rseau bidimensionnel est dclar en spcifiant le type de donnes de la matrice, le nom de tableau, et la taille de chaque dimension. Dans l'exemple suivant, un tableau deux dimensions nomm P contiens trois lignes et quatre colonnes. Au total, le tableau a douze lments. Le premier lment de la matrice est P[0][0], et le dernier lment est P[2][3]. La structure de ce tableau est montre ci-dessous:

P[0][0] P[0][1]

P[0][2]

P[0][3]

P[1][0] P[1][1]

P[1][2]

P[1][3]

P[2][0] P[2][1]

P[2][2]

P[2][3]

- 27 -

V.TOURTCHINE. Programmation en mikroC. Application pour les microcontrleurs de la famille PIC lments d'un tableau multidimensionnel peut tre spcifi lors de la dclaration du tableau. Dans l'exemple suivant, rseau bidimensionnel Q a deux ranges et deux colonnes, ses lments diagonaux sont mis 1, et de ses lments non diagonaux sont remis 0:
unsigned char Q[2][2] = { {1,0}, {0,1} };

2.2.9 Pointeurs
Les pointeurs (Pointers) sont une partie importante du langage microC, car ils occupent les adresses mmoire des autres variables. Les pointeurs sont dclares de la mme manire que d'autres variables, mais avec le caractre * en face du nom de variable. Dans l'exemple suivant, un pointeur de caractre non sign du nom pnt est dclar: unsigned char *pnt; Quand un nouveau pointeur est cr, son contenu est d'abord indtermin et il ne tient pas l'adresse d'une variable. Nous pouvons attribuer l'adresse d'une variable un pointeur l'aide le & : pnt = &Count;

Maintenant pnt affecte l'adresse de variable Count. La variable Count peut tre affecte une valeur en utilisant le caractre * en avant de son pointeur. Par exemple, le Count peut tre attribue 10 l'aide de son pointeur : * pnt = 10; // Count = 10

cest la mme chose que Count = 10; // Count = 10 ou, la valeur du Count peut tre copi la variable Cnt en utilisant son pointeur : Cnt = *pnt; // Cnt = Count

Pointeurs de tableaux Dans le langage microC, le nom d'un tableau est aussi un pointeur de tableau. Ainsi, pour le tableau : unsigned int Total[10]; Le nom Total est galement un pointeur de ce tableau, et il contient l'adresse du premier ellment de la matrice. Ainsi, les deux noncs suivants sont gaux: Total[2] = 0; et *(Total + 2) = 0; En outre, l'nonc suivant est vrai: &Total[j] = Total + j ; - 28 -

V.TOURTCHINE. Programmation en mikroC. Application pour les microcontrleurs de la famille PIC

En langage microC, nous pouvons effectuer des oprations arithmtiques pour pointeurs qui peuvent impliquer : Comparaison de deux pointeurs Addition ou la soustraction d'un pointeur et un entier La soustraction de deux pointeurs Assigner un pointeur vers un autre En comparant un pointeur avec zro Par exemple, supposons que le pointeur P est affect afin de contenir l'adresse du tableau dlment Z[2]:
P = &Z[2];

Nous pouvons maintenant effacer les lments 2 et 3 du tableau Z, comme dans les deux exemples qui suivent. Les deux exemples sont identiques, sauf que dans le premier exemple pointeur P contient l'adresse de Z[3] la fin des tats, et il contient l'adresse de Z[2] la fin de deuxime srie de dclarations: *P = 0; P = P + 1; *P = 0; ou *P = 0; *(P +1) = 0; // Z[2] = 0 // Z[3] = 0 // Z[2] = 0 // maintenant P pointe llment 3 de Z // Z[3] = 0

Un pointeur peut tre affect un autre pointeur. Dans l'exemple suivant, les variables Cnt et Tot sont lensable de 10 lments crs l'aide de deux pointeurs diffrents:

unsigned int *i, *j;

// dclare 2 pointeurs

unsigned int Cnt, Tot; i = &Cnt;

// dclare deux variables // i pointe vers Cnt // Cnt = 10 // copy pointeur i vers pointeur j // Tot = 10

*i = 10; j = i; Tot = *j;

2.2.10 Structures
- 29 -

V.TOURTCHINE. Programmation en mikroC. Application pour les microcontrleurs de la famille PIC

Une structure peut tre utilise pour recueillir des lments connexes, qui sont ensuite traits comme un seul objet. Contrairement un tableau, une structure peut contenir un mlange de types de donnes. Par exemple, un structure permet de stocker les donnes personnelles (nom, prnom, ge, date de naissance, etc) d'un tudiant. Une structure est cre en utilisant le mot-cl struct, suivie d'une structure de nom et dune liste des dclarations de membre. ventuellement, des variables de mme type que la structure peuvent dclarer l'extrmit de la structure. L'exemple suivant dclare une structure nomme Personne :
struct Personne { unsigned char name[20]; unsigned char prnom[20]; unsigned char nationalit[20]; unsigned char ge; }

Nous pouvons dclarer des variables du mme type que la structure en donnant le nom de la structure et le nom de la variable. Par exemple, deux variables Moi et Toi de type Personne vous pouvez crer par la dclaration: struct Personne Moi, Toi; Les variables de type Personne peuvent galement tre cres lors de la dclaration de la structure comme suit :
struct Personne { unsigned char unsigned char unsigned char unsigned char }Moi, Toi

name[20]; prnom [20]; nationalit [20]; ge;

Nous pouvons attribuer des valeurs aux lements d'une structure en spcifiant le nom de la structure, suivi d'un point . et le nom de l'lment. Dans l'exemple suivant, l'ge des variables de structure Moi est mis 25, et M variable est affect la valeur de l'ge dans variable de structure Vous: Moi.age = 25; M = Vous.age; Elments de la structure peut tre initialis lors de la dclaration de la structure. Dans l'exemple suivant, le rayon et la hauteur de la structure sont initialiss Cylindre 1.2 et 2.5 respectivement :

- 30 -

V.TOURTCHINE. Programmation en mikroC. Application pour les microcontrleurs de la famille PIC


struct Cylindre { valeur de rayon; valeur dhauteur; } MienCylindre {1.2, 2.5};

Les valeurs peuvent galement tre attribues pour les lments d'une structure lade des pointeurs en dfinissant les variable el les types des pointeurs. Par exemple, si LeCylindre est dfini comme un pointeur vers la structure Cylindre, alors nous pouvons crire :

struct Cylindre { valeur de rayon; flotter dauteur; }*LeCylinder; LeCylinder -> rayon = 1.2; LeCylinder -> hauteur = 2.5;

La taille d'une structure est le nombre d'octets contenus dans la structure. Nous pouvons utiliser l'oprateur sizeof pour obtenir la taille d'une structure. Considront l'exemple ci-dessus : sizeof (MienCylindre) retours 8, tant donn que chaque variable de type float occupe 4 octets en mmoire.

Les champs de bits peuvent tre dfinis en utilisant les structures. Avec les champs de bits, nous pouvons attribuer des identificateurs pour les bits dune variable. Par exemple, pour identifier les bits 0, 1, 2, 3 d'une variable pour LowNibble et d'identifier les 4 bits restants pour HighNibble nous pouvons crire :
struct { LowNibble: 4; HighNibble: 4; } MienVariable;

On peut alors accder aux quartets bits de la variable MienVariable : MienVariable.LowNibble = 12; MienVariable.HighNibble = 8;

En microC, nous pouvons utiliser les dclarations typedef pour crer de nouveaux types dune variable. Par exemple, une nouvelle structure type de donnes nomm Reg peut tre cr comme suit :

- 31 -

V.TOURTCHINE. Programmation en mikroC. Application pour les microcontrleurs de la famille PIC


typedef struct { unsigned char nom[20]; unsigned char prenom[20]; unsigned ge; }Reg;

Les variables de type Reg peuvent ensuite tre crs de la mme manire que les autres types de variables. Dans l'exemple suivant, les variables MyReg, Reg1, et Reg2 sont crs partir de type de donnes Reg: Reg MyReg, REG1, REG2; Le contenu dune structure peut tre copi dans une autre structure, condition que des structures soient dtermines partir du mme modle. Dans l'exemple qui suit , P2 est copi sur P1:
struct Personne { unsigned char nom [20]; unsigned char prenom [20]; unsigned int ge; unsigned int hauteur; unsigned poids; }

struct Personne P1, P2;


........................ ........................

P2 = P1;

2.2.11 Unions
Les unions sont utilises pour les variables de recouvrement. Une union est similaire une structure et il est mme dfini d'une manire similaire. Les deux sont bass sur des modles, et les membres de tous les deux sont accessible l'aide des oprateurs . ou -> . Une chausse diffre d'une structure en ce que tous variables dans une union occupent la mme zone mmoire, ils partagent le mme stockage. Un exemple de dclaration de l'union est la suivante :
union flags { unsigned char x; unsigned int y; }P;

Dans cet exemple, les variables x et y occupent la mme zone de mmoire, et la taille de ce l'union est de 2 octets de long, ce qui est de la taille de la plus grande partie de l'union. Quand la variable y est charg avec une valeur de 2 octets, la variable x aura la mme valeur que faible octet de y. Dans l'exemple suivant, y est 0xAEFA, et x est charg avec 0xFA: P.y = 0xAEFA ; - 32 charg avec 16-bit valeur hexadcimale

V.TOURTCHINE. Programmation en mikroC. Application pour les microcontrleurs de la famille PIC

La taille d'une union est la taille (nombre d'octets) de son lment est le plus important. Ainsi, la dclaration: sizeof (P) renvoie 2. Cette union peut aussi tre dclare comme suit :
union flags { unsigned char x; unsigned int y; } union flags P;

2.2.12 Oprateurs et expressions en mikroC


Les oprateurs sont appliqus aux variables et d'autres objets dans les expressions pour assurer certaines conditions ou des calculs. Une expression est un objet syntaxique obtenu en assemblant des constantes, des variables et des oprateurs. Exemple : x + 12

Dans le langage microC, il y a dautres oprateurs que les oprateurs arithmtiques quon a lhabitude de manipuler. Il y en a en fait plus de 40 oprateurs. Oprateurs et priorits Vous avez lhabitude de manipuler des expressions arithmtiques : 2+3*4*5-2, 2-3-4 On sait que ces expressions sons quivalentes (2+(3*(4*5)))-2, (2-3)-4. Introduire les parenthses permet de dfinir sans ambiguit lexpression que lon manipule. Pour viter lusage des parenthses qui alourdissent la lecture, il existe des rgles pour lever toute ambigit : Exemple : 2+3*4 La sous expression 3*4 est value en premier et le rsultat obtenu est ajout la valeur 2 (forme avec parenthse : 2+(3+4)). On dit que loprateur * possde une priorit suprieur la priorit de loprateur + . 2-3-4 - 33 -

V.TOURTCHINE. Programmation en mikroC. Application pour les microcontrleurs de la famille PIC La sous expression 2-3 est value en premier et au rsultat obtenu, on soustrait la valeur 4 (forme avec parenthse : (2-3)-4). On dit que lordre dvaluation de loprateur est de gauche droite. La donne dune priorit et dun ordre dvaluation permet de fixer des rgles communes dvaluation des expressions. Ces priorits et ordre dvaluation ne permettent videment pas de se dispenser compltement des parenthses : (2+3)*4 comparer 2+3*4 Caractristiques de loprateur () : Oprateur () Nom parenthses Notation () Priorit 15 Ordre gauche-droite

Oprateur daffectation Loprateur la plus importante dans un langage de programmation est celle qui consiste donner une valeur une variable. Cette opration est dsigne par le symbole = . Comme laffectation range une valeur dans une variable (une zone mmoire), il est impratif que le membre gauche dune affectation reprsente une zone (left value). Une constante nest pas une left value car il ne dsigne pas ladresse dune zone mmoire. Elle ne peut donc pas figurer en membre gauche dune affectation. Le membre droit dune affectation peut dsigner soit une constante soit une zone mmoire soit une expression. Oprateur = Nom affectation Notation x=y Priorit 2 Ordre droite- gauche

Les oprateurs arithmtiques Oprateur + * / Nom addition soustraction multiplication division Notation x+y x-y x*y x/y Priorit 12 12 13 13 Ordre gauche-droite gauche-droite gauche-droite gauche-droite

- 34 -

V.TOURTCHINE. Programmation en mikroC. Application pour les microcontrleurs de la famille PIC % modulo x%y 13 gauche-droite

Les oprateurs +, -, * , fonctionnent comme en arithmtique. Par contre, loprateur / (division) se comporte de manire diffrente selon que les oprandes sont des entier ou des nombres flottants :

Nombres flottants : le rsultat est un nombre flottant obtenu en divisant les deux nombres. Nombres entiers : le rsultat est un nombre entier obtenu en calculant la division entier ou division euclidienne. Loprateur % nest dfini que pour les entiers et le rsultat est le reste de la division entire des oprandes. Rappel sur la division entire : On appelle quotient et reste de la division entire de a et de b, les nombres entiers q et vrifiant : a = q*b +r ; 0 < r < B Exemple 1 : Si a = 20 et b = 3 alors q = 6 et r = 2 (on a vrifi : 20 = 6*3 + 2) Exemple 2 : int a, b, c ; float x, y, z ; a a x x x x = = = = = = b/c; x/y; y/z; 2/3; 2.0/3.0; (float)((float)a)/y; //division entire //reste entier //division relle //division entire //division relle //division relle

Loprateur unaire a une priorit suprieure aux oprateurs binaires arithmtiques :

Oprateur -(unaire)

Nom ngation

Notation -x

Priorit 13

Ordre droite- gauche

Les oprateurs de comparaison

Oprateur == !=

Nom teste dgalit teste de non galit

Notation x == y x!=y

Priorit 9 9

Ordre gauche-droite gauche-droite

- 35 -

V.TOURTCHINE. Programmation en mikroC. Application pour les microcontrleurs de la famille PIC <= >= < > teste infrieur ou gal teste suprieur ou gal teste infrieur strict teste suprieur strict x <= y x >= y x<y x>y 10 10 10 10 gauche-droite gauche-droite gauche-droite gauche-droite

Thoriquement, le rsultat dune comparaison est une valeur boolenne (vrai ou faux). En microC, le rsultat dune comparaison est 1 (!= 0) ou 0 selon que cette comparaison est vraie ou fausse. Il nexiste pas de type boolen en microC : la valeur entire 0 sera considre comme quivalente la valeur faux et toute valeur diffrente de 0 quivalente la valeur vrai.

Les oprateurs logiques Une variable boolenne est une variable pouvant prendre la valeur vrai ou faux. La valeur dune expression boolenne est, comme le rsultat des comparaisons, une valeur entire.

Oprateur && II ! (unaire)

Nom ET OU NON

Notation x && y x II y !x

Priorit 5 4 14

Ordre gauche-droite gauche-droite droite- gauche

Les oprateurs de manipulation de bits Oprateur & I ^ (unaire) >> Nom ET bit bit OU bit bit OU exclusif bit bit NON bit bit dcalage droite - 36 Notation x&y xIy x^y x >> x Priorit 8 6 7 14 11 Ordre gauche-droite gauche-droite gauche-droite droite-gauche droite-gauche

V.TOURTCHINE. Programmation en mikroC. Application pour les microcontrleurs de la famille PIC << dcalage gauche << x 11 droite-gauche

Les autres oprateurs binaires daffectation Les oprateurs suivants ne sont que des raccourcis de notation (pas doptimisation du code gnr) : Oprateur += -= *= /= %= = <<= &= I= ^= Equivalent x=x+y x=x-y x=x*y x=x/y x=x%y x=xy x = x << y x=x&y x=xIy x=x^y Notation x x x x += y -= y *= y /= y Priorit 2 2 2 2 2 2 2 2 2 2 Ordre droite-gauche droite-gauche droite-gauche droite-gauche droite-gauche droite-gauche droite-gauche droite-gauche droite-gauche droite-gauche

x %= y x = y

x <<= y x &= y x I= y

x ^= y

Autres oprateurs unaires daffectation

Oprateur ++ --

Equivalent x=x+1 x=x-1

Notation x++ ou ++x x-- ou --x

Priorit 14 14

Ordre droite-gauche droite-gauche y = x++ ;

cest le raccourci pour y = x ; x = x+1 ; y = ++x ; cest le raccourci pour x = x + 1 ; y = x ; Autres oprateurs Oprateur conditionnel Oprateur ? Equivalent oprateur conditionnel Notation e ? x : y Priorit 3 Ordre droite-gauche

- 37 -

V.TOURTCHINE. Programmation en mikroC. Application pour les microcontrleurs de la famille PIC Cette expression est une sorte de si alors sinon sous forme dexpression : si la condition e est vraie alors cette expression vaut x sinon elle vaut y.

Exemple : a = (v == 2) ? 1 : 2 ;

affecte la variable a la valeur 1 si v vaut 2, sinon la variable a la valeur 2. Oprateur squentiel Oprateur , Equivalent oprateur squentiel Notation e1 , e2 Priorit 1 Ordre droite-gauche

Cet oprateur permet de regrouper plusieurs expressions en une seule : lvaluation de lexpression e1, e2 consiste en lvaluation successive (dans lordre) des expressions e1 puis de e2.

Oprateur de dimension

Cet oprateur donne loccupation mmoire (en octets) dune variable ou dun type de donn. Oprateur sizeof Equivalent oprateur de dimension Notation sizeof (e) Priorit 14 Ordre droite-gauche

Exemple : La valeur de lexpression sizeof(c) est 1 si c est une variable de type char. Lexpression sizeof(char)donne galement la valeur 1. Oprateur de parenthse

Loprateur de parenthse ( ) permet de dfinir lordre dvaluation dune expression. Cest galement ce mme oprateur qui est utilis pour encapsuler les parenthses des fonctions. Mme lorsquune fonction na pas darguments, ces parenthses sont obligatoires.

Oprateur ()

Equivalent oprateur dadressage

Notation ()

Priorit 15

Ordre gauche-droite

Oprateur de slection

Ces oprateurs . et -> servent slectionner des champs de donnes structures. - 38 -

V.TOURTCHINE. Programmation en mikroC. Application pour les microcontrleurs de la famille PIC

Oprateur . -> []

Equivalent oprateur de slection oprateur de slection oprateur de slection

Notation x,info x->info x[3]

Priorit 15 15 15

Ordre gauche-droite gauche-droite gauche-droite

Oprateurs du prprocesseur Toute ligne de code-source commence par # est considre comme un oprateur de prprocesseur (ou loprateur de prtraitement ou encore la ligne de commande). Les oprateurs du prprocesseur sont gnralement placs au dbut du code-source, mais ils ont le droit d'tre n'importe o dans le programme. Le prprocesseur permet un programmeur de : Compiler un programme de sorte que les parties du code ne sont pas compils Remplacer les symboles avec d'autres symboles ou des valeurs Insrer des fichiers texte dans un programme

La syntaxe plus commune d'un oprateur du prprocesseur est : #include <math.h>

MikroC compilateur prend en charge les commandes de prprocesseur suivantes: #define #if #ifdef #error #ligne #undef #elif #ifndef

#endif

Commande du prprocesseur #define La commande prprocesseur #define fournit une macro o chaque apparition de son nom dans le programme est remplac par la valeur de ce nom. Par exemple, pour remplacer toutes les apparitions de MAX avec une valeur de 100, nous pouvons crire: #define MAX 100 Notez que la commande prprocesseur #define noccupe pas lespace en mmoire. Nous pouvons passer des paramtres une dfinition de macro en prcisant les paramtres entre les parenthses aprs le nom de la macro. Par exemple : #define ADD (a, b) (a + b) - 39 -

V.TOURTCHINE. Programmation en mikroC. Application pour les microcontrleurs de la famille PIC

Lorsque cette macro est utilise dans un programme, (a, b) sera remplac par (a + b) comme indiqu ci-dessous : p = ADD (x, y) sera transform en p = (x + y) De mme, nous pouvons dfinir une macro pour calculer le carr de deux nombres : #define CARRE (a) (a * a) Nous pouvons maintenant utiliser cette macro dans un programme : p = CARRE (x) sera transform en p = (x * x) Commande du prprocesseur #include La commande #include est utilis pour inclure un fichier source dans un programme. Habituellement les fichiers avec l'extension ". H" sont utiliss avec #include. Il y a deux formats pour l'utilisation de #include: #include <fichier> et #include "fichier" Dans la premire option le fichier est recherch d'abord dans le rpertoire d'installation mikroC, puis dans les chemins de recherche des utilisateurs. En seconde option le fichier spcifi est recherch dans le dossier de projet mikroC , puis dans le dossier d'installation mikroC, puis dans les chemins de recherche des utilisateurs. Il est galement possible de spcifier un chemin de rpertoire complet : #include "C: \ temp \ last.h" Le dossier dans ce cas nest recherch que dans le chemin du rpertoire spcifi.

Commande du prprocesseur #if, #elif, #else, #endif Les commandes prprocesseur #if, #elif, #else et #endif sont utilise pour les compilations conditionnelles, o certaines parties du code-source peut tre compile si certaines conditions sont remplies. Dans l'exemple suivant, si M a une valeur diffrente de zro la section de code o les variables A et B sont mis zro est tabli, sinon la section de code o A et B sont tous les deux 1 est compil. Notez que le #if doit se terminer par #endif:

#if M A = 0; B = 0; #else A = 1; B = 1; #endif - 40 -

V.TOURTCHINE. Programmation en mikroC. Application pour les microcontrleurs de la famille PIC

Nous pouvons galement utiliser la condition #elif, qui teste une nouvelle condition si la condition prcdente tait fausse : #if M A = 0; B = 0; #elif N A = 1; B = 1; #else A = 2; B = 2; #endif Dans l'exemple ci-dessus, si M a une valeur diffrente de zro, A = 0 ; B = 0. Sinon, si N est une valeur non nulle, A = 1; B = 1. Enfin, si la fois M et N sont gaux zro, alors A = 2 ; B = 2. Notez quune seule section de code est compil entre #if et #endif et qu'une section de code peut contenir n'importe quel nombre dinstructions.

2.2.13 Structure de contrle de programme


Les instructions sont normalement excutes squentiellement partir du dbut la fin dun programme. Nous pouvons utiliser des instructions de contrle pour modifier ce flux squentiel normal dans un programme C. Les instructions de contrle suivantes sont disponibles dans les programmes en mikroC: De slection if et switch D'itration ou bouclage for Modifications inconditionnels dexcution Instructions de slection if et switch Instruction if Cette instruction conditionnelle if permet dexcuter des instructions de manire slective en fonction du rsultat dun test. La dclaration du format gnral de l'instruction if est la suivante : if (expression) instruction1 else instruction2 ou if(expression) instruction1; else instruction2; Si lexpression est vraie (valeur non nulle), linstruction1 sexcute sinon, dans le deuxime cas, cest listruction2 qui sexcute. - 41 -

V.TOURTCHINE. Programmation en mikroC. Application pour les microcontrleurs de la famille PIC Le mot-cl else est optionnel et peut tre omis. Dans l'exemple suivant, si la valeur de x est suprieure MAX alors la variable P est incrmente de 1, sinon elle est dcrment de 1: if (x > MAX) P++; else P--; Nous pouvons avoir plus d'une instruction en joignant les dclarations dans boucls entre parenthses. Par exemple: if (x> MAX) { P++; Cnt = P; Sum = Sum = Cnt; } else P--; Dans cet exemple, si x est suprieur MAX, donc les trois instructions boucls entre les parenthses sont excuts, sinon la dclaration P-- est excut. Un autre exemple en utilisant l'instruction if est la suivante:

if (x> 0 && x <10) { Total + = Sum; Sum++; } else { Total = 0; Sum = 0; }

Instruction switch

L'instruction switch (commutateur) est utilis pour assurer le commutation entre des dfrentes dclarations si un certain nombre des conditions son vraie ou faut. La syntaxe de commutation :
switch (condition) { case condition1: Instructions; break; case condition2: Instructions; break; . . . . . . . . . . . . . . . . . . . . .

- 42 -

V.TOURTCHINE. Programmation en mikroC. Application pour les microcontrleurs de la famille PIC


. . . . . . . . . . . . . . . . . . . . . case condition: Instructions; break; default: Instructions; }

Linstruction switch fonction comme suit : d'abord la condition est value. La condition est ensuite compare condition1 et si une correspondance est trouve, les dclarations contenues dans ce bloc sont valus. Puis seffectuer le saut de contrle en dehors de l'instruction switch lorsque le mot break est rencontr. Si la condition ne se trouve pas, la condition est compare condition2 et si une correspondance est trouve, les dclarations de ce bloc sont values et le saut de contrle dehors dtats de commutation seffectuer, et ainsi de suite. Lavaleur par dfault est facultative, si la condition ne correspond aucune des conditions spcifies. Dans l'exemple suivant, la valeur de la variable est valu Cnt. Si Cnt = 1, A est mis 1. Si Cnt = 10, B est mis 1, et si Cnt = 100, C est mis 1. Si Cnt n'est pas gal 1, 10,ou100, donc D est fix 1:

switch (Cnt) { case 1: A=1; break; case 10: B=10 ; break ; case 100: C=100; break; default: D =1; }

Puisque les espaces blancs sont ignors en langage C, nous pouvons galement crire le code prcdent comme suit:
switch (Cnt) { case 1: A case 10: B case 100: C dfault: D }

= = = =

1; 1; 1; 1;

break; break; break;

- 43 -

V.TOURTCHINE. Programmation en mikroC. Application pour les microcontrleurs de la famille PIC

Instructions d'itration for, while, do, goto, continue et break


Les instructions d'itration nous permettent d'effectuer des boucles dans un programme, o une partie d'un code doit tre rpt un certain nombre de fois. Dans mikroC l'itration peut tre effectue de quatre faons. Nous se penchera sur chacun des exemples : Utilisation de for Utilisation de while Utilisation de do Utilisation de goto, continue et break

Instruction for La syntaxe d'une instruction for est : for (expression initiale; expression de condition; expression incrment) {
Instructions;

} L'expression initiale dfinit la variable au dpart de la boucle, et cette variable est compare l'expression de condition avant l'entre dans la boucle. Dclarations l'intrieur de la boucle sont excutes de faon rpte, et aprs chaque itration la valeur dexpression est incrmente. L'itration se poursuit jusqu' moment o l'expression de condition devient fausse. Une boucle sans fin est forme si l'expression condition est toujours vraie. L'exemple suivant montre comment une boucle peut tre mise en place pour excuter 10 fois. Dans cet exemple, la variable i commence par 0 et elle est augmente de 1 la fin de chaque itration. La boucle se termine quand i = 10, puisque dans ce cas, la condition i <10 devient fausse. la sortie de la boucle, la valeur de i est de 10:
for(i = 0; i < 10; i ++) { Instructions; }

Cette boucle pourrait galement tre lance par une expression initiale avec une valeur diffrente de zro. Ici, i commence par 1 et la boucle se termine quand i = 11. La sortie de la boucle se produira lorsque la valeur dei sera de 11 :
for (i = 1; i <= 10; i++) { Instructions; }

Les paramtres d'une boucle for sont tous optionnels et peuvent tre omises. Si la condition expression est laisse de ct, il est suppos pour tre vrai. Dans l'exemple suivant, une boucle sans fin est forme par l'expression de condition qui est toujours vraie et la valeur de i commence avec 0 et est incrment aprs chaque itration :
// Boucle sans fin avec incrmentation i for (i = 0;; i++) { Instructions; }

- 44 -

V.TOURTCHINE. Programmation en mikroC. Application pour les microcontrleurs de la famille PIC

Dans l'exemple suivant d'une boucle sans fin o tous les paramtres sont omis :
// Exemple de boucle sans fin for (;;) { Instructions; }

Dans la boucle sans fin suivante, i commence par 1 et n'est pas incrment l'intrieur de la boucle :
// Boucle sans fin avec i = 1 for (i = 1;;) { Instructions; }

Sil n'y a qu'une seule instruction l'intrieur de la boucle for, les accolades peuvent tre omises comme cest montr dans l'exemple suivant : for (k = 0; k <10; k++) Total = Total + Sum; Les boucles imbriques peuvent galement tre utiliss. Dans une boucle for imbrique, la boucle intrieure est excute pour chaque itration de la boucle externe. Dans l'exemple suivant la boucle interne est excute 5 fois et la boucle extrieure est excute 10 fois. Le nombre ditrations totales est de cinquante :
// Exemple de deux boucles imbriques for (i = 0; i < 10; i++) { for (j = 0; j < 5; j++) { Instructions; } }

Dans l'exemple suivant, la somme de tous les lments d'un matrice M [3 x 4] est calcule et stockes dans une variable appele Sum :
// Ajouter tous Sum = 0; for (i = 0; i < { for (j = 0; j { Sum = Sum + } } les lments d'une matrice 3x4 3; i++) < 4; j++) M[i][j];

Comme il n'y a qu'une seule instruction excuter, l'exemple prcdent pourrait galement tre s'crit :
// Ajouter tous les lments d'une matrice 3x4 Sum = 0; for (i = 0; i < 3; i++)

- 45 -

V.TOURTCHINE. Programmation en mikroC. Application pour les microcontrleurs de la famille PIC


{ for (j = 0; j < 4; j++) Sum = Sum + M[i][j]; }

Instruction while La syntaxe d'une instruction while est la suivante : while (condition) { Instructions; } Ici, les instructions sont excutes jusqu' ce que la condition devienne fausse, ou les instructions sont excutes de faon rpte aussi longtemps que la condition est vraie. Si la condition est fausse l'entre de la boucle, la boucle ne sera pas excut et le programme sera continuer de l'extrmit de la boucle while. Il est important que la condition est chang intrieur de la boucle, sinon une boucle sans fin sera form. Le code suivant montre comment mettre en place une boucle d'excuter 10 fois :
// Une boucle qui s'excute 10 fois k = 0; while (k <10) { Instructions; k++; }

Au dbut du code, la variable k est gal 0. Comme k est infrieur 10, la boucle while commence. L'intrieur de la boucle, la valeur de k est incrment dun aprs chaque itration. La boucle se rpte tant que k < 10 et se termine lorsque k = 10. la fin la valeur de k est 10. Notez quune boucle sans fin sera form si k n'est pas incrment l'intrieur de la boucle:
// Une boucle sans fin k = 0; while (k <10) { Instructions; }

Une boucle sans fin peut galement tre forme par rglage de la condition qui doit tre toujours vrai :
// Une boucle sans fin while (k = k) { Instructions; }

Voici un exemple de calcul de la somme des nombres de 1 10 et le stockage du rsultat d'une somme variable appele sum :

- 46 -

V.TOURTCHINE. Programmation en mikroC. Application pour les microcontrleurs de la famille PIC


// Calculer la somme des nombres de 1 10 unsigned int k, sum; k = 1; sum = 0; while (k <= 10) { sum = sum + k; k++; }

Il est possible d'avoir une dclaration while sans corps. Une telle dclaration est utile, pour par exemple, si nous attendons un port d'entre pour changer sa valeur. Voici un exemple o le programme va attendre aussi longtemps que le bit 0 de PORTB (PORTB.0) est au niveau logique 0. Le programme se poursuivra jusquau changement la valeur logique 1 sur les broches du port. while (PORTB.F0 == 0); // Attendre jusqu' ce que PORTB.0 devient un ou while (PORTB.F0); Instruction do Une dclaration do est similaire une dclaration while sauf ce que la boucle excute jusqu' ce que la condition devient fausse, ou, la boucle s'excute tant que la la condition est vraie. La condition est teste la fin de la boucle. La syntaxe d'une dclaration do est la suivante : do { Instructions; } while (condition); La premire itration est toujours effectue si la condition est vraie ou fausse. Il s'agit de la principale diffrence entre une dclaration while et une dclaration do. Le code suivant montre comment mettre en place une boucle d'excuter 10 fois en utilisant la dclaration do
/*Excute 10 fois */ k = 0; do { Instructions; k++; } while (k <10);

La boucle commence avec k = 0, et la valeur de k est incrment intrieur de la boucle aprs chaque itration. la fin de boucle k est test, et si k n'est pas infrieur 10, la boucle termine. Dans cet exemple k = 0 au dbut de la boucle, la fin de la boucle la valeur de k est 10. Une boucle sans fin sera forme si la condition n'est pas modifie l'intrieur de la boucle, comme est illustr dans l'exemple ci-dessous. Ici k est toujours infrieur 10 :

- 47 -

V.TOURTCHINE. Programmation en mikroC. Application pour les microcontrleurs de la famille PIC


/*Une boucle sans fin*/ k = 0 ; do { Instructions; } while (k < 10);

Une boucle sans fin peut galement tre cre si la condition est rgle pour tre vrai tout le temps:
/* Une boucle sans fin */ do { Instructions; }while (k = k);

Instruction goto, continue et break Une instruction goto peut tre utilise pour modifier le flux normal de contrle dans un programme. Elle provoque le programme sauter une tiquette spcifie. Une tiquette peut tre n'importe quel jeu de caractres alphanumriques commenant par une lettre et se terminant par le caractre : . Bien que linstruction goto soit non recommande, elle peut tre utilise conjointement avec une instruction if pour crer un programme en itrations. L'exemple suivant montre comment mettre en place une boucle pour lexcuter 10 fois en utilisant goto et if :
/ * Excute 10 fois * / k = 0; Boucle: Instructions; k++; if (k < 10) goto Boucle;

La boucle commence par ltiquette Boucle et la variable k = 0. Les instructions sont excutes l'intrieur de la boucle et k est incrment de 1. La valeur de k est alors compar 10 et le programme retourne ltiquette Boucle si k <10. Ainsi, la boucle est excute 10 fois jusqu' ce que la condition la fin devienne fausse. la fin de la boucle la valeur de k est 10. Les instructions continue et break peuvent tre utiliss l'intrieur ditrations pour modifier le flux de commande. Une instruction continue est gnralement utilise avec une instruction if et provoque le saut de la boucle ditration. Voici un exemple qui calcule la somme des nombres de 1 10, sauf le nombre 5:

- 48 -

V.TOURTCHINE. Programmation en mikroC. Application pour les microcontrleurs de la famille PIC


/* Calculer la somme des nombres 1,2,3,4,6,7,8,9,10 */ Sum = 0; i = 1; for (i = 1; i <= 10; i++) { if (i == 5) continue; // Passer numro 5 Sum = Sum + i; }

De mme, une instruction break peut tre utilis pour mettre fin une boucle l'intrieur de la boucle. Dans l'exemple suivant, la somme des nombres de 1 5 est calcule, mme si les paramtres de la boucle sont mis parcourir 10 fois:
/ * Calculer la somme des nombres 1,2,3,4,5 * / Sum = 0; i = 1; for (i = 1; i <= 10; i++) { if (i > 5) break; // Stop boucle si i > 5 }

2.2.14 Utilisation mikroC avec des instructions en langage dassembleur Il devient parfois ncessaire dutiliser la langue assembleur pour microcontrleurs PIC et des instructions en langage mikroC. Des instructions en langage assembleur peuvent tre incluses dans un programme en utilisant mot-cl asm (ou _asm, ou __ asm). La syntaxe est la suivante: asm { Instructions } Commentaires du langage dassembleur (une ligne commenant par un point-virgule) ne sont pas autoriss, mais les deux types de commentaires en microC peuvent tre utiliss dans les routines en langage d'assembleur : asm { // Ce code introduit un temporisation MOVLW 6 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . } Les variables en microC peuvent tre utilises dans les routines en langage d'assembleur, mais elles doivent tre dclares et initialises avant son utilisation. Par exemple, une variable Temp peut tre initialise et ensuite charge dans le registre W : - 49 // Charge W avec 6

V.TOURTCHINE. Programmation en mikroC. Application pour les microcontrleurs de la famille PIC


unsigned char Temp = 10; asm { MOVLW Temp // W = Temp =10 . . . . . . . . . . . . . . . . . . }

2.3 Exercices
Exercice 2.1 Ecrire un programme pour mettre tous les 8 pattes du PORTB au niveau 1.

Solution 2.1 PORTB est configur comme un port de sortie ( laide du registre TRISB), et ensuite tous les 8 bits du port sont mis au niveau logique 1 (en chargeant le registre PORTB par le nombre hexadcimal 0xFF) :
void main () { TRISB = 0; PORTB = 0xFF; }

// Configurer PORTB en sortie // Mettre toutes les bits du port 1

Exercice 2.2 crire un programme pour mettre les pattes impaires (1, 3, 5 et 7) du PORTB au niveau 1. Solution 2.2 Repres impaires de port peuvent tre mis au niveau logique 1 en envoyant la configuration binaire 10101010 au registre PORTB. Cette configuration binaire est le nombre hexadcimal 0xAA et le programme ncessaire est :
void main () { TRISB = 0; PORTB = 0xAA; }

// Configurer PORTB en sortie // Activer les pattes impairs numrots

Exercice 2.3 Ecrire un programme pour compter en binaire sans fin et envoie ces donnes PORTB : - 50 -

V.TOURTCHINE. Programmation en mikroC. Application pour les microcontrleurs de la famille PIC

00000000 00000001 00000010 00000011 ............ ............ 11111110 11111111 00000000 ............

Solution 2.3 Une boucle sans fin peut tre utilise, et l'intrieur de cette boucle la valeur d'une variable peut tre incrmente, puis envoye PORTB:
void main () { unsigned char Cnt = 0; for (;;) { PORTB = Cnt; Cnt++; } }

// Boucle sans fin // Envoyer Cnt PORTB // Incrmentation Cnt

Exercice 2.4 crire un programme pour mettre tous les bits de PORTB au niveau logique 1, puis la logique 0, et rpter ce procd dix fois.

Solution 2.4 Linstruction for peut tre utilise pour crer une boucle rpter les oprations requises dix fois
void main () { unsigned char j; for (j = 0; j < 10; j++) { PORTB = 0xFF; PORTB = 0; } }

// Rpter 10 fois // Mettre les bits de PORTB 1 // Mettre les bits de PORTB 0

- 51 -

V.TOURTCHINE. Programmation en mikroC. Application pour les microcontrleurs de la famille PIC

Exercice 2.5 Le rayon et la hauteur d'un cylindre sont de 2,5 cm et 10 cm respectivement. Ecrire un programme pour calculer le volume de ce cylindre.

Solution 2.5 Le programme est :


void main () { float Rayon = 2.5, Hauteur = 10; float Volume; Volume = PI * Rayon * Rayon * Hauteur; }

Exercice 2.6 Ecrire un programme pour trouver le plus grand lment d'un tableau d'entiers ayant dix lments.

Solution 2.6 Au dbut, la variable m est affecte sur le premier lment de la matrice. Une boucle est alors forme et le plus grand lment de la matrice se trouve :

void main () { unsigned char j ; int m, A [10]; m = A [0]; for (j = 1; j < 10; j++) { if (A [j]> m) m = A [j]; } }

// Premier lment du tableau

Exercice 2.7 Ecrire un programme en utilisant une boucle while pour effacer tous les dix lments entiers dans un tableau M.

Solution 2.7 Dans le programme qui suit, NUM est dfinie comme 10 et une variable j est utilise comme le compteur de boucle:

- 52 -

V.TOURTCHINE. Programmation en mikroC. Application pour les microcontrleurs de la famille PIC


#define NUM 10 void main () { int M[NUM]; unsigned char j = 0; while (j < NUM) { M[j] = 0; j++; } }

Exercice 2.8 Ecrire un programme pour convertir la temprature de C F partir de 0 C, avec le pas de 1 C jusqu' 100 C, et stocker les rsultats dans un tableau appel F.

Solution 2.8

La temprature quivalente en F, est calcule selon la formule: F = (C- 32.0)/1.08 Une boucle for est utilise pour calculer la temprature en F et la ranger dans tableau F :

void main () { float F[100]; unsigned char C; for (C = 0; C <= 100; C++) { F[C] =(C 32.0) / 1.8; } }

- 53 -

V.TOURTCHINE. Programmation en mikroC. Application pour les microcontrleurs de la famille PIC

III. FONCTIONS ET BIBLIOTHEQUES DANS MIKROC


3.1 Fonctions dans mikroC
Les fonctions sont gnralement dfinies comme des sous-programmes qui renvoient une valeur fonde sur un certain nombre de paramtres d'entre. Chaque programme doit avoir une seule fonction externe marquant le point d'entre dans le programme principale. Les fonctions sont dclars comme des prototypes en standard ou fourni par l'utilisateur, ou par des fichiers du programme. Chaque programme crit en langage mikroC se compose de nombre plus ou moins de fonctions. L'ide principale est de diviser un programme en plusieurs parties qui utilisent ces fonctions afin de rsoudre le problme rel plus facile. En outre, les fonctions nous permettent d'utiliser les comptences et les connaissances d'autres programmeurs. Par exemple, sil est ncessaire d'envoyer une chane de caractres un cran LCD, il est beaucoup plus facile d'utiliser une partie dj crite du programme que de recommencer. Les fonctions consistent des commandes prcisant ce qui doit tre fait sur des variables. Elles peuvent tre compares des sous-routines. En rgle gnrale, il est beaucoup mieux d'avoir un programme compos d'un grand nombre de fonctions simples que de quelques fonctions importantes.

3.1.1 Dclaration dune fonction


Chaque fonction doit tre dclare de manire tre correctement interprt au cours du processus de compilation. Dclaration contient les lments suivants:

Nom de la fonction Liste des paramtres Dclaration des paramtres Corps de la fonction Type de rsultat de la fonction

La syntaxe gnrale d'une dfinition de fonction est montre ci-dessous :


type_de_rsultat nom_fonction(parameter1, parameter2, .....) { ............. corps de la fonction ............. }

Dans lexemple qui suit, la fonction, nomme Mult, reoit deux arguments entiers, a et b, et renvoie leur produit. Notez que l'utilisation des parenthses dans une instruction de retour est facultative :
int Mult(int a, int b) { return (a*b); }

Quand une fonction est appele, elle s'attend gnralement donner le nombre d'arguments exprims en liste d'arguments de la fonction. Par exemple, la fonction prcdente peut tre appele : - 54 -

V.TOURTCHINE. Programmation en mikroC. Application pour les microcontrleurs de la famille PIC z = Mult (x, y); o la variable z est le type de donnes int. Notez que les arguments dclars dans la dfinition de la fonction et les arguments passs lorsque la fonction est appele sont indpendants les uns des autres, mme si elles ont le mme nom. Dans l'exemple prcdent, lorsque la fonction est appele, variable x est copi a et variable y et est copie b sur entre en fonction Mult. Certaines fonctions ne renvoient pas de donnes. Le type de donnes de ces fonctions doit tre dclares comme nul. Par exemple
void LED(unsigned char D) { PORTB = D; }

Fonctions void peut tre appele sans aucune instruction d'affectation, mais les parenthses sont ncessaire pour indiquer au compilateur que un appel de fonction est faite: LED (); En outre, certaines fonctions ne possdent pas d'arguments. Dans l'exemple suivant, la fonction, nomme Compl, complte PORTC du microcontrleur. Il ne renvoie pas de donnes et n'a pas d'arguments:
void Compl() { PORTC = PORTC; }

Cette fonction peut tre appele en tant que : Compl (); Les fonctions sont normalement dfinies avant le dbut du programme principal. Certaines dfinitions de fonction et de leur utilisation dans les programmes principaux sont illustres dans les exemples suivants: Exercice 3.1 crire une fonction appele Cercle_Surface pour calculer la surface d'un cercle dont le rayon sera utilis comme un argument. Utilisez cette fonction dans un programme principal pour calculer la surface d'un cercle dont le rayon est de 2,5 cm. Sauvegarder la valeur de cette surface dans une variable appele Cercle.

Solution 3.1 Le type de donnes de la fonction est dclar comme float. La surface d'un cercle est calcule par la formule : - 55 -

V.TOURTCHINE. Programmation en mikroC. Application pour les microcontrleurs de la famille PIC Surface = r2 o r est le rayon du cercle. La surface est calcule et stocke dans une variable appele s, qui est ensuite retourne par la fonction :
float Cercle_Surface(float rayon) { float s; s = PI*rayon*rayon; return s ; }

locale

Le code-source 3.1 montre comment la fonction Cercle_Surface peut tre utilise dans un programme principal pour calculer la surface d'un cercle dont le rayon est de 2,5 cm. La fonction est dfinie avant le programme principal. La fonction est appele l'intrieur du programme principal pour calculer la surface et la stocker dans la variable Cercle. Code-source 3.1
/**************************************************************************** SURFACE D'UN CERCLE ==================== Ce programme appelle la fonction Cercle_Surface pour calculer la surface d'un cercle. Microcontrleur : PIC 18F452 Oscillateur : HS, 08.0000 Mhz Fichier: SURFACE_CERCLE.c Date: Juillet 2012 ****************************************************************************/ //Calcule la surface d'un cercle en fonction de rayon float Cercle_Surface (float rayon) { float s; s = PI*rayon*rayon; return s; } /* Dbut du programme principal. Calcul de la surface d'un cercle o le rayon = 2,5 */ void main () { float r, Cercle; r = 2.5; Cercle = Cercle_Surface(r); }

- 56 -

V.TOURTCHINE. Programmation en mikroC. Application pour les microcontrleurs de la famille PIC

Exercice3.2 crire une fonction appele Surface et une fonction appele Volume pour calculer la surface et le volume d'un cylindre, respectivement. Puis crire un programme principal pour calculer la surface et le volume du cylindre dont le rayon est 2,0cm et la hauteur est 5,0cm. Stocker la valeur de cette surface dans la variable Cylindre_Surface et la valeur de volume dans la variable Cylindre_Volume.

Solution 3.2 La surface d'un cylindre est calcule par la formule: Surface = 2rh o r et h sont le rayon et la hauteur du cylindre, respectivement. Le volume d'un cylindre est calcul par la formule: Volume = r2h Le code-source 3.2 montre les fonctions qui calculent la surface et le volume d'un cylindre et le programme principal qui calcule la surface et le volume d'un cylindre dont le rayon = 2,0cm et 5,0cm de hauteur.

Exercice 3.3 crire une fonction appele Minuscule_Majuscule pour convertir un caractre de minuscule en majuscule.

Solution 3.3 La valeur ASCII du caractre en majuscule du premier caractre ('A') est gale 0x41. De mme, la valeur l'ASCII du premier caractre en minuscule ('a') est gale 0x61. Un caractre minuscule peut tre converti en son quivalent majuscule en soustrayant 0x20 du caractre en minuscule. Les fonctions ncessaires sont montres dans le code-source 3.3.

Exercice 3.4 Utilisez la fonction que vous avez cr dans l'exemple 3.3 dans un programme principal pour convertir la lettre r en majuscules.

- 57 -

V.TOURTCHINE. Programmation en mikroC. Application pour les microcontrleurs de la famille PIC

Solution 3.4 Le programme requis est indiqu dans le code-source 3.4. La fonction Minuscule_Majuscule est appele pour convertir le caractre en minuscule de la variable Lc en majuscules et de stocker dans la variable Uc.

Code-source 3.2
/************************************************************************** SURFACE ET VOLME DUN CYLINDRE ============================== Ce programme calcule la surface et le volume d'un cylindre dont le rayon est 2,0cm et la hauteur est 5,0cm. Microcontrleur : PIC 18F452 Oscillateur : HS, 08.0000 Mhz Fichier: VOLUM_CYLINDRE.c Date: Juillet 2012 ***************************************************************************/ //Fonction pour calculer la surface d'un cylindre float Surface(float rayon, float hauteur) { float s; s = 2.0*PI*rayon*hauteur; return s; } // Fonction pour calculer le volume d'un cylindre float Volume(float rayon, float hauteur) { float s ; s = PI*rayon*rayon*hauteur; return s; } // Dbut du programme principale void main () { float r = 2.0, h = 5.0; float Cylindre_Surface, Cylindre_Volume; Cylindre_Surface = Surface(r,h); Cylindre_Volume = Volume(r,h); }

- 58 -

V.TOURTCHINE. Programmation en mikroC. Application pour les microcontrleurs de la famille PIC Code-source 3.3
/*********************************************************************** MINUSCULEMAJUSCULE =================== Ce programme convertit le caractre en minuscule de la variable Lc dans le caractre en majuscule et le sauvegarde dans la variable Uc. Microcontrleur : PIC 16F84A Oscillateur : HS, 8.0000 Mhz Fichier: MINUSC_MAJUSC.c Date: Juillet 2012 *************************************************************************/ /* Fonction pour convertir un caractre en minuscule dans un caractre en majuscule*/ unsigned char Minuscule_Majuscule (unsigned char c) { if(c > ='a' && c <= 'z') return(c - 0x20); else return c; } // Dbut du programme principal void main () { unsigned char Lc, Uc; Lc = r; Uc = Minuscule_Majuscule (Lc); }

3.1.2 Prototypes de fonctions


Si une fonction n'est pas dfinie avant qu'il ne soit appel, le compilateur gnre une erreur. Une faon de contourner ce problme est de crer un prototype de fonction. Une fonction prototype est construite facilement en faisant une copie de la tte de la fonction. Les paramtres ne sont pas obligatoires, mais le type de donnes et des paramtres doivent tre dfinis. Dans un exemple, qui suit, le prototype de fonction appele Area est dclare et la fonction s'attend davoir un paramtre de type en virgule flottante : float Area(float rayon); Ce prototype de fonction pourrait galement tre dclar comme suit : float Area (float); Prototype de fonction doit tre dclar au dbut d'un programme. Les dfinitions et les appels de fonction peuvent alors tre faits n'importe quel point dans le programme.

- 59 -

V.TOURTCHINE. Programmation en mikroC. Application pour les microcontrleurs de la famille PIC Code-source 3.4
/**************************************************************************** MINUSCULES EN MAJUSCULES ============================ Ce programme convertit le caractre en minuscule de la variable Lc en majuscule et le sauvegarde dans la variable Uc. Microcontrleur : 16F84A Oscillateur : HS, 8.0000 Mhz Fichier: MINUSC_MAJUSCUL.c Date: Juillet 2012 ****************************************************************************/ // Fonction pour convertir un caractre de minuscule en majuscule unsigned { if (c> return else return } char Minuscule_Majuscule(unsigned char c) = 'a' && c <= 'z') (c - 0x20); c;

// Dbut du programme principal void main () { unsigned char Lc, Uc; Lc = r; Uc = Minuscule_Majuscule(Lc); }

Exercice 3.5 Rpter l'exemple 3.4, mais dclarer que Minuscule_Majuscule est un prototype de fonction.

Solution 3.5 Le code-source 3.5 prsente le programme o la fonction Minuscule_Majuscule est dclare comme un prototype de fonction au dbut du programme. Dans cet exemple, la fonction relle est crite aprs le programme principal. Un avantage important de l'utilisation des prototypes de fonction, c'est que si le prototype de fonction ne correspond pas la dfinition de la fonction relle, mikroC va dtecter et modifier les types de donnes dans l'appel de fonction pour faire correspondre les types de donnes dclars dans le prototype de fonction.

- 60 -

V.TOURTCHINE. Programmation en mikroC. Application pour les microcontrleurs de la famille PIC Code-source 3.5
/**************************************************************************** MINUSCULES EN MAJUSCULES ============================ Ce programme convertit le caractre en minuscule de la variable Lc en majuscule et le sauvegarde dans la variable Uc. Microcontroller: 16F84A Oscillateur : HS, 8.0000 Mhz Fichier: MIN_MAJ_2.c Date: Juillet 2012 ***************************************************************************/ unsigned char Minuscule_Majuscule(unsigned char); // Dbut du programme principal void main () { unsigned char Lc, Uc; Lc = r; Uc = Minuscule_Majuscule (Lc); } // Fonction pour convertir un caractre de minuscule en majuscule unsigned { if (c> return else return } char Minuscule_Majuscule (unsigned char c) = 'a' && c <= 'z') (c - 0x20); c;

Supposons que nous ayons le code suivant :


unsigned char c = A; unsigned int x = 100; long Tmp; long MaFonc(long a, long b); void main () { . . .. . .. . .. . .. . . . . .. . .. . .. . .. . . Tmp = MaFonc(c, x); . . .. . .. . .. . .. . . . . .. . .. . .. . .. . . }

// prototype de fonction

Dans cet exemple, le prototype de fonction dclare les deux arguments long, les variables x et c sont convertis en long avant d'tre utilis l'intrieur de la fonction MaFonc.

- 61 -

V.TOURTCHINE. Programmation en mikroC. Application pour les microcontrleurs de la famille PIC

3.1.3 Dfinition de fonction


La fonction se compose de sa dclaration et de son corps de la fonction. Le corps de fonction est un bloc, reprsentant de dfinitions locales et des dclarations entre les accolades {}. Toutes les variables dclares au sein de corps sont locales. La fonction elle-mme peut tre dfinie uniquement dans le cadre du fichier. Cela signifie que les dclarations ne peuvent pas tre imbriques. Pour revenir au rsultat de la fonction, utilisez l'instruction de return. Dclaration retour dune fonction de type void ne peut pas avoir un paramtre, vous pouvez omettre linstruction return si elle est la dernire instruction du corps de la fonction. Voici une dfinition de fonction chantillon :
// retourne Max avec le plus grand l'un de ses 2 arguments int Max (int x, int y) { return (x >= y)? x: y; }

Voici un exemple de fonction qui dpend des effets secondaires plutt que de la valeur de retour :
/* Fonction qui convertit coordonnes Descartes (x, y) en coordonnes polaires (r, fi): */ #include <math.h> voide polaire (double x, double y, double *r, double *fi) { *r = sqrt (x * x + y y *); *fi = (x == 0 && y == 0)? 0: atan2 (y, x); return; // cette ligne peut tre omise }

3.1.3 Appels de fonctions


Une fonction est appele avec des arguments rels placs dans la mme squence que leur correspondant paramtres formels. Utilisez un oprateur d'appel de fonction () : fonction_nom (expression_1, expression_2, ..., expression_n) Chaque expression dans l'appel de fonction est un argument rel. Nombre et types des arguments rels doivent correspondre ceux des paramtres de fonctions formelles. Arguments rels peuvent tre de n'importe quelle complexit. Sur lappel de fonction, tous les paramtres formels sont crs en tant qu'objets locaux initialis par des valeurs d'arguments rels. De retour d'une fonction, lobjet temporaire est cr la place de l'appel, et il est initialis par l'expression de la dclaration de retour. Cela signifie que l'appel de fonction comme un oprande de l'expression complexe est traite en rsultat de fonction. - 62 -

V.TOURTCHINE. Programmation en mikroC. Application pour les microcontrleurs de la famille PIC Si la fonction est sans rsultat (type void) ou vous n'avez pas besoin du rsultat, vous pouvez crire l'appel de fonction comme une expression autonome. En C, les paramtres scalaires sont toujours passs la fonction par valeur. Une fonction peut modifier les valeurs de ses paramtres formels, mais cela n'a aucun effet sur le rel argument dans la routine d'appel. Vous pouvez passer objet scalaire par le discours de dclarer un paramtre formel d'tre un pointeur. Ensuite, utilisez l'oprateur * pour accder l'objet pointu.

3.1.4 Conversion argument


Quand un prototype de la fonction n'a pas t pralablement dclar, mikroC convertit arguments intgraux un appel de fonction de l'largissement intgrante (l'expansion) Quand un prototype de fonction est en porte, mikroC convertit l'argument donn par le type de paramtre dclar comme par affectation. Si un prototype est prsent, le nombre d'arguments doivent correspondre. Les types doivent tre compatibles uniquement dans la mesure o une cession peut galement les convertir. Vous pouvez toujours utiliser une conversion explicite pour convertir un argument pour un type qui est acceptable un prototype de fonction. Remarque : Si le prototype de fonction ne correspond pas la dfinition de la fonction relle, mikroC permet le dtecter si et seulement si cette dfinition se trouve dans la mme unit de compilation comme le prototype. Le compilateur est aussi capable de forcer les arguments du type appropri. Supposons que vous ayez le code qui suit :
int limit = 32; char ch = 'A'; long res; extern long fonc(long par1, long par2); main () { res = fonc(limit, ch); } //... // fonction call (appeler) // prototype

Comme il a le prototype de fonction pour func, ce programme convertit limit et ch long, en utilisant la rgle standard, avant qu'il ne les place sur la pile pour l'appel la fonction fonc. Sans le prototype de fonction, limit et ch aurait t plac dans la pile comme un entier et un caractre, respectivement. Dans ce cas, la contenu de pile ne serait pas correspondre la taille ou le contenu de fonc, conduisant un problme. Lutilisation des prototypes de fonctions facilite grandement dans la rvlation des erreurs.

- 63 -

V.TOURTCHINE. Programmation en mikroC. Application pour les microcontrleurs de la famille PIC

3.2 Fonctions intgres


Le compilateur mikroC fournit un ensemble de fonctions intgres qui peuvent tre appeles partir du programme. Ces fonctions sont numres dans le tableau 3.1, avec une brve description de chacune. La plupart de ces fonctions peuvent tre utilises dans un programme sans avoir inclure des fichiers d'en-tte. Fonction
Lo Hi Higher Highest Delay_us Delay_ms Vdelay_ms Delay_Cyc Clock_Khz Clock_Mhz

Tableau 3.1: Fonctions intgres Description Renvoie le plus faible nombre d'octets (bits 0 7) Renvoie le plus faible nombre d'octets (bits 8 15) Renvoie le plus leve d'octet d'un nombre (bits 16 23) Retourne le plus grand d'octets d'un nombre (bits 24 31) Cre le retard dans les units de microseconde Cre le retard constante dans les units de millisecondes Cre le retard en millisecondes en utilisant des variables de programme Cre le retard bas sur l'horloge de microcontrleur Rgler lhorloge de microcontrleur en KHz Rgler lhorloge de microcontrleur en MHz

Les exceptions sont des fonctions Lo, Hi, Higher, et Highest, qui exigent le fichier den-tte built_in.h. De plus dtails sur l'utilisation de ces fonctions sont disponibles dans le manuel de mikroC. Delay_us et delay_ms fonctions sont frquemment utiliss dans les programmes o les retards sont requis (par exemple, se met clignoter une LED). L'exemple suivant illustre l'utilisation de la fonction Delay_ms :

Exercice 3.6 Une LED est connecte au PORTB (broche RB0) d'un microcontrleur PIC16F84A travers dune rsistance de limitation, comme indiqu dans la figure 3.1. Ecrire un programme qui fera clignoter le LED ON et OFF en permanence dans lintervalle d'une seconde.

- 64 -

V.TOURTCHINE. Programmation en mikroC. Application pour les microcontrleurs de la famille PIC

Solution 3.6 Une LED peut tre connecte un microcontrleur en deux modes : source de courant et absorption de courant. En mode d'absorption de courant (voir figure 3.1a) une patte de la LED est connecte + 5 V travers une rsistance R de limitation de courant et l'autre patte est relie la patte de port de sortie du microcontrleur. La LED sera allume lorsque le port de sortie du microcontrleur est au niveau logique 0 ( savoir, environ +0 V). En mode de source de courant (voir figure 3.1b) une patte de la LED est relie au port de sortie du microcontrleur et l'autre patte est relie la masse travers une rsistance R de limitation de courant. La LED sera allum lorsque le port de sortie du microcontrleur est au niveau logique 1 ( savoir, environ +5 V). La mme valeur de rsistance R peut tre utilise en mode de source de courant.

a)

b) Fig.3.1 LED connecte au port RB0 d'un microcontrleur PIC

Le programme requis est donn dans le code-source 3.6 (fichier LED CLIGNOT.C). Le port PORTB est configur en sortie en utilisant la dclaration TRISB = 0. Une boucle sans fin est alors forme avec la dclaration for, et l'intrieur de cette boucle la LED est allume ou teinte avec un dlai dune second. Un autre programme clignoter une LED donn par le code-source 3.7 (fichier LED CLIGNOT2.C) est plus facile suivre en utilisant la commande de prprocesseur #define.

3.3 Fonctions de la bibliothque mikroC


Un vaste ensemble de fonctions de la bibliothque est disponible avec le compilateur mikroC. Ces fonctions de la bibliothque peuvent tre appeles partir de n'importe quel programme, et ils sont inclus dans le programme. Le manuel d'utilisation mikroC donne une description dtaille de chaque fonction de la bibliothque, avec des exemples. Dans cette partie, les fonctions de la bibliothque disponibles sont identifies, et les fonctions de la bibliothque importante et couramment utiliss sont dcrites dans dtail, avec des exemples. - 65 -

V.TOURTCHINE. Programmation en mikroC. Application pour les microcontrleurs de la famille PIC Le tableau 3.2 donne une liste des fonctions de la bibliothque mikroC, organise en ordre fonctionnel. Certaines des fonctions de la bibliothque frquemment utilises sont les suivantes : EEPROM bibliothque LCD bibliothque Logiciel UART bibliothque Matriel USART bibliothque Sound bibliothque ANSI C bibliothque Divers bibliothques Code-source 3.6
/**************************************************************************** LED CLIGNOTANTE ================ Ce programme fait clignoter dune LED connecte au port RB0 d'un microcontrleur PIC avec lintervalle dune seconde. La fonction intgr Delay_ms est utilis pour crer un dlai de 1 seconde entre les clignotements. Microcontrleur: 16F84A Oscillateur: HS, 4.0000 Mhz Fichier: LED_CLIGNOTE.c Date: Juillet 2012 ****************************************************************************/ void main () { TRISB = 0; // Configurer PORTB en sortie for (;;) // Boucle sans fin { PORTB = 1; // Activer LED Delay_ms (1000); // Retard 1 seconde PORTB = 0; // Dsactiver LED Delay_ms (1000); // Retard 1 seconde } }

Code-source 3.7
/*************************************************************************** LED CLIGNOTANTE_2 =================== Ce programme fait clignoter dune LED connecte au port RB0 d'un microcontrleur PIC avec lintervalle dune seconde. En utilisant les commandes de prprocesseur #define le programme est devenu plus facile suivre. Microcontrleur: 16F84A Oscillateur: HS, 4.0000 Mhz Fichier: LED_CLIGNOTE2.c Date: Juillet 2012 **************************************************************************/ #define LED PORTB.0 #define ON 1 #define OFF 0 #define One_Second_Delay Delay_ms(1000)

- 66 -

V.TOURTCHINE. Programmation en mikroC. Application pour les microcontrleurs de la famille PIC


void main() { TRISB = 0; for(; ;) { LED = ON; One_Second_Delay; LED = OFF; One_Second_Delay; } }

// PORTB est configur en sortie // Boucle sans fin // // // // LED est Retard LED est Retard allume (ON) 1 seconde dsactive (OFF) 1 seconde

Tableau 3.2: Bibliothque mikroC Bibliothque


ADC CAN CANSPI Compact Flash EEPROM EthernetPIC18FxxJ60 Flash Memory Graphics LCD T6963C Graphics LCD I2C Keypad LCD Manchester Code Multi Media One Wire PS/2 PWM RS-485 Sound SPI UART SPI Graphics LCD

Description Utilis pour conversion analogique/numrique Utilis pour le fonctionnement avec le module CAN Utilis pour le fonctionnement avec le module extern CAN Utilis pour les operations avec les cartes mmoire Compact Fash Utilis pour les operations avec la mmoire EEPROM Utilis pour les operations avec le module Ethernet Utilis pour le fonctionnement avec mmoire integ Flash Utilis pour le fonctionnement avec module LCD graphique avec une rsolution de 128x64 Utilis pour la communication avec module LCD graphiques T6963 Utilis pour la simulation du protocole I2C Utilis pour les operations avec le clavier Utilis pour le fonctionnement avec LCD standard Utilis pour les communication laide du code de Manchester Utilis pour les operation avec les cartes multimedia flasch MMC Utilis pour le bus 1-Wire Utilis pour les operations avec le clavier PS/2 standard Utilis pour les operations avec le module de PWM Utilis pour les operations avec les modules la communication srie RS-485 Utilis pour le fonctionnement du module sonore Utilis pour les operations avec le module SPI Utilis poue les operations avec le module de UART Utilis pour la communication avec SPI graphique LCD

3.3.1 Bibliothque EEPROM La bibliothque EEPROM inclut des fonctions pour lire les donnes non volatiles dEEPROM du PIC, ou pour crire des donnes sur cette mmoire. Deux fonctions sont prvues : Eeprom_Read Eeprom_Write

La fonction Eeprom_Read lit un octet partir d'une adresse spcifie de la mmoire EEPROM. Ladresse est de type entier, et donc la fonction prend en charge les microcontrleurs PIC avec - 67 -

V.TOURTCHINE. Programmation en mikroC. Application pour les microcontrleurs de la famille PIC plus de 256 octets. Un retard de 20 ms doit tre utilis entre lectures successives de lEEPROM pour garantir le retour des donnes correctes. Dans l'exemple suivant, l'octet d'adresse 0x1F de la mmoire EEPROM est lu et stock dans variable Temp: Temp = Eeprom_Read (0x1F); La fonction Eeprom_Write crit un octet une adresse spcifie de la mmoire EEPROM. L'adresse est de type entier et donc la fonction prend en charge les microcontrleurs PIC avec plus de 256 octets. Un retard de 20 ms doit tre utilis entre critures successives dans la mmoire EEPROM pour garantir le transfert correct de donnes dans la mmoire EEPROM. Dans l'exemple suivant, le nombre 0x05 est crit l'adresse 0x2F de l'EEPROM : Eeprom_Write (0x2F, 0x05);

Exercice 3.7 Ecrivez un programme pour lire le contenu de l'EEPROM de l'adresse 0 0x2F puis envoyez ces donnes pour PORTB d'un microcontrleur PIC. Solution 3.7 Le programme requis est donn dans le code-source 3.8 (fichier LECTURE DE LEEPROM). Une boucle for est utilise pour lire les donnes de lEEPROM et puis de l'envoyer au PORTB du microcontrleur. Notez que quelques 20ms retard sont utiliss entre chaque lecture successive. Code-source 3.8
/**************************************************************************** LECTURE DE LEEPROM ==================== Ce programme lit les donnes partir d'adresses de 0 0x2F de l'EEPROM et puis envoie ces donnes pour PORTB du microcontrleur. Microcontrleur: 16F84A Oscillateur: HS, 4.0000 Mhz Fichier: EEPROM.c Date: Juillet 2012 ****************************************************************************/ void main() { unsigned int j; unsigned char Temp; TRISB = 0; for(j=0; j <= 0x2F; j++) { Temp = Eeprom_Read(j); PORTB = Temp; Delay_ms(20); } } // PORTB est configur en sortie

- 68 -

V.TOURTCHINE. Programmation en mikroC. Application pour les microcontrleurs de la famille PIC 3.3.2 Bibliothque pour LCD La programmation en assembleur d'un cran LCD en mode parallle ou en srie est gnralement une tche complexe et ncessite dune bonne comprhension du fonctionnement interne de l'cran LCD. La langue mikroC fournit des fonctions pour les deux modes de programmation base sur le texte dj prpar, ce qui simplifie l'utilisation d'crans LCD.

Le contrleur LCD HD44780 Le HD44780 est l'un des contrleurs de cristaux liquides les plus apprcis, tant utilis dans l'industrie et dans les applications commerciales. Le module est monochrome et vient dans diffrentes formes et tailles. Des modules avec 8, 16, 20, 24, 32 et 40 caractres sont disponibles. Selon le modle, l'cran LCD est fabriqu avec 14 ou 16 pattes pour l'interface. Le tableau 3.3 prsente la configuration des pattes et les fonctions des pattes dun LCD 14 pattes. La patte VSS est 0V ou du sol. La patte VDD doit tre connect la borne positive dalimentation. Bien que les fabricants spcifient une alimentation 5V DC, les modules travaillent habituellement aussi avec une alimentation un peu bas que 3V ou aussi haut que 6V. La patte 3 VEE est dsign pour rglage du contraste de l'affichage et doit tre relie une alimentation en courant continu. Un potentiomtre est gnralement connect l'alimentation avec son curseur raccord la patte VEE et l'autre patte du potentiomtre reli la masse. De cette faon la tension la patte VEE, et o le contraste de l'affichage, peut tre rgle volont. La patte 4 est le registre de slection (RS) et lorsque cette patte 0 V, les donnes sont transfrs l'affichage cristaux liquides. Lorsque RS est +5 V, les donnes de caractres peuvent tre transfrs partir du module LCD. La patte 5 est le registre de slection de lecture / criture (R / W). Cette patte est relie avec la masse (tat logique bas) afin d'crire des donnes de caractres au module LCD. Lorsque cette broche est +5 V (tats logique haut) donc les informations sortants du module LCD peuvent tre lues. La patte 6 est la validation (EN), qui est utilis pour initier le transfert de commandes ou de donnes entre le module et le microcontrleur. Lors de l'criture l'cran, les donnes sont transfrs uniquement sur le front descendant (haut-bas) sur cette patte. Lors de la lecture de laffichage, les donnes deviennent accessibles aprs le front montant (bas-haut) de la patte de validation, et ces donnes demeurent tant que la patte de validation est au niveau logique haut.

Les broches 7 14 sont les huit lignes de bus de donnes (D0 D7). Les donnes peuvent tre transfres entre le microcontrleur et le module LCD l'aide soit d'un seul octet de 8 bits soit de deux 4-bits. Dans ce dernier cas, seuls les quatre lignes de donnes suprieures (D4 D7) sont utilises. Le 4-bits mode a l'avantage de ncessiter moins de lignes d'E / S pour communiquer avec l'cran LCD. - 69 -

V.TOURTCHINE. Programmation en mikroC. Application pour les microcontrleurs de la famille PIC Tableau 3.3 : Les pattes du module LCD HD44780 Broche N 1 2 3 4 5 6 7 8 9 10 11 12 13 14 Appellation Fonction

VSS VDD VEE RS R/W EN D0 D1 D2 D3 D4 D5 D6 D7

Ground +ve supply Contrast Register select Read/write Enable Data bit 0 Data bit 1 Data bit 2 Data bit 3 Data bit 4 Data bit 5 Data bit 6 Data bit 7

Le mikroC LCD bibliothque fournit un grand nombre de fonctions pour contrler du texte LCD avec 4-bits et les interfaces de donnes 8-bit, et pour les graphiques LCD. La plus courante sont les 4-bit interface en mode texte sur cran LCD. Ce qui suit sont les fonctions disponibles pour LCD 4-bit interface en mode texte LCD : Lcd_Config Lcd_Init Lcd_Out Lcd_Out_Cp Lcd_Chr Lcd_Chr_Cp Lcd_Cmd

Lcd_Config La fonction Lcd_Config est utilise pour configurer l'interface LCD. La connexion par dfaut entre le LCD et le microcontrleur est la suivante : LCD Patte du port de microcontrleurs - 70 -

V.TOURTCHINE. Programmation en mikroC. Application pour les microcontrleurs de la famille PIC

RS FR D4 D5 D6 D7

2 3 4 5 6 7

La patte R / W de l'cran n'est pas utilis et doit tre relie la masse. Cette fonction devrait tre utilise pour modifier la connexion par dfaut. Il devrait tre appel avec les paramtres dans l'ordre suivant : nom de port, RS patte, EN patte, R/W patte, D7 patte, D6 patte, D5 patte, D4 patte Le nom du port doit tre spcifi en passant son adresse. Par exemple, si RS patte est connecte RB0, EN patte RB1, D7 patte RB2, D6 patte RB3, D5 patte RB4, et D4 patte RB5, alors la fonction doit tre appele comme suit : Lcd_Init La fonction Lcd_Init est appele pour configurer l'interface entre le microcontrleur et l'cran LCD lorsque les connexions sont faites par dfaut que vient d'tre illustr. Le nom du port doit tre spcifi en passant son adresse. Par exemple, en supposant que LCD est relie PORTB et les connexions par dfaut prcdentes sont utilises, la fonction doit tre appele en tant que : Lcd_Init(); Lcd_Out La fonction Lcd_Out affiche du texte la ligne indique et la position des colonnes de l'cran LCD. La fonction doit tre appele avec des paramtres dans l'ordre suivant : ligne, colonne, texte Par exemple, pour afficher du texte "Ordinateur" la ligne 1 et la colonne 2 de l'cran LCD nous devrions appeler la fonction comme suit : Lcd_Out (1, 2, "Ordinateur");

Lcd_Out_Cp La fonction Lcd_Out_Cp affiche le texte la position actuelle du curseur. Par exemple, pour afficher le texte "Ordinateur" la position actuelle du curseur, la fonction devrait tre appel en tant que : Lcd_Out_Cp ("Ordinateur"); Lcd_Chr La fonction Lcd_Chr affiche un caractre la ligne indique et la colonne la position du curseur. La fonction doit tre appele avec les paramtres dans le l'ordre suivant : - 71 -

V.TOURTCHINE. Programmation en mikroC. Application pour les microcontrleurs de la famille PIC

ligne, colonne, caractre Par exemple, pour afficher caractre "K" la ligne 2 et la colonne 4 de l'cran LCD nous devrions appeler la fonction de : Lcd_Chr(2, 4, K); Lcd_Chr_Cp La fonction Lcd_Chr_Cp affiche un caractre la position actuelle du courser. Par exemple, pour afficher le caractre "M" la position actuelle du curseur, la fonction doit tre appele en tant que : Lcd_Chr_Cp ('M'); Lcd_Cmd La fonction Lcd_Cmd est utilise pour envoyer une commande l'cran LCD. Avec ce commande, nous pouvons dplacer le curseur vers n'importe quelle ligne, dsactiver l'cran LCD, faire clignote le curseur, dcaler l'affichage, etc. Une liste des plus couramment utiliss commandes LCD est donne dans Tableau 3.4. Par exemple, pour effacer l'cran LCD nous devrions appeler la fonction comme suit : Lcd_Cmd (Lcd_Clear); Tableau 3.4: Commandes LCD Description Effacer l'affichage Retourner vers la position du curseur Dplacer le curseur vers la premire ligne Dplacer le curseur vers la deuxime ligne Dplacer le curseur vers la troisime ligne Dplacer le curseur vers la quatrime ligne Clignotement du curseur Dplacer le curseur gauche Dplacer le curseur droite Dcaler l'affichage gauche Dcaler l'affichage droite

Commande LCD
LCD_CLEAR LCD_RETURN_HOME LCD_FIRST_ROW LCD_SECOND_ROW LCD_THIRD_ROW LCD_FOURTH_ROW LCD_BLINK_CURSOR_ON LCD_MOVE_CURSOR_LEFT LCD_MOVE_CURSOR_RIGHT LCD_SHIFT_LEFT LCD_SHIFT_RIGHT

Un exercice ci-dessous illustre l'initialisation et l'utilisation de l'cran LCD. - 72 -

V.TOURTCHINE. Programmation en mikroC. Application pour les microcontrleurs de la famille PIC

Exercice 3.8 Un contrleur de texte LCD est reli un microcontrleur PIC16F84A dans le mode par dfaut comme illustre la figure 3.2. Ecrire un programme pour envoyer le texte Mon Ordinateur la ligne 1, la colonne 4 de lcran LCD.

Solution 3.8 Le programme est donn dans le code-source 3.9 (fichier : LCD.C). Au dbut le PORTB est configur en sortie par la dclaration TRISB = 0. L'cran LCD est alors initialis, l'affichage est effac, et le texte Mon Ordinateur "est affich sur l'cran LCD.

Code-source 3.9
/**************************************************************************** REDACTION D'UN TEXTE A LECRAN LCD ================================== Un contrleur de texte LCD est reli un microcontrleur PIC dans le mode (4,5,3,2,1,0). Ce programme affiche les textes "AFFICHAGE" sur la 1 re ligne et display_LCD_4bit sur la 2me ligne d'cran LCD. Microcontrleur: 16F887 Oscillateur: HS, 10.0000 Mhz Compilateur: microC PRO v.1.56 Fichier: LCD.c Date: Juillet 2012 ***************************************************************************/ // Connections de LCD sbit sbit sbit sbit sbit sbit sbit sbit sbit sbit sbit sbit LCD_RS LCD_EN LCD_D4 LCD_D5 LCD_D6 LCD_D7 at at at at at at RB4_bit; RB5_bit; RB0_bit; RB1_bit; RB2_bit; RB3_bit; at at at at at at TRISB4_bit; TRISB5_bit; TRISB0_bit; TRISB1_bit; TRISB2_bit; TRISB3_bit;

LCD_RS_Direction LCD_EN_Direction LCD_D4_Direction LCD_D5_Direction LCD_D6_Direction LCD_D7_Direction

// Fin de connections

- 73 -

V.TOURTCHINE. Programmation en mikroC. Application pour les microcontrleurs de la famille PIC


void main() { TRISB = 0; PORTB = 0xFF; TRISB = 0xff; /* Configurer E/S du portB comme numriques*/ ANSELH = 0; ANSEL = 0; Lcd_Init(); // Initialiser LCD Lcd_Cmd(_LCD_CLEAR); // Effacer un texte sur lecrant LCD Lcd_Cmd(_LCD_CURSOR_OFF); // Curseur est en off Lcd_Out(1,2,"-- AFFICHAGE -- "); // Ecrire le texte sur la 1re ligne Lcd_Out(2,1,"display_LCD_4bit"); // Ecrire le texte sur la 2me ligne }

Fig. 3.2 Connexion du PIC avec LCD (pour la simulation dans le PROTEUS)

3.3.3 Bibliothque pour UART (ralisation Software) Lmetteur-rcepteur asynchrone universel (UART)
- 74 -

est un logiciel de bibliothque

V.TOURTCHINE. Programmation en mikroC. Application pour les microcontrleurs de la famille PIC

utilis pour le bus RS232 de la communication srie entre deux appareils lectroniques. Dans la communication de srie, seulement deux cbles (plus un cble de terre) sont ncessaires pour transfrer des donnes dans les deux sens. Les donnes sont envoys en format srie bit par bit. Normalement, le dispositif de rception est au repos. Pour lmission la patte TX est au niveau logique 1, galement connu sous le nom MARK. Transmission des donnes commence lorsque le niveau logique sur cette patte passe de 1 0, galement connu sous le nom ESPACE. Le premier bit envoy est le bit de dpart la logique 0. La suite de ce bit, 7 ou 8 bits de donnes sont envoys, suivie par un bit de parit en option. Le dernier bit envoy sappelle bit d'arrt est au niveau logique 1. Les donnes en srie est gnralement envoy sous forme de 10 bits : un bit de dpart, 8 bits de donnes, et un bit d'arrt, et aucun bits de parit.
La figure 3.3 montre comment le caractre A peut tre envoye en utilisant la communication srie. Caractre "A" a la configuration binaire ASCII est 01000001.
IDLE 1 1 STOP

0 START

Fig. 3.3 Envoi un caractre "A" par la communication srie Comme montre cette figure, le premier bit de dpart est envoy, cela est suivi par 8 bits de donnes 01000001, et enfin le bit d'arrt est envoy. Le rythme binaire est trs important dans la communication de srie, et la transmission (TX) et rception (Rx) dispositifs doivent avoir la mme rythme de bits. Le rythme binaire est mesur par la vitesse de transmission, qui spcifie le nombre de bits transmis ou reus par seconde. Les vitesses typiques de transmission sont : 4800, 9600, 19200, 38400, et ainsi de suite. Par exemple, lorsque exploitation 9600 bauds avec une taille d'image de 10 bits, 960 caractres sont transmis ou reus par seconde. La synchronisation entre les bits est alors d'environ 104ms. En RS232, base sur la communication en srie, les deux priphriques sont connects les uns aux autres (voir figure 3.4) en utilisant soit un connecteur 9 voies ou d'un connecteur 25 voies. Normalement, seul le Broches TX, RX et GND sont ncessaires pour la communication. Les pattes ncessaires pour deux types de connecteurs sont donnes dans le tableau 3.5.

Fig. 3.4 Les connecteurs RS232 Les niveaux de tension spcifis par le protocole RS232 sont 12V. Un signal logique HIGH (haut) est - 12V et un signal logique LOW (bas) est + 12V. Les microcontrleurs PIC, fonctionnent normalement des niveaux de tension : 0 et 5 V. Donc les signaux pour RS232 doivent tre convertie pour l'entre d'un microcontrleur. De mme, la sortie du microcontrleur - 75 -

V.TOURTCHINE. Programmation en mikroC. Application pour les microcontrleurs de la famille PIC doit tre convertie en 12V avant l'envoi au dispositif de rception RS232. La conversion de tension est gnralement ralise avec des circuits de conversion, comme le MAX232, fabriqu par Maxim Inc. La communication srie peut tre mis en uvre dans un matriel utilisant une patte spcifique d'un microcontrleur, ou les signaux ncessaires peuvent tre gnrs par le logiciel pour toute patte ncessaire dun microcontrleur. Mise en uvre matrielle ncessite soit une carte intrieure de circuit UART (ou USART) ou d'une carte UART extrieure connecte au microcontrleur.

Le mikroC PRO pour PIC fournit des routines pour la mise en uvre du logiciel de communication UART. Ces routines sont indpendantes du matriel et peut tre utilis avec n'importe quel microcontrleur. Le compilateur mikroC PRO prend en charge les fonctions du logiciel UART suivantes: Soft_UART_Init Soft_UART_Read Soft_UART_Write Soft_UART_Break

Soft_UART_Init
La fonction UART1_Init spcifie les paramtres de communication srie et le fait dans l'ordre suivant : port, rx patte, tx patte, vitesse de transmission, mode Ici : port est le port utilis comme UART logiciel (par exemple, PORTB) ; rx est le receveur dun nombre de transmission ; tx est lmmteur de transmission ; vitesse de transmission est le taux de transmission choisi, o la valeur maximale dpend de la frquence d'horloge du microcontrleur ; mode spcifie si les donnes devraient tre inverss ou non lors de la sortie. Un 0 indiquent quils ne devraient pas tre inverss, et un 1 indique qu'ils devraient tre inverss. Quand un RS232 est utilis donc dans ce cas le mode doit tre rgl 1. Soft_Uart_Init doit tre la premire fonction appele avant que le logiciel soit tabli. L'exemple suivant configure l'UART utiliser PORTC comme un port srie, avec RC6 pour la patte TX et RC7 pour la patte RX. La vitesse de transmission est fix 9600 avec le mode non inverss: - 76 -

V.TOURTCHINE. Programmation en mikroC. Application pour les microcontrleurs de la famille PIC Soft_Uart_Init (PORTB, 0, 1, 9600, 0); Soft_Uart_Read

La fonction Soft_Uart_Read reoit un octet partir d'une patte du port srie spcifi. La renvoie une condition d'erreur et les donnes sont lues partir du port srie. La fonction ne pas attendre que les donnes soient disponibles sur le port, et donc le paramtre d'erreur doit tre test si un octet est prvu. L'erreur est normalement de 1 et devient 0 quand un octet est lu partir du port. L'exemple suivant illustre la lecture d'un octet partir du port configur en srie en appelant la fonction Soft_Uart_Init. L'octet reu est stock dans une variable Temp: do Temp = Soft_Uart_Read(&Rx_Error); while (Rx_Error); Soft_Uart_Write La fonction Soft_Uart_Write transmet un octet une patte de port configur en srie. Les donnes envoyer doivent tre spcifis comme un paramtre dans l'appel de la fonction. Par exemple, pour envoyer un caractre "A" la patte de port srie : char MyData = A; Soft_Uart_Write(MyData); L'exercice suivant illustre l'utilisation des fonctions du logiciel UART.

Exercice 3.9 Le port srie d'un ordinateur (par exemple, COM1) est reli un microcontrleur PIC16F887, et logiciel d'mulation de terminal (par exemple, HyperTerminal) est exploit sur le PC pour utiliser un port srie. Pattes RC6 et RC7 du microcontrleur sont les broches TX et RX respectivement. Le dbit en bauds est de 9600. Ecrire un programme pour lire les donnes du terminal, puis les renvoyer vers le terminal. Par Un circuit intgr de conversion MAX232 est utilis pour convertir les signaux du microcontrleur des niveaux RS232. La figure 3.5 montre le schma du circuit de cet exercice.

Solution 3.9 Le circuit MAX232 reoit le signal TX de la patte RC6 du microcontrleur et le convertit en niveaux RS232. Les donnes sries reues du circuit MAX232 sont converties en niveaux de tension du microcontrleur, puis envoy la patte RC7. Noter que le fonctionnement correct du circuit MAX232 ncessite quatre condensateurs tre connect au circuit. - 77 -

V.TOURTCHINE. Programmation en mikroC. Application pour les microcontrleurs de la famille PIC Le programme requis est indiqu dans le code-source 3.10 (fichier SERIAL.C). Au dbut du programme, la fonction Soft_Uart_Init est appele pour configurer le port srie. Puis une boucle sans fin est forme en utilisant linstruction while(1). La fonction Soft_Uart_Read est appel lire un caractre partir du terminal. Aprs la lecture d'un caractre, il est renvoy la patte en appelant la fonction Soft_Uart_Write.

Fig. 3.5 Schma du circuit dexercice 3.9 (pour la simulation dans le PROTEUS)

3.3.4 Bibliothques standards ANSI C Les bibliothques standards ANSI C se compose des bibliothques suivantes (plus de dtails sur ces bibliothques sont disponibles dans le manuel de l'utilisateur mikroC): Ctype Math Stdlib String bibliothque bibliothque bibliothque bibliothque

Bibliothque Ctype

Les fonctions de la bibliothque Ctype sont principalement utilises pour la conversion des essais ou des donnes. Tableau 3.5 dresse la liste des fonctions les plus couramment utiliss dans cette bibliothque. Bibliothque Math

Les fonctions de la bibliothque Math sont utilises pour les oprations mathmatiques en - 78 -

V.TOURTCHINE. Programmation en mikroC. Application pour les microcontrleurs de la famille PIC virgule flottante. Le tableau 3.6 dresse la liste des fonctions les plus couramment utiliss dans cette bibliothque. Code-source 3.10
/*************************************************************** LECTURE ET CRITURE DE PORT SERIE ================================== Dans ce programme les pattes RC6 et RC7 du PORTC sont configurs comme srie TX et RX, respectivement. La vitesse de transmission est fixe 9600. Un caractre est reu partir du terminal, et ensuite il est renvoy vers le terminal. Microcontrleur: 16F887 Oscillateur: HS, 10.0000 Mhz Ficher: SERIAL_PORT.c Date: Juillet, 2012 ******************************************************************/ char error, byte_read; // Variables locales void main() { ANSEL = 0; ANSELH = 0; TRISC = 0x00; PORTC = 0;

// Configurer des pins AN en E/S numriques

// Configurer PORTC en sortie // No error

/* Initialiser Soft UART pour la vitesse de 9600 byts*/ error = Soft_UART_Init(&PORTC, 7, 6, 9600, 1); if (error > 0) { PORTC = error; while(1); } Delay_ms(100); while(1) {

// Signaler error dInitialisation // Stop programme

// Boucle sans fin

/* Lire octet, puis tester un drapeau d'erreur */ byte_read = Soft_UART_Read(&error); if (error) PORTC= error; else // Si l'erreur a t dtecte // Envouer Le signale derror sur le PORTC

/* Si l'erreur n'a pas t dtecte, l'octet lu est en retoure */ Soft_UART_Write(byte_read); } }

- 79 -

V.TOURTCHINE. Programmation en mikroC. Application pour les microcontrleurs de la famille PIC

Fonction
isalnum isalpha isntrl

Tableau 3.5 Fonctions de la bibliothque Ctype Description Retourne 1 si le caractre spcifi est alphanumrique (a - z, A - Z, 0 - 9) Retourne 1 si le caractre spcifi est alphabtique ( a - z, A - Z) Retourne 1 si le caractre spcifi est un caractre de contrle (dcimale 0- 31 et 127) Retourne 1 si le caractre spcifi est un chiffre (0 - 9) Retourne 1 si le caractre spcifi est en minuscules Retourne 1 si le caractre spcifi est imprimable (dcimal 32 - 126) Retourne 1 si le caractre spcifi est en majuscule Convertir un caractre en majuscules Convertir un caractre en minuscule

isdigit islower isprint isupper toupper tolower

Bibliothque Stdlib

La bibliothque stdlib contient des fonctions de bibliothque standard. Tableau 3.7 dresse la liste des fonctions les plus utilises dans cette bibliothque. Tableau 3.6 Fonctions de la bibliothque Math Description Retours en radians de l'arc cosinus de son paramtre Retours en radians de l'arc sinus de son paramtre Retours en radians de l'arc tangent de son paramtre Retours en radians de l'arc tangent de son paramtre o les signes des paramtres sont utiliss pour dterminer le quadrant du rsultat Retourne le cosinus de son paramtre en radians Renvoie le cosinus hyperbolique de son paramtre Renvoie la valeur exponentielle de son paramtre Retourne la valeur absolue de son paramtre Retourne le logarithme naturel de son paramtre Retourne le logarithme en base 10 de son paramtre Retourne la puissance d'un nombre Retourne le sinus de son paramtre en radians Retourne le sinus hyperbolique de son paramtre Retourne la racine carre de ses paramtre Retourne la tangente de son paramtre en radians Retourne la tangente hyperbolique de son paramtre en radians Tableau 3.7 Fonctions de la bibliothque Stdlib - 80 -

Fonction acos asin atan atan2 cos cosh exp fabs log Log10 pow sin sinh sqrt tan tanh

V.TOURTCHINE. Programmation en mikroC. Application pour les microcontrleurs de la famille PIC Fonction abs atof atoi atol max min rand Retourne la valeur absolue Convertit des caractres ASCII en nombre virgule flottante Convertit des caractres ASCII en nombre entier Convertit des caractres ASCII en entier long Retourne le plus grand des deux nombres entiers Retourne le plus petit de deux nombres entiers Retourne un nombre alatoire compris entre 0 et 32767; la fonction stand doit tre appele obtenir une squence diffrente de nombres Gnre une fonction rand donc une nouvelle squence de nombres est gnre Convertir chane d'entre constitu de chiffres hexadcimaux en entier Description

srand xtoi

Exemple 3.10 Ecrire un programme pour calculer le sinus des angles de 0 90 avec le pas de 1 et stocker le rsultat dans un tableau appel Trig_Sine.

Solution 3.10 Le programme requis est indiqu dans le code-source 3.11 (fichier SINE.C). Une boucle est cr en utilisant linstruction for, et l'intrieur de cette boucle le sinus d'angles sont calcules et stockes dans le tableau Trig_Sine. Notez que les angles doivent tre convertis en radians avant d'tre utilis dans les fonctions sin. Code-source 3.11
/************************************************************************** SINUS DES ANGLES DE 0 A 90 ============================= Ce programme calcule le sinus d'angles de 0 90. Les rsultats sont stocks dans un tableau appel Trig_Sine. Microcontrleur: 16F887 Oscillateur: HS, 10.0000 Mhz Compilateur: microC PRO v.1.56 Ficher: SINE.C Date: Juillet, 2012 **************************************************************************/ void main() { unsigned char j; double PI = 3.14159, rads; for(j = 0; j <= 90; j++) { rads = j*PI /180.0; angle = sin(rad); - 81 Trig_Sine[j] = angle; } }

V.TOURTCHINE. Programmation en mikroC. Application pour les microcontrleurs de la famille PIC Bibliothque String

La bibliothque des fonctions string est utilise pour effectuer la manipulation de chanes de caractres et de la mmoire oprations. Tableau 3.8 dresse la liste des fonctions les plus couramment utiliss dans cette bibliothque. Tableau 3.8 Fonctions de la bibliothque String Description Ajouter deux chanes Rechercher le premier caractre dans une chane Comparer deux chanes de caractres Copier une chane de caractres dans une autre Retourne la longueur d'une chane

Fonction strcat,strncat strchr, strpbrk strcmp, strncmp strcpy, strncpy strlen

Exemple 3.11 Ecrire un programme pour illustrer comment les deux chanes "MON PUISSANT et COMPUTER peuvent tre joints dans une nouvelle chane en utilisant les fonctions de la bibliothque string. Solution 3.11 Le programme requis est indiqu dans le code-source 3.12 (fichier JOIN.C). La mikroC bibliothque String de la fonction strcat est utilise pour joindre les deux chanes pointes par p1 et p2 dans une nouvelle chane stocke dans un tableau de caractres appele New_String. Code-source 3.12
/************************************************************************** ASSEMBLAGE DE DEUX LIGNES DE CARACTERES ================================= Ce programme montre comment deux chanes peuvent tre jointes pour obtenir une nouvelle chane de caractres. La fonction strcat est utilis pour joindre les deux chanes pointes par p1 et p2 dans une nouvelle chane stocke dans le tableau de caractres New_String. Microcontrleur: 16F887 Oscillateur: HS, 10.0000 Mhz Fichier: JOIN.C Date:Juillet, 2012 ************************************************************************/ void main() { const char *p1 = MON PUISSANT ; // Premire ligne const char *p2 = COMPUTEUR; // Deuxime ligne char New_String[80]; strcat(strcat(New_String, p1), p2); // Joindre les deux lignes - 82 }

V.TOURTCHINE. Programmation en mikroC. Application pour les microcontrleurs de la famille PIC 3.3.5 Divers bibliothques Les divers bibliothques se compose des bibliothques suivantes (plus de dtails sur ces bibliothques sont disponibles dans le manuel de l'utilisateur mikroC): Bibliothque de conversions Bibliothque de fonctions trigonomtriques Bibliothque de fonctions de sortie sprint Bibliothque de Setjmp Bibliothque pour travailler avec le temps Le tableau 3.9 dresse la liste des fonctions les plus couramment utiliss dans la bibliothque de conversions. Tableau 3.9 Fonction ByteToStr ShortToStr WordToStr IntToStr LongToStr FloatToStr Bcd2Dec Dec2Bcd Description Convertir un octet en chane Convertir en une chane courte Convertir un mot non sign en chane Convertir un nombre entier en chane Convertir en une longue chane Convertir un float en chane Convertir un nombre BCD en dcimal Convertir un nombre dcimal en BCD

- 83 -

V.TOURTCHINE. Programmation en mikroC. Application pour les microcontrleurs de la famille PIC

IV. EXEMPLES DE PROGRAMMATION EN mikroC POUR LES MICROCONTROLEURS DE LA FAMILLE PIC

Exemple 1. Chenille LEDs


Dans ce projet les huit LEDs sont connectes PORTC d'un microcontrleur. Lorsqu'une tension est applique au microcontrleur (ou est rinitialis), les LEDs s'allument en alternance. Il y a le dlai dune seconde de sorte quune LED peut tre vu tourner sur ON et OFF. Le schma de principe du projet est illustr la figure 4.1.

Fig.4.1. Schma de simulation pour lexemple 1 Le fichier dsign comme LED1.c et donn dans le code-source 4.1.

- 84 -

V.TOURTCHINE. Programmation en mikroC. Application pour les microcontrleurs de la famille PIC Code-source 4.1
/**************************************************************************** Chenille LEDs =============== Les huit LEDs sont connectes PORTC du microcontrleur 18f452. Lorsqu'une tension est applique au microcontrleur (ou est rinitialis), les LEDs s'allument en alternance. Microcontrleur: 18F452 Oscillateur : HS, 4.0000 Mhz Fichier: LED1.c Date: Juillet 2012 ***************************************************************************/ void main() { unsigned char J = 1; TRISC = 0; // PORTC est configure en sortie for(;;) // Boucle sans fin { PORTC = J; // Envoyer J au PORTC Delay_ms(100); // Pause 100 ms J = J << 1; // Dcalage gauche J if(J == 0) J = 1; // Si la dernire LED, allumer la 1re LED } }

Exemple 2. Clignotement des LEDs deux faons diffrentes


On propose de faire clignoter LEDs branches au port B dun microcontrleur (fig. 4.2) de deux faons diffrentes : 1. Ds que le microcontrleur est activ, tous les LEDs clignotent avec une priode dune seconde (voire la figure ci-dessous). Et a doit rpter 10 fois.

2. Aprs cela, les LEDs doivent clignoter chaque 500 ms infiniment comme indiqu dans la figure ci-dessous.

Le fichier nomm LED2.C qui ralise ce projet est reprsent dans le code-source 4.2

- 85 -

V.TOURTCHINE. Programmation en mikroC. Application pour les microcontrleurs de la famille PIC

Fig.4.2. Schma de simulation pour lexemple 2

Code-source 4.2
/**************************************************************************** LEDs clignotantes diffremment =============================== Les huit LEDs sont connectes PORTB du microcontrleur 16f887. Lorsqu'une tension est applique au microcontrleur (ou est rinitialis), les LEDs s'allument en alternance en deux faon diffrente. Microcontrleur: 16F887 Oscillateur : HS, 10.0000 Mhz Fichier: LED2.c Date: Juillet 2012 ***************************************************************************/ void main() { ANSEL = 0; ANSELH = 0; PORTB = 0xFF; TRISB= 0; Delay_ms(500); PORTB = 0; for(k=1; k<20; k++) { switch(PORTB) { case 0x00: PORTB = 0xFF; Delay_ms(500); break; case 0xFF: PORTB = 0x00;

- 86 -

V.TOURTCHINE. Programmation en mikroC. Application pour les microcontrleurs de la famille PIC


Delay_ms(500); } } PORTB=0b01010101; while(1) { PORTB= ~PORTB; Delay_ms(500); } }

Exemple 3. RELAI
Dans ce projet la minuterie, sur la base de registre TMR0, est utilise comme un compteur. L'entre de comptage est relie un bouton-poussoir Input (fig. 4.3) de sorte que toute pression sur Input provoque TMR0 compter une impulsion. Lorsque le nombre d'impulsions correspond au nombre stock dans le registre nomm TEST, la valeur logique 1 (5V) apparat sur le pin3 de PORTD. Cette tension active un relais lectromcanique, et ce bit est appel RELAI dans le programme (voire le fichier RELAI.C de code-source 4.3). Dans le registre de TEST est stock un nombre de 5 pour cet exemple. Bien sr, il peut tre n'importe quel nombre dfini comme une constante. Par ailleurs, le microcontrleur peut activer un autre appareil au lieu de relais, tandis que le capteur peut tre utilis la place du boutonpoussoir. Cet exemple illustre l'une des applications les plus courantes du microcontrleur dans l'industrie; quand quelque chose est effectu autant de fois que ncessaire, puis quelque chose d'autre doit tre activ ou dsactiv ....

Fig.4.3. Schma de simulation pour lexemple 3

- 87 -

V.TOURTCHINE. Programmation en mikroC. Application pour les microcontrleurs de la famille PIC Code-source 4.3
/**************************************************************************** RELAI ======= Dans ce projet la minuterie, sur la base de registre TMR0, est utilise comme un compteur. L'entre de comptage est relie un bouton-poussoir Input de sorte que toute pression sur Input provoque TMR0 compter une impulsion. Lorsque le nombre d'impulsions correspond au nombre stock dans le registre nomm TEST, la valeur logique 1 (5V) apparat sur le pin3 de PORTD. Cette tension active un relais lectromcanique RELAI. Microcontrleur: 16F887 Oscillateur : HS, 10.0000 Mhz Fichier: RELAI.c Date: Juillet 2012

***********************************************************************************/
void main() { char TEST = 5; enum sortie {RELAI = 3}; ANSEL = 0; ANSELH = 0; PORTA = 0; TRISA = 0xFF; PORTD = 0; TRISD = 0b11110111; OPTION_REG.F5 = 1; OPTION_REG.F3 = 1; TMR0 = 0; do { if (TMR0 == TEST) (PORTD.RELAI = 1); } while (1); } // Constante TEST = 5 // Constante RELAI = 3 // Les E/S sont configures en numriques // // // // Initialisation du porte A Porte A est configur en entr Initialisation du PORTD Broche 3 du PORTD3 est configur en sortie

/* Conteur TMR0 reoit des impulsions par la broche RA4 * / // Taux de prdiviseur est de 1:1 // Initialisation du compteur TMR0

/* Est-ce que le nombre dimpulsion TMRO est gale constante TEST? */ /* Nombre est gale TEST. La broche RD3 est en 1(RELAIS est activ) */ // Restez dans la boucle sans fin

Une selle constante numre RELAI est utilise dans cet exemple. Il est attribu un valeur lorsquelle est dclare :
enum sortie {RELAI = 3};

Si plusieurs broches du PORTD sont relies des RELAIS, lexpression ci-dessus pourrait tre crite comme suit :
enum sortie {RELAI=3, CHAFFAGE, ECLAIRAGE =6, POMPE} ;

Toutes les constantes, aprs celle avec les valeurs affectes (RELAI = 3 et ECLARAGE = 6), sont des valeurs automatiquement incrment de 1 par rapport la valeur prcdente. Dans ce cas, la constante CHAUFFAGE et celle POMPE seront affects les valeurs 4 et 7 respectivement
(CHAUFFAGE = 4 et POMPE = 7).

- 88 -

V.TOURTCHINE. Programmation en mikroC. Application pour les microcontrleurs de la famille PIC

Exemple 4. Registres TMR0 et TMR1 comme minuteries


Dans l'exemple prcdent, le microcontrleur ne fait rien entre des impulsions de comptage en utilisant des boucles sans fin. Ces dchets du temps est un luxe inadmissible et par consquent une autre mthode doit tre applique. Considrons le schma microcontrleur 16F887 de la figure 4.1 qui sera toujours le mme pour raliser les nouvelles fonctions. Le fichier INTERRUP_TMR0.C du code-source 4.4 montre lutilisation du registre TMRO avec prdiviseur pour gnrer une interruption. Une fois que le registre TMR0 est trop-plein le routin dinterruption incrmente automatiquement la variable cnt par 1. Lorsque sa valeur atteint 400, le PORTB est incrment de 1. L'ensemble de la procdure est masqu, qui permet au microcontrleur de faire autre chose. Code-source 4.4
/*************************************************************************** TMR0 ======= Une fois que le registre TMR0 est trop-plein le routin dinterruption incrmente automatiquement la variable cnt par 1. Lorsque sa valeur atteint 400, le PORTB est incrment de 1. L'ensemble de la procdure est masqu, qui permet au microcontrleur de faire autre chose. Microcontrleur: 16F887 Oscillateur : HS, 10.0000 Mhz Fichier: INTERRUP_TMR0.c Date: Juillet 2012 ***************************************************************************/ unsigned cnt; // Dfinir la variable cnt void interrupt() { cnt++; /* Interruption cause lincrmentation par 1 de la variable cnt*/ TMR0 = 100; INTCON = 0x20; } void main() { OPTION_REG = 0x84; ANSEL = 0; ANSELH = 0; TRISB = 0; PORTB = 0x0; TMR0 = 100; INTCON = 0xA0; cnt = 0; do { if (cnt == 400) { PORTB = PORTB++; cnt = 0; } } while(1); } // Valeur initiale du TMR0 // Bit T0IE est positionn 1, bit T0IF est en 0

// Prdiviseur pour TMR0 // Toutes les broches E/S sont configur en digitale // // // // // PORTB est configur en sortie Initialisation du PORTB TMR0 conte de 100 255 Interruption par TMR0 est autoriss Variable cnt est initialise 0

// Boucle sans fin // Incrmenter port B aprs 400 interruptions // Incrmenter PORTB par 1 // Initialiser la variable cnt

- 89 -

V.TOURTCHINE. Programmation en mikroC. Application pour les microcontrleurs de la famille PIC On voie que lInterruption se produit sur chaque dbordement du registre TMR0. Le nombre dinterruption 400, dans cet exemple, provoque lincrmentation du PORTB comme indique la figure ci-dessous.

Dans le code-source 4.5 (fichier INTERRUP_TMR1) on utilise linterruption produit par le dbordement de registre TMR1(TMR1H, TMR1L). Aprs 76 dinterruption se produit lvolution sur le PORTB comme indique la figure ci-dessous.

Code-source 4.5
/**************************************************************************** TMR1 ======= Une fois que le registre TMR1 est trop-plein la routine dinterruption incrmente automatiquement par 1 la variable cnt. Lorsque sa valeur atteint 76, les bits du PORTB sont inverss. Microcontrleur: 16F887 Oscillateur : HS, 10.0000 Mhz Fichier: INTERRUP_TMR1.c Date: Juillet 2012 ****************************************************************************/ unsigned short cnt; // Dfinir la variable cnt void interrupt() { cnt++ ; /* Interruption cause lincrmentation par 1 de la variable cnt*/ PIR1.TMR1IF = 0; // Remise 0 bit TMR1IF TMR1H = 0x80; TMR1L = 0x00; // Valeurs initiales du TMR1H and TMR1L } void main() { ANSEL = 0; // Broches E/S sont configur en numriques ANSELH = 0; PORTB = 0xF0; // Initialisation de PORTB TRISB = 0; // PORTB est configur en sortie T1CON = 1; // Remise 1 du TMR1 PIR1.TMR1IF = 0; // Remise 0 du TMR1IF TMR1H = 0x80; // Initialisation du TMR1 TMR1L = 0x00; PIE1.TMR1IE = 1; /* Activer linterruption en cas de dbordement du TMR1*/ cnt = 0; // Remis 0 la variable cnt INTCON = 0xC0; // Activer interruption (bits GIE et PEIE) do { // Boucle sans fin

- 90 -

V.TOURTCHINE. Programmation en mikroC. Application pour les microcontrleurs de la famille PIC


if (cnt == 76) { PORTB = ~PORTB;

/* Bits du PORTB sont inverss aprs 76 dinterruptions*/ // Initialisation de la variable cnt

cnt = 0; } } while (1); }

Exemple 5. Module CCP1 comme gnrateur du signal PWM


Cet exemple illustre l'utilisation de module CCP1 en mode PWM. Pour rendre les choses plus intressantes, la dure dimpulsions la sortie P1A/CCP1 (PORTC, 2) peut tre change avec les touches symboliquement marqus comme "BRILLANT" et "NOIR", tandis que la dure est considre comme la combinaison binaire sur le port B (fig.4.4). Remarque dauteur : La diode D1 dans le schma de simulation dans le PROTEUS (fig. 4.4) signale que le module CCP1 est activ. Dans le montage rel son tat corresponde ltat de la diode D2 pendant la simulation. Le fonctionnement de ce module est sous le contrle des fonctions appartenant la bibliothque spcialise PWM. Trois d'entre eux sont utiliss ici : PWM1_init a le prototype : void Pwm1_Init( long freq) ; Paramtre Freq dtermine la frquence du signal PWM exprime en Hz. Dans cet exemple, elle est gale 5 kHz. PWM1_Start a le prototype : void Pwm1_Start( void ) ; PWM1_Set_Duty a le prototype: void Pwm1_Set_Duty( unsigned short duty_ratio); Duty_ratio paramtre dfinit la dure d'impulsion dans la squence d'impulsions. Afin de rendre cet exemple fonctionne correctement, il est ncessaire de cocher les bibliothques suivantes dans le gestionnaire de bibliothque avant de compiler: PWM Bouton Le programme de ce projet est donn dans le code-source 4.6 (fichier : SIGNAL_PWM.C).

Avant de compiler le fichier, SIGNAL_PWM.c, il est ncessaire de cocher PWM dans le gestionnaire de bibliothque du compilateur mikroC PRO.

- 91 -

V.TOURTCHINE. Programmation en mikroC. Application pour les microcontrleurs de la famille PIC

Fig.4.4. Schma de simulation de lexemple 5. Code-source 4.6


/**************************************************************************** Module CCP1 comme gnrateur du signal PWM ==========================================

Cet exemple illustre l'utilisation de module CCP1 en mode PWM. La dure dimpulsions la sortie P1A/CCP1 (PORTC, 2) peut tre change avec les touches symboliquement marqus comme "BRILLANT" et "NOIR", tandis que la dure est considre comme la combinaison binaire sur le PORTB.
Microcontrleur: 16F887 Oscillateur : HS, 8.0000 Mhz Fichier: SIGNAL_PWM.c Date: Juillet 2012 ****************************************************************************/ unsigned short current_duty, old_duty; /* Dfinition des variables current_duty and old_duty*/ void initMain() { ANSEL = 0; // Toutes les E/S sont numriques ANSELH = 0; PORTA = 0x00; // Initialisation du PORTA TRISA = 0xFF; // PORTA est configur en entre PORTB = 0; // Initialisation du PORTB TRISB = 0; // PORTB est configur en sortie PORTC = 0; // Initialisation du PORTC TRISC = 0xFF; // PORTC est configur en entr

- 92 -

V.TOURTCHINE. Programmation en mikroC. Application pour les microcontrleurs de la famille PIC

CCP1CON =0b00111110;

/* Uniquement pour la simulation. Enlever cette instruction avant de programmer le microcontrleur*/ // Initialisation du module PWM (5KHz)

PWM1_Init(5000); } void main() { initMain(); current_duty = 155; old_duty = 0; PWM1_Start(); while (1) { if (Button(&PORTA, 0,1,0)) current_duty++ ; if (Button(&PORTA, 1,1,0)) current_duty-- ; if (old_duty != current_duty) { PWM1_Set_Duty(current_duty); old_duty = current_duty; PORTB = old_duty; } Delay_ms(150); } }

// Programme principal

/* Valeur initiale de variable current_duty*/ // RAZ de variable old_duty // Start du module PWM1 // Boucle sans fin /* Si le bouton connect press*/ // incrmenter la valeur /* Si le bouton connect press*/ // dcrmenter la valeur

RA0 est de current_duty RA1 est de current_duty

/* Si les variables current_duty et old_duty ne sont pas gales*/ // Charger PWM la nouvelle valeur /* Sauvegarder la nouvelle valeur et l'afficher sur le PORTB*/ // Retardement de 150ms

Exemple 6. Convertisseur A/D


Dans ce projet un signal analogique variable est appliqu la broche AN2 de microcontrleur 16F887, tandis que le rsultat de conversion de 10 bits est localise sur les ports B et D (8 LSB sur le PORTD et 2 MSB sur le PORTB). GND est utilis comme rfrence de tension ngative Vref-. Le convertisseur A / D gnre toujours un rsultat binaire de 10 bits, ce qui signifie qu'il dtecte au total de 1024 niveaux de tension et donc il est capable de dtecter de lgres modifications de la tension. Le fichier CONVERT_A/D.C est donn dans le codesource 4.7 et le schma de simulation du projet est reprsent sur la figure 4.5. Avant de compiler le fichier CONVERT_A/D.c, il est ncessaire de cocher ADC dans le gestionnaire de bibliothque du compilateur mikroC PRO.

- 93 -

V.TOURTCHINE. Programmation en mikroC. Application pour les microcontrleurs de la famille PIC Code-source 4.7
/**************************************************************************** CONVERTISSEUR A/D =================== Un signal analogique variable est appliqu la broche AN2 du microcontrleur 16F887, tandis que le rsultat de conversion de 10 bits est localise dans les PORTB et PORTD (8 LSB dans le PORTD et 2 MSB dans le PORTB). GND est utilis comme rfrence de tension ngative Vref-. Microcontrleur: 16F887 Oscillateur : HS, 8.0000 Mhz Fichier: CONVERT_A/D.c Date: Juillet 2012 ****************************************************************************/ unsigned int temp_res; void main() { ADCON1 = 0x80; ANSEL = 0x0C; TRISA = 0xFF; ANSELH = 0;

// Configurer Vref /* Configurer la broche AN2 du PORTA en analogique */ // PORTA est configur en entre /* Configurer les autres broches du PORTA en numrique */ /* Broches de RB7, RB6 du PORTB sont en sortie */ // PORTD est configur en sortie

TRISB TRISD

= 0x3F; = 0;

do { temp_res = ADC_Read(2);

/* Rsultat de la conversion A / D est copi dans temp_res */ // Envoyer 8 bits LSB au PORTD /* 2 bits MSB sont dplacs vers les broches RB7, RB6 du PORTB */ // Boucle sans fin

PORTD = temp_res; PORTB = Une temp_res >> 2; } while(1); }

Exemple 7. Mmoire EEPROM


Dans cet exemple le registre du PORTB est incrment en permanence. Au moment de l'appui sur le bouton appel MEMO_EEPROM, un nombre binaire du PORTB sera sauvegard dans la mmoire EEPROM. Ce nombre doit tre directement lu de lEEPROM et ensuite affich sur PORTD sous forme binaire. Le fichier EEPROM.c est donn dans le code-source 4.8. Avant de compilation le fichier EEPROM.c , il est ncessaire de cocher EEPROM dans le gestionnaire de bibliothque du compilateur mikroC PRO. Le schma de simulation est reprsent sur la figure 4.6. Afin de vrifier la simulation de circuit de la figure 4.5, il suffit d'appuyer sur la touche MEMO_EEPROM et teindre la simulation. Aprs le redmarrage de la simulation, le programme affichera la valeur enregistre sur le port D. Rappelez-vous quau moment de l'criture, cette valeur a t affich sur le port B. - 94 -

V.TOURTCHINE. Programmation en mikroC. Application pour les microcontrleurs de la famille PIC

Fig. 4.5. Schma de simulation pour lexemple 6

Code-source 4.8
/**************************************************************************** Mmoire EEPROM =================== Le registre du PORTB est incrment en permanence. Au moment de l'appui sur le bouton appel MEMO_EEPROM, un nombre binaire du PORTB sera sauvegard dans la mmoire EEPROM. Ce nombre doit tre directement lu de lEEPROM et ensuite affich sur PORTD sous forme binaire. Microcontrleur: 16F887 Oscillateur : HS, 8.0000 Mhz Fichier: EEPROM.c Date: Juillet 2012 ****************************************************************************/ void main() { ANSEL = 0; //Toutes les E/S sont configurs en numriques ANSELH = 0; PORTB = 0; // Initialisation du PORTB TRISB = 0; // PORTB est configur en sortie PORTD = 0; // Initialisation du PORTD TRISD = 0; TRISA = 0xFF; PORTD = EEPROM_Read(5); do { PORTB=PORTB++; // PORTD est configur en sortie // PORTA est configur en entre // Lecture dEEPROM ladresse 5

// Incrmenter par 1 du registre de PORTB

- 95 -

V.TOURTCHINE. Programmation en mikroC. Application pour les microcontrleurs de la famille PIC


Delay_ms(100); if (PORTA.F2 == 0) { EEPROM_Write(5,PORTB); PORTD = EEPROM_Read(5); do; while (PORTA.F2 ==0); } } while(1); } // Retardement de 100mS // Le bouton MEMO_EEPROM est press ? /* Oui, sauvegarder des donnes dans EEPROM ladresse 5 */ // Lecture des donnes crites dans EEPROM /* Rester dans ce boucle aussi longtemps que le bouton MEMO_EEPROM est press */

// Boucle sans fin

Fig. 4.6. Schma de simulation de lexemple 7

Exemple 8. Affichage multiplex pour deux afficheurs 7 segments LEDs


Dans ce projet de deux afficheurs 7 segments LEDs (cathode commune) sont connectes PORTC d'un microcontrleur. La cathode de chiffre 1 (chiffre de gauche) est connect au PORTB (broche RB0) et la cathode de chiffre 2 (chiffre de droite) est connect au PORTB (broche RB1) du microcontrleur. - 96 -

V.TOURTCHINE. Programmation en mikroC. Application pour les microcontrleurs de la famille PIC Le programme compte de 0 99 avec un retard dune seconde entre chaque comptage. L'affichage est multiplex et est assur par une routine d'interruption toutes les 5 ms. Le schma de simulation pour cet exemple est donn par la figure 4.7. Le programme du projet (fichier : AFFICH_MULTIPLEX.c) est reprsent dans le code-source 4.9.

Fig.4.7. Schma de simulation de lexemple 8 Code-source 4.9


/**************************************************************************** AFFICHAGE MULTIPLEXE ===================== Deux afficheurs 7 segments LEDs (cathode commune) sont connectes PORTC d'un microcontrleur. La cathode de chiffre 1 (chiffre de gauche) est connect au PORTB (broche RB0) et la cathode de chiffre 2 (chiffre de droite) est connect au PORTB (broche RB1) du microcontrleur. Le programme compte de 0 99 avec un retard dune second entre chaque comptage. L'affichage est multiplex par une routine d'interruption toutes les 5 ms. Microcontrleur: 18F452 Oscillateur : HS, 4.0000 Mhz Fichier: AFFICH_MULTIPLEXE.c Date: Juillet 2012 ****************************************************************************/ #define DIGIT1 PORTB.F0

- 97 -

V.TOURTCHINE. Programmation en mikroC. Application pour les microcontrleurs de la famille PIC


#define DIGIT2 PORTB.F1 unsigned char Cnt = 0; unsigned char Flag = 0; // /* Cette fonction retrouve la configuration de bits envoyer au port pour afficher un numro sur la LED 7 segments. Le numro est pass dans la liste des arguments de la fonction */ // unsigned char Display(unsigned char no) { unsigned char Pattern; unsigned char SEGMENT[] = {0x3F,0x06,0x5B,0x4F,0x66,0x6D, 0x7D,0x07,0x7F,0x6F}; Pattern = SEGMENT[no]; return (Pattern); } // /* Routine de service d'interruption timer TMR0 . Les sauts de programme la chaque 5ms.*/ void interrupt () { unsigned char Msd, Lsd; TMR0L = 100; // Charger TMR0 INTCON = 0x20; // Set du drapeau T0IF et effac T0IE Flag = ~ Flag; // Inverser le drapeau Flag if(Flag == 0) // 1r chiffre { DIGIT2 = 0; Msd = Cnt / 10; // Bit MSD if(Msd != 0) { PORTC = Display(Msd); // Envoyer au PORTC DIGIT1 = 1; // Activer le chiffre 1 } } else { // 2m chiffre DIGIT1 = 0; // Dsactiver le chiffre 1 Lsd = Cnt % 10; // Bit LSD PORTC = Display(Lsd); // Envoyer au PORTC DIGIT2 = 1; // Activer le chiffre 2 } } // /* Dbut du programme principal. Configurer PORTB et PORTC en sorties. Configurer l'interruption de TMR0 toutes les 10ms */ void main() { TRISC = 0; // PORTC est en sortie TRISB = 0; // RB0, RB1 est en sortie DIGIT1 = 0; // Dsactiver le chiffre 1 DIGIT2 = 0; // Dsactiver le chiffre 2 // // Configure linterruption du timer TMR0 // T0CON = 0xC4; // Prediviseur = 32 TMR0L = 100; // Charger TMR0 avec 100 INTCON = 0xA0; // Activer linterruption du TMR0

- 98 -

V.TOURTCHINE. Programmation en mikroC. Application pour les microcontrleurs de la famille PIC

Delay_ms(1000); for(;;) { Cnt++; if(Cnt == 100) Cnt = 0; Delay_ms(1000); } }

// Boucle sans fin // Incrmentation de Cnt // Comptage de 0 99 // Attendre 1 seconde

Exemple 9. Multimtre avec lafficheur LCD


Cet exemple illustre l'utilisation d'un cran LCD alphanumrique. Un message crit en deux lignes apparat sur l'afficheur : Multimtre - Mesure de Deux secondes plus tard, le message dans la seconde ligne est modifi et affiche tension prsent sur l'entre (la broche RA2) de convertisseur A / D. Multimetre Tension: Dans le dispositif vrai, le courant ou une autre valeur mesure peut tre affiche la place de la tension. Le schma de simulation de cet exemple est donn par la figure 4.8. Le fichier MULTIMETRE_LCD.c est donn dans le code-source 4.10.

Fig.4.8. Schma de simulation de lexemple 9. - 99 -

V.TOURTCHINE. Programmation en mikroC. Application pour les microcontrleurs de la famille PIC Avant de compiler le fichier MULTIMETRE_LCD.c, il est ncessaire de cocher Lcd dans le gestionnaire de bibliothque du compilateur mikroC PRO.

Code-source 4.10
/**************************************************************************** MULTIMETRE AVEC LAFFICHEUR LCD ================================ Ce projet illustre l'utilisation d'un cran LCD alphanumrique. Un message crit en deux lignes apparat sur l'afficheur LCD : Multimtre - Mesure de Deux secondes plus tard, le message dans la seconde ligne est modifi et affiche tension prsent sur l'entre (broche RA2) de convertisseur A / D : Multimetre Tension: Microcontrleur: 16F887 Oscillateur : HS, 10.0000 Mhz Fichier: MULTIMETRE_LCD.c Date: Juillet 2012 ****************************************************************************/ // Connections du module LCD sbit sbit sbit sbit sbit sbit sbit sbit sbit sbit sbit sbit LCD_RS at RB4_bit; LCD_EN at RB5_bit; LCD_D4 at RB0_bit; LCD_D5 at RB1_bit; LCD_D6 at RB2_bit; LCD_D7 at RB3_bit; LCD_RS_Direction at LCD_EN_Direction at LCD_D4_Direction at LCD_D5_Direction at LCD_D6_Direction at LCD_D7_Direction at

TRISB4_bit; TRISB5_bit; TRISB0_bit; TRISB1_bit; TRISB2_bit; TRISB3_bit;

// Fin des connexions du module LCD unsigned char ch; unsigned int adc_rd; char *text; long tlong; void main() { INTCON = 0; ANSEL = 0x04; TRISA = 0x04; ANSELH = 0; Lcd_Init(); Lcd_Cmd(_LCD_CURSOR_OFF); Lcd_Cmd(_LCD_CLEAR); text = "Multimetre"; Lcd_Out(1,1,text); text = "- Mesure de - "; Lcd_Out(2,1,text);

// Dclarer les variables

/* Toutes les interruptions sont dsactives */ /* Broche RA2 est configure comme une entre analogique */ /* Reste de broches sont configures comme numriques */ // Initialisation daffichesur LCD // Commande LCD (curseur OFF) // Commande LCD (effacer lcran LCD) // Dfinir le premier message /* Ecrire le premier message dans la premire ligne // Dfinir le deuxime message // Ecrire le deuxime message dans la deuxime ligne

- 100 -

V.TOURTCHINE. Programmation en mikroC. Application pour les microcontrleurs de la famille PIC


ADCON1 = 0x82; TRISA = 0xFF; Delay_ms(2000); text = "Tension:"; // Une tension de rfrence A/D est GRD

/* Toutes les broches du PORTA sont configures en entres */ // Dfinir le troisime message

while (1) { adc_rd = ADC_Read(2); // Conversion A / D. Pin RA2 est une entre. Lcd_Out(2,1,text); // Ecrire rsultat dans la deuxime ligne tlong = (long)adc_rd * 5000;// Convertir le rsultat en millivolts tlong = tlong / 1023; // 0 .. 1023 -> 0-5000mV ch = tlong / 1000; /* Extrait volts (en milliers de millivolts) partir du rsultat */ Lcd_Chr(2,9,48+ch); // Ecrire le rsultat en format ASCII Lcd_Chr_CP('.'); ch = (tlong / 100) % 10; // Extrait des centaines de millivolts Lcd_Chr_CP(48+ch); // Ecrire le rsultat en format ASCII ch = (tlong / 10) % 10; // Extrait des dizaines de millivolts Lcd_Chr_CP(48+ch); // Ecrire le rsultat en format ASCII ch = tlong % 10; // Extrait chiffres pour millivolts Lcd_Chr_CP(48+ch); // Ecrire le rsultat en format ASCII Lcd_Chr_CP('V'); Delay_ms(1); } }

Exemple 10. Communication srie RS232


Cet exemple illustre l'utilisation du module UART du microcontrleur. La connexion un PC est possible grce la norme RS232. Le programme fonctionne de la manire suivante. Chaque octet envoy et reu via la communication srie est affich sur lcran dordinateur (voire la figure ci-dessous).

- 101 -

V.TOURTCHINE. Programmation en mikroC. Application pour les microcontrleurs de la famille PIC Une des faons de simuler le fonctionnement de cette instalation consiste en lutilisation d'un programme reprsent dans le fichier COMMUNIC_RS232.c du code-source 4.11. Cet exemple illustre l'utilisation de la fonction Software_UART de bibliothque du compilateur mikroC PRO. Dans le schma de simulation donn par la figure 4.9, la visualisation de chaque octet envoy et reu via la communication srie est affiche l'aide d'un programme standard de PROTEUS appel VIRTUAL TERMINAL. Avant de compiler le fichier COMMUNIC_RS232.c, il est ncessaire de cocher Software_UART dans le gestionnaire de bibliothque du compilateur mikroC PRO.

Code-source 4.11
/**************************************************************************** COMMUNICATION SERIE RS232 ========================== Cet exemple illustre l'utilisation de fonction Software_UART de la bibliothque du compilateur mikroC PRO. Microcontrleur: 16F887 Oscillateur : HS, 10.0000 Mhz Fichier: COMMUNIC_RS232.c Date: Juillet 2012 ****************************************************************************/ char error, byte_read; // Variables auxiliaires void main() { ANSEL = 0; ANSELH = 0; TRISC = 0x00; PORTC = 0;

// Configuration E/S en numrique /* Configurer PORTB en sortie (signalisation derreur)*/ // Pas derreur

// Initialiser Soft_UART en 9600 bods error = Soft_UART_Init(&PORTC, 7, 6, 9600, 1); if (error > 0) { PORTC = error; // Initialisation derreur while(1); // Stop programme } while(1) { // Boucle sans fin // Lire octet, puis tester drapeau d'erreur byte_read = Soft_UART_Read(&error); if (error) // Si l'erreur a t dtecte PORTC= error; // signale error sur le PORTB else Soft_ UART_Write (byte_read) ; /* Si lerrur na pas t dtecte, loctet lu en retour */ } }

- 102 -

V.TOURTCHINE. Programmation en mikroC. Application pour les microcontrleurs de la famille PIC

Fig.4.9. Schma de simulation de lexemple 10

Exemple 11. Mesure de la temprature l'aide du capteur DS1822. L'utilisation de protocole de '1-Wire
Mesure de la temprature est l'une des tches les plus courantes effectues par le microcontrleur. Un capteur DS1822 est utilis pour la mesure. Il est capable de mesurer la temprature dans la plage de -55 C +125 C avec la prcision 0,5 C. Pour le but de transfrer des donnes vers le microcontrleur, un type particulier de communication srie appel 1-Wire (1-fil) est utilise (voire la figure ci-dessous).

- 103 -

V.TOURTCHINE. Programmation en mikroC. Application pour les microcontrleurs de la famille PIC En raison d'une utilisation simple de ces capteurs, les commandes utilises pour excuter et contrler sont stockes sous la forme de fonctions dans la bibliothque One_Wire du compilateur mikroC PRO. Il y a trois fonctions au total:

Ow_Reset est utilis pour rinitialiser du capteur; Ow_Read est utilis pour recevoir des donnes provenant du capteur, et Ow_Write est utilis pour envoyer des commandes au capteur.

Le fichier TEMPERATURE_One_Wire est reprsent dans le code source 4.12 et le schma de simulation est donn par la figure 4.10 Avant de compiler le fichier TEMPERATURE_One_Wire.c, il est ncessaire de cocher les fonctions One_Wire et Lcd dans le gestionnaire de bibliothque du compilateur mikroC PRO.

Code-source 4.12
/**************************************************************************** Mesure de la temprature l'aide du capteur DS1822. L'utilisation de protocole de '1-Wire ==================================================== Un capteur DS1822 est utilis pour la mesure. Il est capable de mesurer la temprature dans la plage de -55 C +125 C avec la prcision 0,5 C. Pour le but de transfrer des donnes vers le microcontrleur, un type particulier de communication srie appel 1-Wire (1-fil) est utilise Microcontrleur: 16F887 Oscillateur : HS, 10.0000 Mhz Fichier: TEMPERATURE_One_Wire.c Date: Juillet 2012 ****************************************************************************/ // Configuration des connections d'afficheur LCD avec PIC sbit LCD_RS at RB0_bit; sbit LCD_EN at RB1_bit; sbit LCD_D4 at RB4_bit; sbit LCD_D5 at RB5_bit; sbit LCD_D6 at RB6_bit; sbit LCD_D7 at RB7_bit; sbit sbit sbit sbit sbit sbit LCD_RS_Direction LCD_EN_Direction LCD_D4_Direction LCD_D5_Direction LCD_D6_Direction LCD_D7_Direction at at at at at at TRISB0_bit; TRISB1_bit; TRISB4_bit; TRISB5_bit; TRISB6_bit; TRISB7_bit;

// Fin de configuration /* Configurer TEMP_RESOLUTION la rsolution correspondante du capteur utilis DS1822: 12 (rglage par dfaut peut tre : 9,10,11 ou 12)*/ const unsigned short TEMP_RESOLUTION = 12; char *text = "000.0000"; unsigned temp ; void Display_Temperature(unsigned int temp2write ) { const unsigned short RES_SHIFT = TEMP_RESOLUTION - 8; char temp_whole;

- 104 -

V.TOURTCHINE. Programmation en mikroC. Application pour les microcontrleurs de la famille PIC


unsigned int temp_fraction; Lcd_Chr(2,4,'+'); if (temp2write & 0x8000) { Lcd_Chr(2,4,'-'); temp2write = ~temp2write + 1; } // Extraire de la partie entire (temp_whole) de temprature temp_whole = temp2write >> RES_SHIFT; text[0] = '0'; // Conversion temp_whole en caractres if (temp_whole/100) text[0] = temp_whole/100 + 48; // Extrait d'un chiffre des centaines else text[0] = '0'; text[1] = (temp_whole/10)%10 + 48; // Extrait d'un chiffre des dizaines text[2] = temp_whole%10 + 48; // Extrait d'un chiffre des units /* Extraire de la partie fractionnaire (temp_fraction) de tempe'ratureand et convertion en unsigned int*/ temp_fraction = temp2write << (4-RES_SHIFT); temp_fraction &= 0x0F; temp_fraction *= 625; // Conversion temp_fraction en caractres text[4] = text[5] = text[6] = text[7] = // Affichage + 48; /* Extrait d'un milliers*/ (temp_fraction/100)%10 + 48; /* Extrait d'un centaines*/ (temp_fraction/10)%10 + 48; /* Extrait d'un dizaines*/ temp_fraction%10 + 48; /* Extrait d'un units*/ de la temprature sur l'cran LCD temp_fraction/1000 chiffre des chiffre des chiffre des chiffre des // Correction de signe si oui // Complmenter deux /* Vrification si la temprature est ngative?*/

Lcd_Out(2,5, text); } void main() { ANSEL = 0; ANSELH = 0; Lcd_Init(); Lcd_Cmd(_LCD_CLEAR); Lcd_Cmd(_LCD_CURSOR_OFF); Lcd_Out(1, 1, " Temperature: ");

// Configurer E/S en numrique // Initialiser LCD // Effacer l'affichage sur LCD // Mettre invisible le curseur

// Afficher le caractre, 'C' pour degrs Celsius Lcd_Chr(2,13,223); Lcd_Chr(2,14,'C'); /*si vous voyez la lettre grecque alpha essayez de taper 178 au lieu de 223*/

- 105 -

V.TOURTCHINE. Programmation en mikroC. Application pour les microcontrleurs de la famille PIC

//--- boucle principale-------do { //--- effectuer la lecture de temprature----Ow_Reset(&PORTA, 5); /* Signal de remise a` zro sur le bus OneWire */ Ow_Write(&PORTA, 5, 0xCC); Ow_Write(&PORTA, 5, 0x44); Delay_us(120); Ow_Reset(&PORTA, 5); Ow_Write(&PORTA, 5, 0xCC); Ow_Write(&PORTA, 5, 0xBE); Delay_ms(400); // Envoi de commandes SKIP_ROM // Envoi de commandes CONVERT_T

// Envoi de commandes SKIP_ROM // Envoi de commandes READ_SCRATCHPAD

temp = Ow_Read(&PORTA, 5); temp = (Ow_Read(&PORTA, 5) << 8)+ temp; //--- Affichage de la temprature sur lcran Lcd ---Display_Temperature(temp); Delay_ms(500); } while (1); }

Fig.4.10. Schma de simulation de lexemple 11

- 106 -

V.TOURTCHINE. Programmation en mikroC. Application pour les microcontrleurs de la famille PIC

Exemple 12. Gnrateur de sons


Les signaux audio sont souvent utiliss quand il est ncessaire d'attirer votre lattention que certains des boutons-poussoirs sont enfonc, vous avertir que les valeurs minimales ou maximales sont atteintes, etc. Il peut tre juste un bip du signal ainsi que plus ou moins longue mlodie. Cet exemple montre comment l'aide des fonctions appartenant la bibliothque Sound du compilateur mikroC PRO raliser un gnrateur de sons (voire le codesource 4.13). Le schma de simulation pour cet exemple est reprsent sur la figure 4.11. Avant de compiler le fichier GENERAT_SONS.c il est ncessaire de cocher les fonctions Boutton et Sound dans le gestionnaire de bibliothque du compilateur mikroC PRO. Code_source 4.13
/**************************************************************************** Gnrateur de sons =================== A l'aide des fonctions appartenant la bibliothque Sound du compilateur mikroC PRO il est facile de raliser un gnrateur de sons Microcontrleur: 16F887 Oscillateur : HS, 10.0000 Mhz Fichier: GENERAT_SONS.c Date: Juillet 2012 ****************************************************************************/ void Tone1() { Sound_Play(659, 250); // Son de frquence = 659Hz, dure = 250ms } void Tone2() { Sound_Play(698, 250); } void Tone3() { Sound_Play(784, 250); } void Melody() { Tone1(); Tone2(); Tone1(); Tone2(); Tone1(); Tone2(); Tone1(); Tone2(); Tone1(); Tone2(); Tone3(); Tone3(); }

// Son de frquence = 698Hz, dure = 250ms

// Son de frquence = 784Hz, dure = 250ms

// Son de mlodie "Maison jaune" Tone3(); Tone3(); Tone3(); Tone3(); Tone3(); Tone2(); Tone3(); Tone3(); Tone3(); Tone2(); Tone1();

void ToneA() { Sound_Play( 880, 100); } void ToneC() { Sound_Play(1046, 100); }

- 107 -

V.TOURTCHINE. Programmation en mikroC. Application pour les microcontrleurs de la famille PIC

void ToneE() { Sound_Play(1318, 100); } void Melody2() { unsigned short i; for (i = 9; i > 0; i--) { ToneA(); ToneC(); ToneE(); } } void main() { ANSEL = 0; ANSELH = 0; C1ON_bit; C2ON_bit; TRISB = 0xF8;

// Configurer PORTB en numrique // Configurer PORTE en numrique

/* Configurer les broches RB7...RB3 en entre */

Sound_Init(&PORTB, 0); Sound_Play(1200, 600); while (1) { if (Button(&PORTB,7,1,1)) Tone1(); while (RB7_bit) ; if (Button(&PORTB,6,1,1)) Tone2(); while (RB6_bit) ; if (Button(&PORTB,5,1,1)) Tone3(); while (RB5_bit) ; if (Button(&PORTB,4,1,1)) Melody2(); while (RB4_bit) ; if (Button(&PORTB,3,1,1)) Melody(); while (RB3_bit) ; } }

// Son 880Hz pendant 1 seconde

// RB7 son

Tone1

// Attendre que le bouton d'tre relch // RB6 - son Tone2 // Attendre que RB6 soit relch // RB5 - son Tone3 // Attendre que RB5 soit relch // RB4 - son de Melody2 // Attendre que RB4 soit relch // RB3 - son Melody // Attendre que RB3 soit relch

- 108 -

V.TOURTCHINE. Programmation en mikroC. Application pour les microcontrleurs de la famille PIC

Fig.4.11. Schma de simulation pour lexemple 12

Exemple 13. Utilisation dafficheur LCD graphique


Un cran LCD graphique (GLCD) fournit une mthode avance pour afficher des messages visuels. Bien que l'cran LCD de caractres ne puisse afficher que des caractres alphanumriques, le GLCD peut afficher des messages sous la forme de dessins et de bitmaps. L'cran GLCD le plus couramment utilis est 128x64 pixels que signifie la rsolution de l'cran. Sur la figure 4.12, le GLCD affiche une image de camion qui est stock dans le fichier truck_bmp.c. Le fichier IMAGE_GLCD.c est dcrit dans le code-source 4.14.

- 109 -

V.TOURTCHINE. Programmation en mikroC. Application pour les microcontrleurs de la famille PIC

Fig.4.12 Schma de simulation pour lexemple 13

Code-source 4.14
/**************************************************************************** Utilisation dafficheur LCD graphique ======================================== GLCD peut afficher des messages sous la forme de dessins et de bitmaps. L'cran GLCD le plus couramment utilis est 128x64 pixels que signifie la rsolution de l'cran. Ici on a reprsent poussires images : dun camion, des lignes, des cercles, des caractres. Microcontrleur: 16F887 Oscillateur : HS, 10.0000 Mhz Fichier: IMAGE_GLCD.c Date: Juillet 2012 ****************************************************************************/ // Declarations const code char truck_bmp[1024]; // Connections dafficheur Glcd char GLCD_DataPort at PORTD; sbit sbit sbit sbit sbit sbit GLCD_CS1 at RB0_bit; GLCD_CS2 at RB1_bit; GLCD_RS at RB2_bit; GLCD_RW at RB3_bit; GLCD_EN at RB4_bit; GLCD_RST at RB5_bit;

- 110 -

V.TOURTCHINE. Programmation en mikroC. Application pour les microcontrleurs de la famille PIC

sbit sbit sbit sbit sbit sbit

GLCD_CS1_Direction at TRISB0_bit; GLCD_CS2_Direction at TRISB1_bit; GLCD_RS_Direction at TRISB2_bit; GLCD_RW_Direction at TRISB3_bit; GLCD_EN_Direction at TRISB4_bit; GLCD_RST_Direction at TRISB5_bit;

// Fin de connections void delay2S() { Delay_ms(2000); } void main() { unsigned short ii; char *someText; #define COMPLETE_EXAMPLE ANSEL = 0; ANSELH = 0; C1ON_bit = 0; C2ON_bit = 0; Glcd_Init(); Glcd_Fill(0x00); while(1) { #ifdef COMPLETE_EXAMPLE Glcd_Image(truck_bmp); delay2S(); delay2S(); #endif Glcd_Fill(0x00); Glcd_Box(62,40,124,56,1); Glcd_Rectangle(5,5,84,35,1); Glcd_Line(0, 0, 127, 63, 1); delay2S(); for(ii = 5; ii < 60; ii+=5 ) { Delay_ms(250); Glcd_V_Line(2, 54, ii, 1); Glcd_H_Line(2, 120, ii, 1); } delay2S(); Glcd_Fill(0x00); #ifdef COMPLETE_EXAMPLE // Choisir la police, consulter __ Lib_GLCDFonts.c Glcd_Set_Font(Character8x7, 8, 7, 32); #endif Glcd_Write_Text("mikroE", 1, 7, 2); // Afficher le texte for (ii = 1; ii <= 10; ii++) Glcd_Circle(63,32, 3*ii, 1); // Afficher le cercle delay2S(); Glcd_Box(12,20, 70,57, 2); // Afficher le bote delay2S(); #ifdef COMPLETE_EXAMPLE Glcd_Fill(0xFF); // Remplir GLCD Glcd_Set_Font(Character8x7, 8, 7, 32); // Changer des caractres

// 2 secondes de temporisation

// Configurer E/S en numrique // Dsactiver les comparateurs

// Initialiser GLCD // Effacer lcran de GLCD

// Afficher l'image dune camion

// // // //

Effacer lcran de GLCD Tracer une bote Tracer un rectangle Tracer une line

/* Tracer les lignes horizontales et verticales

// Effacer lcran de GLCD

- 111 -

V.TOURTCHINE. Programmation en mikroC. Application pour les microcontrleurs de la famille PIC


someText = "8x7 Font"; Glcd_Write_Text(someText, 5, 0, 2); // Afficher le texte delay2S(); Glcd_Set_Font(System3x5, 3, 5, 32); // Changer les caractres someText = "3X5 CAPITALS ONLY"; Glcd_Write_Text(someText, 60, 2, 2); // Afficher le texte delay2S(); Glcd_Set_Font(font5x7, 5, 7, 32); // Changer les caractres someText = "5x7 Font"; Glcd_Write_Text(someText, 5, 4, 2); // Afficher le texte delay2S(); Glcd_Set_Font(FontSystem5x7_v2, 5, 7, 32); someText = "5x7 Font (v2)"; Glcd_Write_Text(someText, 5, 6, 2); delay2S(); #endif } } // // // // -----------------------------------------------------GLCD Picture name: truck.bmp GLCD Model: KS0108 128x64 ------------------------------------------------------

unsigned char const truck_bmp[1024] = { 0, 0, 0, 0, 0,248, 8, 8, 8, 8, 8, 8, 12, 12, 12, 12, 12, 10, 10, 10, 10, 10, 10, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,137,137,137,137,137,137, 137,137,137,137,137,137,137, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 13,253, 13,195, 6,252, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 240,240,240,240,240,224,224,240,240,240,240,240,224,192,192,224, 240,240,240,240,240,224,192, 0, 0, 0,255,255,255,255,255,195, 195,195,195,195,195,195, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255,240, 79,224,255, 96, 96, 96, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 64, 64, 64, 64,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255,255,255,255,255, 0, 0, 0, 0,255,255,255,255,255, 0, 0, 0, 0,255,255,255,255,255, 0, 0, 0,255,255,255,255,255,129, 129,129,129,129,129,129,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 1,248, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 16,224, 24, 36,196, 70,130,130,133,217,102,112, 160,192, 96, 96, 32, 32,160,160,224,224,192, 64, 64,128,128,192, 64,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 96, 96, 96,224, 96, 96, 96, 96, 96, 96, 99, 99, 99, 99, 99, 96, 96, 96, 96, 99, 99, 99, 99, 99, 96, 96, 96, 96, 99, 99, 99, 99, 99, 96, 96, 96, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 96, 96, 96, 96, 96, 96, 96, 64, 64, 64,224,224,255,246, 1, 14, 6, 6, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,130, 67,114, 62, 35, 16, 16, 0, 7, 3, 3, 2, 4, 4, 4, 4, 4, 4, 4, 28, 16, 16, 16, 17, 17, 9, 9, 41, 112, 32, 67, 5,240,126,174,128, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1,127,127,127,127,255,255,247,251,123,191, 95, 93,125,189, 189, 63, 93, 89,177,115,243,229,207, 27, 63,119,255,207,191,255,

- 112 -

V.TOURTCHINE. Programmation en mikroC. Application pour les microcontrleurs de la famille PIC


255,255,255,255,255,255,255,127,127,127,127,127,127,127,127,255, 255,255,127,127,125,120,120120,120,120,248,120,120,120,120,120, 120,248,248,232,143, 0, 0, 0, 0, 0, 0, 0, 0,128,240,248, 120,188,220, 92,252, 28, 28, 60, 92, 92, 60,120,248,248, 96,192, 143,168,216,136, 49, 68, 72, 50,160, 96, 0, 0, 0, 0, 0, 0, 0, 0, 0,128,192,248,248,248,248,252,254,254,254,254,254,254, 254,254,254,254,254,255,255,255,255,255,246,239,208,246,174,173, 169,128,209,208,224,247,249,255,255,252,220,240,127,255,223,255, 255,255,255,255,255,254,254,255,255,255,255,255,255,255,254,255, 255,255,255,255,255,255,254,254,254,254,254,254,254,254,254,254, 254,254,254,254,255,255,255,255,255,255,254,255,190,255,255,253, 240,239,221,223,254,168,136,170,196,208,228,230,248,127,126,156, 223,226,242,242,242,242,242,177, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 3, 3, 3, 7, 7, 7, 7, 7, 15, 15, 15, 7, 15, 15, 15, 7, 7, 15, 14, 15, 13, 15, 47, 43, 43, 43, 43, 43, 47,111,239,255,253,253,255,254,255,255,255,255,255, 191,191,239,239,239,191,255,191,255,255,255,255,255,255,255,255, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 255,255,255,255,127,127,127,127,255,255,191,191,191,191,255,254, 255,253,255,255,255,251,255,255,255,127,125, 63, 31, 31, 31, 31, 31, 31, 63, 15, 15, 7, 7, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 3, 3, 3, 11, 11, 11, 11, 7, 3, 14, 6, 6, 6, 2, 18, 19, 19, 3, 23, 21, 21, 17, 1, 19, 19, 3, 6, 6, 14, 15, 15, 7, 15, 15, 15, 11, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };

Avant de compiler le fichier IMAGE_GLCD.c il est ncessaire de cocher les fonctions Glcd dans le gestionnaire de bibliothque du compilateur mikroC PRO. Pour inclure le fichier truck_bmp.c dans le projet, il faut procder les tapes de 1 8 dans le compilateur mikroC PRO comme cest montr ci-dessous.

- 113 -

V.TOURTCHINE. Programmation en mikroC. Application pour les microcontrleurs de la famille PIC

33

8 GLCD Picture name: truck.bmp

Exemple 14 Calculatrice avec CLAVIER et LCD


Le projet est une calculatrice simple qui peut effectuer des oprations arithmtiques entires. Les touches sont organises comme suit : 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 Les touches sont tiquetes comme suit : 1 2 3 4 5 6 7 8 9 0 ; Entrer + * / Les oprations et rsultats de calcule doivent tre affichs sur lcran de LCD. Le fichier pour cet exemple appel CALCUL_LCD.c est prsent dans le code-source 4.15. - 114 -

V.TOURTCHINE. Programmation en mikroC. Application pour les microcontrleurs de la famille PIC Code-source 4.15
/**************************************************************************** Calculatrice avec CLAVIER et LCD ================================ Le projet est une calculatrice simple qui peut effectuer des oprations arithmtiques entires. Les touches sont organises comme suit : 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 Les touches sont tiquetes comme suit : 1 2 3 4 5 6 7 8 9 0 ; Entrer + * / Les oprations et rsultats de calcule sont affichs sur lcran de LCD Microcontrleur: 18F452 Oscillateur : HS, 10.0000 Mhz Fichier: CALCUL_LCD.c Date: Septembre 2012 ********************************************************************/ #define MASK 0xF0 #define Enter 11 #define Plus 12 #define Minus 13 #define Multiply 14 #define Divide 15 // // Cette fonction obtient une touche du clavier // unsigned char getkeypad() { unsigned char i, Key = 0; PORTB = 0x01; while((PORTB & MASK) == 0) { PORTB = (PORTB << 1); Key++; if(Key == 4) { PORTB = 0x01; Key = 0; } } Delay_ms(20); for(i = 0x10; i !=0; i <<=1) { if((PORTB & i) != 0)break; Key = Key + 4; } PORTB=0x0F; while((PORTB & MASK) != 0);

// Commencer par la colonne 1 // Masquer si aucune touche ne pas presse // Colonne suivante // Numro de colonne

// Sauvegarder la colonne 1

// Mettre anti-rebond // Dterminer la touche enfonce

/* Attendre jusqu'a ce que touche sera relche */ // Mettre anti-rebond // Retour le numro de la touche

Delay_ms(20); return (Key); } // Connections de LCD

- 115 -

V.TOURTCHINE. Programmation en mikroC. Application pour les microcontrleurs de la famille PIC


sbit sbit sbit sbit sbit sbit LCD_RS LCD_EN LCD_D4 LCD_D5 LCD_D6 LCD_D7 at at at at at at RC2_bit; RC3_bit; RC4_bit; RC5_bit; RC6_bit; RC7_bit; at at at at at at TRISC2_bit; TRISC3_bit; TRISC4_bit; TRISC5_bit; TRISC6_bit; TRISC7_bit;

sbit LCD_RS_Direction sbit LCD_EN_Direction sbit LCD_D4_Direction sbit LCD_D5_Direction sbit LCD_D6_Direction sbit LCD_D7_Direction // Fin de connections

//Start du program principale // void main() { unsigned char MyKey, i,j,lcd[5],op[12]; unsigned long Calc, Op1, Op2; TRISC = 0; // PORTC est configure en sortie TRISB = 0xF0; // RB4-RB7 sont configures en entre // // Configuration de LCD // Lcd_Init(); // LCD est connecte PORTC Lcd_Cmd(_LCD_CLEAR); Lcd_Out(1,1,"CALCULATRICE"); // Ecrire CALCULATRICE Delay_ms(2000); // Temporisation de 2 secondes Lcd_Cmd(_LCD_CLEAR); // Effacer l'cran LCD // // Boucle de programme // for(;;) // Boucle sans fin { MyKey = 0; Op1 = 0; Op2 = 0; Lcd_Out(1,1,"No1: "); // Afficher No1: while(1) // Composer la premire chiffre { MyKey = getkeypad(); if(MyKey == Enter)break; // Presser ENTRER MyKey++; if(MyKey == 10)MyKey = 0; // Si la touche 0 est presse Lcd_Chr_CP( MyKey + '0'); Op1 = 10*Op1 + MyKey; // Premier numro de Op1 } Lcd_Out(2,1,"No2: "); // Afficher No2: while(1) // Composer la deuxime chiffre { MyKey = getkeypad(); if(MyKey == Enter)break; // Si ENTRER est presse MyKey++; if(MyKey == 10)MyKey = 0;// Si la touche 0 est presse Lcd_Chr_CP( MyKey +'0'); Op2 = 10*Op2 + MyKey; // Second numro de Op2 } Lcd_Cmd(_LCD_CLEAR); // Effacer l'cran de LCD Lcd_Out(1,1,"Op: "); // Afficher Op:

- 116 -

V.TOURTCHINE. Programmation en mikroC. Application pour les microcontrleurs de la famille PIC


MyKey = getkeypad(); Lcd_Cmd(_LCD_CLEAR); Lcd_Out(1,1,"Res="); switch(MyKey) { case Plus: Calc = Op1 + Op2; break; case Minus: Calc = Op1 - Op2; break; case Multiply: Calc = Op1 * Op2; break; case Divide: Calc = Op1 / Op2; break; } LongToStr(Calc, op); // Obtenir le fonctionnement

// Afficher Res= // Effectuer l'opration

// Si Plus

// Si Minus

// Si Multiply

// Si Divide

// // // Supprimer les espaces gauche // j=0; for(i=0;i<=11;i++) { if(op[i] != ' ') // { lcd[j]=op[i]; j++; } } Lcd_Out_CP(lcd); // Delay_ms(5000); // Lcd_Cmd(_LCD_CLEAR); } }

Convertir en chaine dans op

Si un blanc

Afficher le rsultat Temporisation de 5 secondes

Avant de compiler le fichier CALCUL_LCD.c il est ncessaire de cocher les fonctions Conversions et Lcd dans le gestionnaire de bibliothque du compilateur mikroC PRO.

- 117 -

V.TOURTCHINE. Programmation en mikroC. Application pour les microcontrleurs de la famille PIC

Fig.4.13. Schma de simulation pour lexemple 14

Exemple 15 Calculatrice avec linterface RS232


Dans cet exemple, le PC est connect au microcontrleur via un cble RS232. Le projet cest une simple calculatrice o les donnes sont envoyes au microcontrleur en utilisant le clavier de l'ordinateur et ensuite ils sont affichs sur monitor de PC. Lexemple de calcul : CALCULATRICE PROGRAMME Entrer Premier Nombre : 12 Entrer Deuxime nombre : 2 Entrer Opration : + Rsultat : 14

Le fichier de ce projet appel CALCUL_RS232.c est donn dans le code-source 4.16.

Avant de compiler le fichier CALCUL_RS232.c il est ncessaire de cocher les fonctions Conversions et Software_UART dans le gestionnaire de bibliothque du compilateur mikroC PRO.

- 118 -

V.TOURTCHINE. Programmation en mikroC. Application pour les microcontrleurs de la famille PIC Code-source 4.16
/*************************************************************************** CALCULATRICE AVEC LINTERFACE RS232 =================================== Le projet est une simple calculatrice. L'utilisateur saisit les donnes l'aide du clavier du PC. Les rsultats sont affichs sur l'cran du PC. Les oprations suivantes peuvent tre effectues: +,-,*,/. Dans ce programme, la communication srie est traite par le logiciel Soft_UART et le port srie est configur pour fonctionner avec 9600 Baud. Broches du port RC6 et RC7 sont utiliss pour srie TX et RX respectivement. Microcontrleur: 18F452 Oscillateur : HS, 10.0000 Mhz Fichier: CALCUL_RS232.c Date: Septembre 2012 ***************************************************************************/ #define Enter 13 #define Plus '+' #define Minus '.' #define Multiply '.' #define Divide '/' // Retour de chariot et saut void Newline() { Soft_UART_Write(0x0D); Soft_UART_Write(0x0A); } // Envoyer un texte port srie void Text_To_Usart(unsigned char *m) { unsigned char i; i = 0; while(m[i] != 0) { // Envoyer TEXT vers le port srie Soft_UART_Write(m[i]); i++; } } // Start du programme principale void main() { unsigned char unsigned long unsigned char unsigned char unsigned char unsigned char unsigned char de ligne USART

// Envoyer retour chariot // Envoyer saut de ligne

MyKey, i,j,error,kbd[5],op[12]; Calc, Op1, Op2,Key; msg1[] = " CALCULATRICE PROGRAMME"; msg2[] = " Entrer Premier Nombre : "; msg3[] = " Entrer Deuxieme Nombre : "; msg4[] = " Enter Operation : "; msg5[] = " Resultat = ";

// Configurer port srie Soft_UART_Init(PORTC,7,6,9600,0); // TX=RC6, RX=RC7, Baud=9600

- 119 -

V.TOURTCHINE. Programmation en mikroC. Application pour les microcontrleurs de la famille PIC


// Program loop for(;;) // Boucle sans fin { MyKey = 0; Op1 = 0; Op2 = 0; Newline(); // Envoyer saut de ligne Newline(); // Envoyer saut de ligne Text_To_Usart(msg1); // Envoyer TEXT Newline(); // Envoyer saut de ligne Newline(); // Envoyer saut de ligne // Pour premier nombre Text_To_Usart(msg2); // Envoyer message 2 do // Obtenir le premier numro { do // Si un nombre est tap MyKey = Soft_UART_Read(&error); // Envoyer ce nombre while (error); if(MyKey == Enter)break; // Si le clavier ENTER est press Soft_UART_Write(MyKey); // Sauter nouvelle ligne Key = MyKey - '0'; Op1 = 10*Op1 + Key; // Premier nombre de Op1 } while(1); Newline(); // Pour deuxime nombre Text_To_Usart(msg3); // Envoyer message 3 do // Obtenir le deuxime nombre { do MyKey = Soft_UART_Read(&error); // Envoyer le deuxime nombre while(error); if(MyKey == Enter) break; // Si le clavier ENTER est press Soft_UART_Write(MyKey); // Sauter nouvelle ligne Key = MyKey - '0'; Op2 = 10*Op2 + Key; // Deuxime nombre de Op2 } while(1); Newline(); // Pour opration Text_To_Usart(msg4); do { do MyKey = Soft_UART_Read(&error); while(error); if(MyKey == Enter)break; Soft_UART_Write(MyKey); Key = MyKey; } while(1); // Perform the operation Newline(); switch(Key) { case Plus: Calc = Op1 + Op2; break; case Minus: Calc = Op1 - Op2; break; case Multiply:

// Calcule

// Si Addition

// Si Soustraction

- 120 -

V.TOURTCHINE. Programmation en mikroC. Application pour les microcontrleurs de la famille PIC


Calc = Op1 * Op2; break; case Divide: Calc = Op1 / Op2; break; // Si Multiplication

// Si

Diviser

} LongToStr(Calc, op); // Convertir en ligne // Remove leading blanks j=0; for(i=0;i<=11;i++) { if(op[i] != ' ') // Si un espace { kbd[j]=op[i]; j++; } } Text_To_Usart(msg5); for(i=0; i<j;i++)Soft_UART_Write(kbd[i]); // Afficher le rsultat } }

Le schma de simulation pour ce projet est reprsent sur la figure 4.14

Fig. 4.14. Schma de cblage pour la simulation de lexemple 15

- 121 -

V.TOURTCHINE. Programmation en mikroC. Application pour les microcontrleurs de la famille PIC

- 122 -