Vous êtes sur la page 1sur 178

Cours

Microcontrôleurs:
PIC 16F877
Pr. EL AFOU Youssef

elafou.youssef@gmail.com
Plan de la première partie du cours

 Généralités
 Architecture & Familles des µCs
 Caractéristiques et Fonctionnalités des µC
(PICs)
 Organisation des mémoires/Registres
 Configuration des ports d’entrées/sorties

2
 Généralités

Plusieurs Constructeurs se partagent le marché des microcontrôleurs:


INTEL, MOTOROLA, AMTEL, ZILOG, PHILIPS et MICROCHIP avec ses PICs
très populaires. 3
 Généralités
Un µC est un circuit qui intègre un maximum de fonctions
dans un même boitier. L’intégration de ces fonctions dans le
même environnement permet de créer des applications.

4
 Intégration
Les microcontrôleurs ont des architecture très similaires et sont constitués de modules
fondamentaux assurant les mêmes fonctions : UAL, Ports d’E/S, interfaces de communications
série, Interfaces d’E/S analogiques, Timers et horloge temps réels. On peut dire que seul le
langage de programmation (Assembleurs) constitue la différence majeure en deux
microcontrôleur (similaires) venant de deux constructeurs différents.

5
 Technologies Concurrentes

Le microcontrôleur est en concurrence avec d’autres


technologies Suivants les applications : 3 types de
technologies

 Logique câblée
 Réseaux de logique programmables (PAL, GAL,
PLD, FPGA, ...)
 Les μprocesseurs

6
 Technologies Concurrentes

 Logique câblée
 très rapide, fonctions réalisées par une voie matérielle
 non programmable,
 peu économique quand l’application est complexe
 peu de souplesse : durée d’étude prohibitif et circuit difficilement
modifiable
 Réseaux de logique programmables (PAL, LCA,..)
 rapide, adapté au traitement de signaux complexes
 prix élevé et langage de programmation non standard
 Les μprocesseurs
 grande souplesse :
 fonctions sont réalisées par voie logicielle
 puissance de calcul élevée
 langage évolué
 nombre important de composant à réunir, solution onéreuse
7
 Choix de technologies

 Si la fonction à réaliser est simple ⇒ une logique câblée


 Si le nombre d'unités à réaliser est très important ⇒ circuits
intégrés dédié en logique câblée
 Une réalisation logicielle (µP) est toujours plus lente qu'une
réalisation en logique câblée
 Les μc = avantage des μp mais limités aux applications ne
nécessitant pas trop de puissance de calcul, nombre de
composant très réduit,

8
 Avantages des µCs
 Minimisation d’encombrement du matériel
 Simplification du tracé du circuit imprimé
 Consommation plus faible
 Le µC contribue à réduire les coûts à plusieurs niveaux:
 moins cher que les composants qu’il remplace
 Diminution des coûts de main d’oeuvre (conception et
montage)
 Environnement de programmation et de simulation
évolués
9
 Défauts des microcontrôleurs
 Le microcontrôleur est souvent surdimensionné
devant les besoins de l’application

 Investissement dans les outils de développement:


Écrire les programmes, les tester et tester leur mise
en place sur le matériel qui entoure le µC

10
Exemple : Systèmes à microcontrôleur

µC Actionneur

Unité
Interfaçage Interfaçage
Capteur centrale de
d’entrée de sortie
traitement

Opérateur
Signaux Signaux Signaux
analogique, numérique à Signaux analogique,
Numérique et/ou traiter numérique Numérique
logique traités et/ou logique
11
 Domaines d’applications
 Les µCs sont adaptés pour piloter les applications embarquées
dans de nombreux domaines:

 Informatique (souris, modem …).


 Vidéo (Appareil photos numérique, caméra numérique …).
 Contrôle des processus industriels (régulation, pilotage).
 Appareil de mesure (affichage, calcul statistique, mémorisation) .
 Automobile (ABS, injection, GPS, airbag) .
 Multimédia (téléviseur,carte audio, carte vidéo, MP3,
magnétoscope) .
 Téléphones (fax, portable, modem)
 Electroménager (lave-vaisselle, lave-linge, four micro-onde)

12
Familles des PICs
Les PICs sont des µC à architecture RISC.
La famille des PICs est subdivisée en 3 grandes familles:

 La famille Base-Line, qui utilise des mots d’instructions de 12


bits,
 la famille Mid-Range, qui utilise des mots de 14 bits (16F8xx,
18Fxxx), PIC 16F877
 et la famille High-End, qui utilise des mots de T >16 bits (les
PIC 18Fxxx, 24F, 32F, ..).

13
Familles des PICs: identification

14
Architecture du µC (PIC)
Boîtier PIC PIC

Plastic Dual in-line Package Plastic Leaded Chip Carrier


15
Architecture du µC (PIC)
 La structure interne d'un microcontrôleur comporte
 typiquement :
▶ Une unité de calcul et de commande
▶ Mémoire ROM
▶ Mémoire RAM
▶ Un contrôleur d’interruption
▶ Un compteur/temporisateur (Timer)
▶ Des entrées/sorties parallèles
 Il peut aussi posséder :
▶ Un Watchdog : (surveillance du programme)
▶ Une sortie PWM (modulation d’impulsion)
▶ Un CAN/CNA (Convertisseur analogique numérique)
▶ Une interface I²C, CAN… 16
Architecture du µC (PIC)
16F877
Structure interne du PIC 16F877 :
 Une mémoire programme de type EEPROM flash de 8K mots de 14 bits,
 Une RAM donnée de 368 octets,
 Une mémoire EEPROM de 256 octets,
 05 ports d'entrée sortie, A (6 bits), B (8 bits), C (8 bits), D (8 bits) et E (3
bits)
 ConvertisseurAnalogiques numériques 10 bits à 8 entrées sélectionnables,
 USART, Port série universel, mode asynchrone (RS232) et mode synchrone
 SSP, Port série synchrone supportant I2C
 Trois TIMERS; TMR0, TMR1, TMR2
 Deux modules de comparaison et Capture CCP1 et CCP2 et PWM
 15 sources d'interruption,
 Générateur d'horloge, à quartz (jusqu’à 20 MHz)
 Protection de code,
 Tension de fonctionnement de 2 à 5V,
 Jeux de 35 instructions
17
Architecture: PIC 16F87X

18
PIC
16F877/874

µContrôleur avancé / GMSA 2 22


Architecture du µC (PIC 16F8XX)

 Tailles des bus


 Bus Mémoire Données
 Bus addresses: 9 bits (512 octets)
 Bus données: 8 bits (taille des données)
 Bus Mémoire Programme
 Bus adresses : 13 bits (8k instructions)
 Bus données : 14 bits (taille d’une instruction)

20
Architecture de µC
Programmer un µC

21
PIC 16F877 PINOUT Description

µContrôleur avancé / GMSA 2 25


PIC 16F877: description des pins (suite)

23
PIC 16F877: description des pins (suite)

24
Architecture PIC 16F8XX
 Mémoires:

▶ Les
mémoires internes Il existe trois
types de mémoire :
 RAM pour les registres internes et les
données
 EEPROM de données ;
 EEPROM FLASH programme (données aussi)

25
Architecture PIC 16F8XX
PIC

▶ Organisation de la mémoire RAM


 RAM adressable de 512 positions de 1 octet
chacune :
 96 positions sont réservées au SFR (Special Function
Registers) qui sont les registres de configuration du PIC.
 Les 416 positions restantes constituent les
registres GPR (General Propose Registers) ou RAM
utilisateur.
 Remarque:
Sur le 16F877, 3 blocs de 16 octets chacun ne sont
pas implantés physiquement d’où une capacité de
RAM utilisateur de 368 octets.

26
Organisation de la mémoire RAM

avancé / GMSA 2 30
Organisation de La mémoire RAM

µContrôleur avancé / GMSA 2 31


Organisation de La mémoire RAM

µContrôleur avancé / GMSA 2 32


Microcontrôleur PIC 16F87X
 Accès à la mémoire RAM :deux modes d'adressage
 Adressage DIRECT
 Dans l'instruction la valeur de l'adresse à laquelle on veut accéder.
 Adressage des registres de la RAM sur 7 bits (128 registres),
 mais l'espace mémoire de 4 bancs de 128 registres.
 9 bits pour adresser 512 octets.
Le PIC complète les 7 bits par deux bits du registre STATUS(RP0 et
RP1)

 Registre d’Etat
Au reset : STATUS = 00011XXX

30
Organisation de La RAM
 Registre d’Etat (STATUS)
 Bits 6 et 5 : RP1 et RP0 = permettent la sélection des pages
en adressage direct.

 Bit 7 : IRP = permet la sélection des pages en adressage indirect.


 Pour la PAGE 0 (de 00 à 7F) et la PAGE 1 (de 80 à FF) ce bit doit être
laissé à "0".
 Mis à "1" il permettra d'atteindre la PAGE 3 (de 100 à17F) et la PAGE 4
(de 180 à 1FF).

31
Organisation de La RAM
 Adressage INDIRECT
L'adressage indirect est possible en passant par un registre virtuel
(INDF) dont l'adresse est contenue dans le registre FSR (File
Select Register) et le bit IRP du registre STATUS.

32
Microcontrôleur PIC 16F877

▶ Mémoire Programme
 Stack : Pile dans laquelle est sauvegardé
l’état du microprocesseur (PC,W) lors
d’appel à sous-programmes ou
d’interruptions.
 Vecteur Reset : contient l’adresse de
début de programme (2 octets)
 Interrupt Vector : contient l’adresse du
début de programme d’interruption quand
on utilise les interruptions.
 Page : zone de mémoire contenant des
registres de configuration, des données
variables ou du programme

36
Les registres internes (16F8XX)
 Registre d’Etat (Adresse 03h, 83h, 103h, 183h)

Bit 4 : TO = Time Out bit. Bit en lecture seulement.


1 = Après une mise sous tension, après une RAZ du watchdog (CLRWDT) ou
bien après l'instruction SLEEP.
0 = Signifie qu'un Time Out du timer de watchdog est survenu.
Bit 3 : PD = Power Down bit.
1 = Après une mise sous tension ou bien après une RAZ du Watchdog.
0 = Après l'instruction SLEEP.
Bit 2 : Z = Zero bit.
1 = Le résultat d'une opération arithmétique ou logique est zéro.
0 = Le résultat d'une opération arithmétique ou logique est différent de
zéro.

37
Les registres internes (16F8XX)

 Registre d’Etat (Adresse 03h, 83h, 103h, 183h)

Bit 1 : DC = Digit Carry bit.


1 = Une retenue sur le 4eme bit des poids faible est survenue
après les instructions : ADDWF et ADDLW.
0 = Pas de retenue sur le 4eme bit des poids faible.
Bit 0 : C = Carry bit.
1 = Une retenue sur le bit MSB est survenue après les instructions
ADDWF et ADDLW.
0 = Pas de retenue sur le bit MSB.

35
Les registres internes (16F8XX)
 OPTION REGISTER (OPTION-REG) : h'81' ou h'181'.

Ce registre en lecture et en écriture, contient un


nombre de bit qui permet de configurer les
prédiviseurs du Timer et du Watchdog, la source du
Timer, le front des interruptions et le choix du Pull
up sur le Port B.

Au reset : OPTION-REG = 11111111

36
Les registres internes
 OPTION REGISTER

Bit 7 : RBPU = Pull up Enable bit on Port B.


1 = Pull up désactivé sur le Port B.
0 = Pull up activé.
Bit 6 : INTEDG = Interrupt Edge select bit.
1 = Interruption si front montant sur la broche RB0/IRQ .
0 = Interruption si front descendant sur RB0/IRQ.
Bit 5 : TOCS = Timer TMR0 Clock Source select bit.
1 = L'horloge du Timer est l'entrée PA4/Clk .
0 = Le Timer utilise l'horloge interne du PIC.
Bit 4 : TOSE = Timer TMR0 Source Edge select bit.
1 = Le Timer s'incrémente à chaque front montant de la broche PA4/Clk.
0 = Le Timer s'incrémente à chaque front descendant de la broche PA4/Clk.
Bit 3 : PSA = Prescaler Assignement bit.
1 = Le prédiviseur est affecté au watchdog..
0 = Le prédiviseur est affecté au Timer TMR0.
Bits 2 à 0 : PS2 PS1 PS0 = Prescaler Rate Select bits.

37
Les registres internes
PIC
 OPTION REGISTER

Quand le pré diviseur est affecté au Watchdog (PSA=1), TMR0 est pré
divisé par 1.

38
Les registres internes RAM

 INTCON REGISTER : ( h'0B' ou h'8B' ou h'10B' ou h'18B').


Ce registre en lecture écriture permet de configurer les différentes sources
d'interruption.

 Au reset : INTCON = 0000000X


Bit 7 : GIE = Global Interrup Enable bit
1 = Autorise toutes les interruptions non masquées.
0 = Désactive toutes les interruptions.
Bit 6 : PEIE = Peripheral Interrupt Enable bit.
1 = Autorise les interruptions causées par les périphériques.
0 = Désactive les interruptions causées par les périphériques.
Bit 5 : TOIE = Timer TMR0 Overflow Interrup Enable bit.
1 = Autorise les interruptions du Timer TMR0.
0 = Désactive les interruptions du Timer TMR0.

39
Les registres internes PIC

 INTCON REGISTER : ( h'0B' ou h'8B' ou h'10B' ou h'18B') (suite).

IF
Bit 4 : INTE = RB0/Int Interrup Enable bit.
1 = Autorise les interruptions sur la broche : RB0/IRQ (pin6).
0 = Désactive les interruptions sur la broche : RB0/IRQ (pin6).
Bit 3 : RBIE = RB Port Change Interrup Enable bit.
1 = Autorise les interruptions par changement d'état du Port B (RB4 à RB7).
0 = Désactive les interruptions par changement d'état du Port B (RB4 à RB7).
Bit 2 : TOIF = Timer TMR0 Overflow Interrup Flag bit.
1 = Le Timer a débordé. Ce flag doit être remis à zéro par programme.
0 = Le Timer n'a pas débordé.
Bit 1 : INTF = RB0/Int Interrup Flag bit.
1 = Une interruption sur la broche PB0/IRQ ( pin 6) est survenue.
0 = Pas d' interruption sur la broche PB0/IRQ ( pin 6).
Bit 0 : RBIF = RB Port Change Interrup Flag bit. Ce flag doit être remis à zéro
par programme.
1 = Quand au moins une entrée du port B (de RB4 à RB7) a changé d'état.
0 = Aucune entrée de RB4 à RB7 n'a changé d'état.

40
Les Registres Internes
 Les registres de configuration avec leurs états après un
RESET

41
Microcontrôleur PIC 16F87XX
Cadencement du PIC 16F876/877
 L'Horloge Quartz
 Cadencer le rythme d’exécution des instructions.
 Plus souvent un quartz (de 1MHZ-20MHZ) relié avec deux
condensateurs de filtrage.
 Le filtre passe bas (Rs, C1, C2) limite les harmoniques dus à
l’écrêtage et réduit l’amplitude de l’oscillation.

Oscillateur à quartz du PIC 16F87x

42
Microcontrôleur PIC 16F87XX
 L'Horloge RC
oscillateur RC, la fréquence de l'oscillation est fixée par Vdd, Rext et
Cext. Elle peut varier légèrement d'un circuit à l'autre.

Remarque
 Quelque soit l'oscillateur utilisé, l'horloge système dite aussi
horloge instruction est obtenue en divisant la fréquence par 4.
Dans la suite de ce document on utilisera le terme Fosc/4 pour
désigner l'horloge système.
 Avec un quartz de 4 MHz, on obtient une horloge instruction de 1
MHz, soit le temps pour exécuter une instruction d46e 1μs.
Microcontrôleur PIC 16F87XX
PIC

 Circuit de RESET
 On utilise un circuit de reset externe qui permet la mise à la
masse de l’entrée MCLR qui permet l’initialisation du PIC
(Master clear) à l’aide d’un bouton poussoir.
 Un niveau bas sur l’entrée MCLR entraîne une réinitialisation
complète du microcontrôleur.
 D’une façon générale ce signal est activé à la mise sous tension.
 Un bouton poussoir est souvent rajouté afin qu’une
réinitialisation manuelle soit possible.
 Lorsque le signal de “RESET” est activé, tous les registres sont
initialisé et le compteur programme se place à une adresse
spécifique appelée “Vecteur de RESET”.

44
Exemple: Horloge de type Quartz et reset

45
Module de conversion A/N
Architecture

 Ce module est constitué d'un convertisseur Analogique


Numérique 10 bits dont l'entrée analogique peut être
connectée sur l'une des 8 (5 pour 16F876) entrées
analogiques externes. PIC

 Les entrées analogiques doivent être configurées en


entrée à l'aide des registres TRISA et/ou TRISE.

46
Le module de conversion A/N

Le control du module se fait par les deux registres ADCON0 et


ADCON1.

47
Le module de conversion A/N
 Registre ADCON0
Le registre ADCON0 permet de sélectionner quelle entrée analogique va
être connectée à l’entrée du CAN (bit CHS2 à CHS0).

ADCS1 ADCS0 : Choix de l'horloge de conversion donc du temps de conversion


00 : Fosc/2
01 : Fosc/8
10 : Fosc/32
11 : Oscillateur RC dédié au CAN
CHS2 CHS1 CHS0 : choix de l'entrée analogique
000 = channel 0, (RA0) 100 = channel 4, (RA5)
001 = channel 1, (RA1) 101 = channel 5, (RE0)
010 = channel 2, (RA2) 110 = channel 6, (RE1)
011 = channel 3, (RA3) 111 = channel 7, (RE2)

51
Le module de conversion A/N
 Registre ADCON0 (suite)

 Bit ADON: doit être activé, et le bit GO/DONE donne l’ordre de


départ. Ce bit permet de mettre le module AN en service

 GO/DONE : Une conversion démarre quand on place ce bit à 1. A la


fin de la conversion, il est remis automatiquement à zéro.
 Ce bit peut aussi être positionné automatiquement par le module
CCP2.

49
Le module de conversion A/N
Registre ADCON1

ADFM : justification à droite ou à gauche du résultat dans les registre


ADRESH et ADRESL

PCFG3:PCFG0 : configuration des E/S et des tensions de références.

50
Le module de conversion A/N
Les 5 broches de PORTA et les 3 de PORTE peuvent être configurés soit
en E/S digitales, soit en entrées analogiques. RA2 et RA3 peuvent aussi
être configurées en entrée de référence.

configuration des E/S et des tensions de référence du pic 16F877


Pour les utiliser en E/S numériques, '00000110' dans le registre ADCON1.
54
Le module de conversion A/N
 PIC 18F and Registres ANSEL et ANSELH (9Bh, 9Ch)
 Les registres ANSEL et ANSELH permettent de configurer les
broches AN<13:0> en entrées analogiques ou en entrées/sorties
TOR.
 Attention ! : par défaut, ces registres ne contiennent que des '1'
logiques, ce qui place toutes ces broches en entrées analogiques !

 Registres ANSEL

52
Le module de conversion A/N

PIC 18F and Registres ANSELH

53
54
Les ports d’E/S PIC

 Le port d' E/S PORTA


 Le port A désigné par PORTA est un port de 6 bits (RA0 à
RA5).
 La configuration de direction se fait à l'aide du registre
TRISA :
 Bit i de TRISA = 0 >> bit i de PORTA configuré en sortie
 Bit i de TRISA = 1 >> bit i de PORTA configuré en entrée
 En entrée, la broche RA4 peut être utilisée soit comme E/S
numérique normale, soit comme entrée horloge pour le
Timer TMR0.
 En sortie, RA4 est une E/S à drain ouvert, pour l'utiliser
comme sortie logique, il faut ajouter une résistance de pull-
up externe (résistance de tirage).

Registers

55
Les ports d’E/S
 RA4 est positionnée à 0 ( GND).
 RA4 est placée à 1 (5V).
 Exemple:
Si on veut utiliser RA4 pour allumer une LED, on peut utiliser le
schéma ci-contre. Il faut juste remarquer que la logique est
inversée,
 si on envoie 0 sur RA4, l'interrupteur se ferme et la LED
s'allume.
 Si on envoie 1, l'interrupteur s'ouvre et la LED s'éteint.
 Les autres broches (RA0, RA1, RA2, RA3 et RA5) peuvent être utilisées
soit comme E/S numériques soit comme entrées analogiques.
 Au RESET, ces E/S sont configurées en entrées analogiques.

 Pour utiliser PORTA en port Numérique (normal), il faut placer 06h dans le
registre ADCON1 (bank1)
Registers

56
Les ports d’E/S
 Le port d' E/S PORTB PIC

 PORTB est un port bidirectionnel de 8 bits (RB0 a RB7).


Toutes les broches sont compatibles TTL.

 La configuration de direction se fait a l'aide du registre


TRISB, positionner un bit de TRISB a 1 configure la broche
correspondante de PORTB en entre et inversement. Au
départ toutes les broches sont configurées en entrée.

 En entrée, la ligne RB0 appelée aussi INT peut déclencher


l’interruption externe INT.

57
Les ports d’E/S PIC
Le port d' E/S PORTC
 PORTC est un port bidirectionnel de 8 bits (RC0 a RC7). Toutes les
broches sont compatibles TTL.

 Configuration à l'aide du registre TRISC, positionner un bit de TRISC à


1 configure la broche correspondante de PORTC en entre et
inversement. Au départ toutes les broches sont configurées en entrée.

 Toutes les broches du port C peuvent être utilisées soit comme E/S
normales soit comme broches d'accès a différents modules comme le
timer 1, les modules de comparaison et de capture CCP1/2, le timer
2, le port I2C ou le port série.

 Pour l’utilisation d’une broche du port C comme E/S normale, il faut


s’assurer qu’elle n’a pas été affectée à un de ces modules. Par
exemple, si TIMER1 est valide, il peut utiliser les broches RC0 et RC1
selon sa configuration.

58
Les ports d’E/S
 Le port d' E/S PORTD PIC

 PORTD est un port bidirectionnel de 8 bits (RD0 a RD7). Toutes les


broches sont compatibles TTL et ont la fonction trigger de Schmitt en
entrée.

 Configurable en entrée ou en sortie à l’aide du registre TRISD. Pour


configurer une broche en entrée, on positionne le bit correspondant
dans TRISD à 1 et inversement.

 PORTD peut être utilisé dans un mode particulier appelé parallèle slave
port, pour cela il faut placer le bit PSPMODE (bit 4) de TRISE à 1. Dans
ce cas les 3 bits de PORTD deviennent les entrées de control de ce port
(RE, WE et CS).
 Pour utiliser PORTD en mode normal, il faut placer le bit PSPMODE de
TRISD a 0

59
Les ports d’E/S
 Le port d' E/S PORTE
PIC

 PORTE contient seulement 3 bits RE0, RE1 et RE2. Les 3 sont


configurables en entrée ou en sortie à l’aide des bits 0, 1 ou 2 du
registre TRISE.
 Les 3 bits de PORTE peuvent être utilises soit comme E/S
numérique
soit comme entrées analogiques du CAN. La configuration se fait à
l’aide du registre ADCON1.
 Si le bit PSPMODE de TRISE est place à 1, Les trois bits de PORTE
deviennent les entrées de control du PORTD qui (dans ce cas)
fonctionne en mode parallèle Slave mode
 A la mise sous tension (RESET), les 3 broches de PORTE sont
configurées comme entrées analogiques.
 Pour utiliser les broches de PORTE en E/S numériques normales :
 Placer 06h dans ADCON1 Registres
 Placer le bit PSPMODE de TRISE à 0
60
PIC

 Situation au démarrage

oTous les ports sont configurés en entrée


o PORTD et PORTE sont configurés en mode normal
o PORTA et PORTE sont configurés en analogique

61
Architecture interne du PIC16F877

62
Exercices d’applications
Exercice 1:
Dans quel bank se trouvent les cases mémoire d'adresse : 1A4h,
B5h, 130h, 58h, 100, 200, 250, 300, 400
Exercice 2:
Combien de cases mémoires libres (GPR) y a-t-il dans la zone
mémoire qui commence à la position A0h et se termine à EAh.
Exercice 3:
Quelle est l'adresse de la dernière position d'une zone mémoire de
40 cases qui commence à la position 190h.
Exercice 4:
Combien de cases mémoires libres (GPR) y a-t-il dans le bank1.
Même question pour le bank2. 63
Instructions du PIC 16F876/877

 Tous les PICs Mid-Range ont un jeu de 35 instructions,


 Chaque instruction est codée sur un mot de 14 bits qui contient
le Code Opération (OC) ainsi que l‘Opérande,
 Toutes les instructions sont exécutées en un cycle d'horloge, à
part les instructions de saut qui sont exécutées en 2 cycles
d’horloge.
Sachant que l’horloge système est égale à fosc/4, si on utilise un
quartz de 4MHz, on obtient une horloge fosc/4 = 1000000
cycles/seconde, cela nous donne une puissance de l’ordre de
1MIPS (1 Million d’ Instructions Par Seconde).
Avec un quartz de 20MHz, on obtient une vitesse de traitement
de 5 MIPS. 64
Jeu d’instructions du PIC 16F876/877
{W,F ? d} signifie que le résultat va soit dans W si d=0 ou w, soit dans F si d= 1 ou f

65
Jeu d’instructions du PIC 16F876/877
{W,F ? d} signifie que le résultat va soit dans W si d=0 ou w, soit dans F si d= 1 ou f

66
Instructions du PIC 16F876/877

Les instructions « orientées Registre»: Ce sont des instructions qui


manipulent un octet se trouvant dans la RAM. Ça peut être un registre
de configuration SFR ou une case mémoire quelconque (Registre GPR)
Les instructions « orientées bits »: Ce sont des instructions destinées à
manipuler directement un bit d’un registre que se soit un registre de
configuration SFR ou une case mémoire quelconque (registre GPR).
Tous les bits de la RAM peuvent être manipulé individuellement.
Les instructions opérant sur une constante: Ce sont les instructions
entre l’accumulateur W est une constante K
Les instructions de saut et appel de procédures: Ce sont les instructions
qui permettent de sauter à une autre position dans le programme et de
continuer l’exécution du programme à partir de cette position. 67
Indicateurs d’état (drapeaux)
Les bits Z, DC et C situés dans le registre STATUS sont des indicateurs qui permettent de
savoir comment une instruction s’est terminé:

 Z : passe à 1 quand le résultat d’une instruction est nul


 C : passe à 1 quand l’opération a généré une retenue
 DC : passe à 1 quand les 4ème bits génère une retenue

Ces bits peuvent être utilisé très astucieusement par les instructions btfsc et btfss qui
permettent de tester un bit et de réaliser un saut conditionnel.

Les instructions SUBWF et SUBLW positionne les drapeaux Z et C.


 F - W = 0 ==> Z=1 , C=1 => pas de retenue de soustraction
 F - W > 0 ==> Z=0 , C=1 => pas de retenue de soustraction
 F - W < 0 ==> Z=0 , C=0 => il ya retenue de soustraction
Pour réaliser une comparaison entre F et W, on fait F – W et on observe Z et C
 Z=1 ==> égalité
 C=1 ==> F sup ou égal à W
 C=0 ==> F inférieur à W 68
Directive de l’assembleur MPASM
 Directives
 LIST : permet de définir un certain nombre de paramètres comme le
processeur utilisé (p), la base par défaut pour les nombres (r) ainsi que
d'autres paramètres. Exemple : LIST p=16F877, r=dec.

avec r=dec, les nombres sans spécification particulière seront


considérés par l'assembleur comme des nombres décimaux.

69
Directive de l’assembleur MPASM
 Directives
 INCLUDE : permet d'insérer un fichier source. Par exemple le fichier
p16f877.inc contient la définition d'un certain nombre de constante
comme les noms des registres ainsi que les noms de certains bits;
INCLUDE <p16f877.in>

 EQU : permet de définir une constante ou une variable :

XX EQU 0x20 Chaque fois que le compilateur rencontrera XX, il la


remplacera par 0x20. (MOVLW XX : charger dans W la constante 0x20;
MOVF XX,w : charger dans W le contenu de la case d’adresse 0x20).

• CBLOCK/ENDC : permet de définir un ensemble de constantes :


L'ensemble des déclarations suivantes :
XX1 EQU 0x20 peut être remplacé par CBLOCK 0x20
XX2 EQU 0x21 XX1, XX2, XX3, XX4
XX3 EQU 0x22 ENDC
XX4 EQU 0x23
70
Directive de l’assembleur MPASM
 Directives
 La directive ORG, définit la position dans la mémoire programme à partir de
laquelle seront inscrites les instructions.

 #DEFINE : fonctionne un peu comme la directive EQU tout en étant un peu


plus générale, car elle permet d’affecter toute une chaîne à une abréviation:

#DEFINE XX 0x20 ; dans ce cas c’est équivalent à XX EQU 0x20

#DEFINE LED PORTB,3 ; ici chaque fois que le compilateur rencontrera le mot
LED, il le remplacera par PORTB,3 (BCF LED ; éteindre la LED branchée sur la
broche 3 de PORTB.)

 END Indique la fin du programme.

71
Directive de l’assembleur MPASM
 Directives

 _ _CONFIG : permet de définir les 14 bits (fusibles ou switch) de configuration


qui seront copiés dans l'EEPROM de configuration (adresse 2007h) lors de
l’implantation du programme dans le PIC.

 CP1/CP0 : bits 13/12 ;


protéger la totalité de la mémoire ou seulement une partie. 1 1 : Aucune
protection (_CP_OFF)
1 0 : Protection de la zone 0x1F00 à 0x1FFF (_CP_UPPER_256)
0 1 : Protection de la zone 0x1000 à 0x1FFF (_CP_HALF)
0 0 : Protection de l’intégralité de la mémoire (_CP_ALL) 20

 DEBUG : bit 11 : Debuggage sur circuit. Permet de dédicacer RB7 et RB6 à la


communication avec un debugger.
1 : RB6 et RB7 sont des I/O ordinaires (_DEBUG_OFF)
0 : RB6 et RB7 sont utilisés pour le debuggage sur circuit (_DEBUG_ON) 72
Directive de l’assembleur MPASM
 Directives (suite)
WRT : bit 9 : Autorisation d’écriture en flash
1 : Le programme peut écrire dans les zones non protégées par les bits
CP1/CP0 (_WRT_ENABLE_ON)
0 : Le programme ne peut pas écrire en mémoire flash (_WRT_ENABLE_OFF)
CPD
1 : mémoire EEPROM non protégée (_CPD_OFF)
0 : mémoire EEPROM protégée contre la lecture externe via ICSP (_CPD_ON)
LVP
1 : La pin RB3 permet la programmation du circuit sous tension de 5V (_LVP_ON)
0 : La pin RB3 est utilisée comme I/O standard (_LVP_OFF)

BODEN : bit 6 : provoque le reset du PIC en cas de chute de tension


1 : En service (_BODEN_ON)
0 : hors service (_BODEN_OFF)
67
Directive de l’assembleur MPASM
 Directives (suite)
PWRTE : bit 3 : Délai de démarrage à la mise en service. Attention, est
automatiquement mis en service si le bit BODEN est positionné.
1 : délai hors service (sauf si BODEN = 1) (_PWRTE_OFF)
0 : délai en service (_PWRTE_ON)
WDTE : bit 2 : Validation du Watchdog timer
1 : WDT en service (_WDT_ON)
0 : WDT hors service (_WDT_OFF)
FOSC1/FOSC0 : bits 1/0 : sélection du type d’oscillateur
11 : Oscillateur de type RC (_RC_OSC) (3K < R < 100k, C > 20 pF)
10 : Oscillateur haute vitesse (_HS_OSC) (4 Mhz à 20 Mhz) 01 :
Oscillateur basse vitesse (_XT_OSC) (200 kHz à 4 Mhz)
00 : Oscillateur faible consommation (_LP_OSC) (32 k à 200 kHz)

Voici 3 exemples d’utilisation :


__CONFIG B'11111100111001'
__CONFIG H'3F39‘
__CONFIG _CP_OFF & _DEBUG_OFF & _WRT_ENABLE_ON & _CPD_OFF
& _LVP_OFF & _BODEN_OFF & _PWRTE_OFF & _WDT_OFF & _XT_OSC. 74
Outils de développement : MPLAB
L’outil de développement principal est l’environnement de développement
intégré MPLAB . Les étapes nécessaires permettant à un programme s'exécuter
sont :

Ecrire un programme en langage assembleur dans un fichier texte et le


sauvegarder avec l'extension .asm
Compiler ce programme avec l'assembleur MPASM fourni par Microchip. Le
résultat est un fichier exécutable avec l'extension .hex contenant une suite
d'instruction compréhensible par le pic.
Transplanter le fichier .hex dans la mémoire programme du PIC (mémoire
flash) à l'aide d'un programmateur adéquat.
Mettre le PIC dans son montage final, mettre sous tension

75
Outils de développement : MPLAB
Après l'installation, lancer MPLAB et faire les config ci-dessous :
Configure → Select Device → PIC16F877
Ouvrir une nouvelle fenêtre (de l'éditeur) pour commencer à écrire un
programme : file/new ou cliquez sur l'icône feuille blanche
Taper un programme dans la fenêtre qui vient de s'ouvrir.
Exemple de programme:
clrf 70h
Loop
incf 70h,1
goto loop
end
Sauvegarder (file/save ) ce programme sous le nom.asm
76
Lancer la compilation du programme à l'aide de la commande project/Quikbuild
Outils de développement : MPLAB
Pour faire apparaître la barre d'outil du simulateur :
Debugger → Select tool → MPLAB SIM .
Ouvrez la fenêtre qui visualise la mémoire RAM : view/FileRegisters.
Repérez la case mémoire 70h.
Exécutez maintenant le programme PAS à PAS en cliquant à chaque fois sur le
bouton Step Into, en observant la case mémoire 70h . On peut aussi exécuter en
continu en cliquant sur le bouton animate.
Pour arrêter, il faut cliquer sur le bouton halt.

77
Structure générale d’un programme
;*****************************************************************
; Ce programme écrit les lettres A, B, C, D dans les positions suivantes de la RAM
; A => 20h B => A0h C => 110h D => 190h
;*****************************************************************
list p=16f877 , r=dec
include <p16f877.inc>
__CONFIG _CP_OFF & _DEBUG_OFF & _WRT_ENABLE_OFF & _CPD_OFF & _LVP_OFF &
_BODEN_OFF & _PWRTE_OFF & _WDT_OFF & _XT_OSC
bcf STATUS,RP0 ;bank 0
bcf STATUS,RP1 ;bank 0
movlw 'A'
movwf 20h
bsf STATUS,RP0 ;bank 1
movlw 'B'
movwf 0xA0
bcf STATUS,RP0 ;bank 2
bsf STATUS,RP1 ;bank 2
movlw 'C'
movwf 110h
bsf STATUS,RP0 ;bank 3
movlw 'D'
movwf 190h 78
end
Outils de Boucles de temporisation
Temporisation avec une boucle
Examinons l'exemple ci-dessous, on met une valeur N1 dans la case mémoire 70h et
on la décrémente jusqu'à 0.
movlw 4
movwf 70h
ici decfsz 70h,f
goto ici
- Les instructions movlw et movwf prennent 1 cycle chacune
- L'instruction decfsz prend un cycle si elle ne saute pas et 2 cycles quand elle saute
- L'instruction goto prend 2 cycles
- chaque passage dans la boucle prend (1+2) cycle sauf le dernier qui prend 2 cycle

T = 2 + (W-1)*3 + 2 = 3*W + 1 cycles

La valeur max que l'on peut donner à W est = 256, ce qui donne une temporisation
max de 769 cycles. Avec un quartz = fosc = 4 Mhz, 1 cycle = fosc/4 = 1 µs, ce qui donne
une temporisation max de 769 µs. 79
Outils de Boucles de temporisation
Temporisation avec deux boucles imbriquées
La boucle intérieure (N1) se fait toujours 256 fois. La boucle extérieure se fait N2 fois. C’est
N2 qui constituera le paramètre de la fonction, Il faut le placer dans W

tempo2 : ; il faut définir W dans le programme principal


movwf AN2
t2 : decfsz AN1,f
goto t2
decfsz AN2,f
goto t2
Return

T2 = 2 + 2 + [W(t1+3)-1] + 2 avec t1=256*3-1=767 on obtient : T2 = 770 W +5 cycles

Le maximum est obtenu pour N2 =256, soit T2max = 197125 µs = 0.197 s

80
Outils de Boucles de temporisation
Temporisation avec trois boucles imbriquées
Les boucles intérieures (N1 et N2) se font toujours 256 fois.
La boucle extérieure se fait N3 fois. C’est N3 qui constituera le paramètre de la fonction, Il
faut le placer dans W.
tempo3 : ;Il faut définir W dans le programme principal
movwf AN3
t3 : decfsz AN1,f
goto t3
decfsz AN2,f
goto t3
decfsz AN3,f
goto t3
return

T3 = 2 + 2 + W(t2+3)-1 + 2 avec t2=256*(767+3)-1 on obtient :


T3 = 197122 W +5 cycles Le maximum est obtenu pour N3 =256, soit
T3max = 50463237 µs = 50.46 s.
Remarque : La précision de ces fonctions peut être améliorée en y insérant des
instructions nop, dans ce cas il faut revoir les formules. On verra plus tard comment on
peut faire des temporisations à l’aide des timers. 81
Exercices d’application
Exercice1:
Donner le programme qui fait clignoter une LED branchée sur RA3 avec une
temporisation voisine de 0.5s. Sachant que le PIC est doté d'un quartz de 8 MHz, la
temporisation sera réalisée à l'aide de boucles imbriquées.

Exercice2:
Donner un programme qui surveille l'état de l'entrée RA1 :
- Si RA1 = 0 alors RA3 = 1, PORTB = 00001111
- Si RA1 = 1 alors RA3 = 0, PORTB = 1111000

Exercice3:
Programme qui :
- Allume la LED branchée sur RB3
- Compte 150 impulsions ⎍ sur l'entrée RA4 (la case mémoire 70h servira de compteur)
- Eteint la LED branchée sur RB3 82
Interruptions
Une interruption provoque l’arrêt du programme principal pour aller exécuter une
procédure d'interruption. A la fin de cette procédure, le microcontrôleur reprend le
programme principal à l’endroit où il l’a laissé. A chaque interruption sont associés
deux bits, un bit de validation et un drapeau. Le premier permet d'autoriser ou non
l'interruption, le second permet au programmeur de savoir de quelle interruption il
s'agit. Sur le 16F877, les interruptions sont classées en deux catégories:
interruptions primaires et les interruptions périphériques.
Elles sont gérées par les registres :

83
Interruptions
• Toutes les interruptions peuvent être validées/interdites par le bit INTCON.GIE
• Toutes les interruptions périphériques peuvent être validées/interdites par le bit
INTCON.PEIE
• Chaque interruption peut être validée/interdite par son bit de validation individuel
Pour valider une interruption périphérique, il faut positionner 3 bits, GIE, PEIE et le bit
individuel de l’interruption.
Déroulement d'une interruption:

Lorsque l'événement déclencheur d'une interruption intervient, alors son drapeau est
positionné à 1. Si l'interruption a été validée (bits de validations = 1), elle est alors déclenchée :
le programme arrête ce qu'il est en train de faire et va exécuter la procédure d'interruption qui
se trouve à l'adresse 4 en exécutant les étapes suivantes :
• l'adresse contenue dans le PC (Program Counter) est sauvegardée dans la pile, puis
remplacée par la valeur 0004 (adresse de la routine d'interruption).
• Le bit GIE est placé "0" pour inhiber toutes les interruptions (afin que le PIC ne soit pas
dérangé pendant l'exécution de la procédure d'interruption).
• A la fin de la procédure d'interruption (instruction RETFIE) : • le bit GIE est remis à 1
(autorisant ainsi un autre événement)
• le contenu du PC est rechargé à partir de la pile ce qui permet au programme de reprendre
là où il s'est arrêté 84
Interruptions

Lors de la programmation des interruptions, il est intéressant de


suivre les étapes suivantes:

• Le drapeau reste à l’état haut même après le traitement de


l’interruption. Par conséquent, il faut toujours le remettre à "0" à
la fin de la routine d'interruption sinon l'interruption sera
déclenchée de nouveau juste après l'instruction RETFIE

• Seul le PC est empilé automatiquement. Si cela est nécessaire,


les registres W et STATUS doivent être sauvegardés en RAM puis
restaurés à la fin de la routine pour que le microcontrôleur
puisse reprendre le programme principal dans les mêmes
conditions où il l'a laissé.

85
Interruptions

86
Exemple d’interruption
Interruption INT (Entrée RB0 du port B):
Cette interruption est provoquée par un changement d'état sur
l'entrée RB0 du port B quand elle est programmée en entrée. En plus
de son bit de validation INTE et son drapeau INTF, elle est gérée aussi
par le bit INTEDG (OPTION_REG) qui détermine le front sur lequel
l'interruption se déclenche, 1=montant, 0=descendant.

Interruption RBI (RB4 A RB7 du port B):


Cette interruption est provoquée par un changement d'état sur l'une
des entrées RB4 à RB7 du port B, Le front n'a pas d'importance. Les bits
associés sont RBIE (validation) et RBIF (drapeau). ATTENTION : Le
drapeau RBIF ne peut être remis à zéro sans la lecture préalable de
PORTB (MOVF PORTB,w). Si on ne veut pas modifier le contenu de W,
on peut copier PORTB sur lui-même (MOVF PORTB,f).
87
Exemple de programme d’interruption
Exercice 1:

Ecrire un Programme qui utilise l’interruption INT comme suit :


Chaque fois que l’entrée RB0 passe de 1 à 0, la LED branchée sur
RB1 clignote 5 fois au rythme de la 0.6 seconde. Le PIC est
cadencé par un quartz de 8 MHz.

88
Exemple de programme d’interruption
Solution de l’Exercice 1:

list p=16F877, r=dec


include<p16f877.inc>
__CONFIG _CP_OFF & _DEBUG_OFF &
_WRT_ENABLE_OFF & _CPD_OFF & _LVP_OFF &
_BODEN_OFF & _PWRTE_OFF & _WDT_OFF & _XT_OSC

;++++++++++++++++++++++++++++++++++
; Déclaration des variables
;+++++++++++++++++++++++++++++++++++
COMPT1 EQU 0x0C
COMPT2 EQU 0X0D
SAVE_WORK EQU 0X0E
SAVE_STAT EQU 0X0F
89
Exemple de programme d’interruption
Solution de l’Exercice 1:

;+++++++++++++++++++++++++++++++++++++++++++++++++++
; Vecteurs
;++++++++++++++++++++++++++++++++++++++++++++++++++++

ORG 0000h
GOTO START

ORG 0004H
GOTO INT_VECT

90
Exemple de programme d’interruption
Solution de l’Exercice 1:
;++++++++++++++++++++++++++++++++++++++++++++++++++++
; Programme principal
;++++++++++++++++++++++++++++++++++++++++++++++++++++

START ORG 0005h


BSF STATUS,RP0
MOVLW 0X01
MOVWF TRISB
MOVLW 0X87
MOVWF OPTION_REG
MOVLW 0X90
MOVWF INTCON
BCF STATUS,RP0
CLRF PORTB
BSF PORTB,1
GOTO $-1 91
Exemple de programme d’interruption
Solution de l’Exercice 1:
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
; Programme d'Interruption
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
INT_VECT MOVWF SAVE_WORK
MOVF STATUS,W
MOVWF SAVE_STAT
MOVLW D'5'
MOVWF COMPT1
loop1 BCF PORTB,1
CALL TEMPO
BSF PORTB,1
call TEMPO
DECFSZ COMPT1,f
GOTO loop1
MOVF SAVE_STAT,W
MOVWF STATUS
MOVF SAVE_WORK,W
BCF INTCON,INTF 92

RETFIE
Exemple de programme d’interruption
Solution de l’Exercice 1:
;++++++++++++++++++++++++++++++++++++++++++++++++++++
; Programme de temporisation avec timer0
;++++++++++++++++++++++++++++++++++++++++++++++++++++

TEMPO MOVLW D'18'


MOVWF COMPT2
CLRF TMR0
loop2 BCF INTCON,T0IF
BTFSS INTCON,T0IF
GOTO $-1
decfsz COMPT2,f
GOTO loop2
RETURN
END
93
Exercice 2:

Ecrire un programme qui réalise une division de fréquence par 5.


Le signal d'entrée est appliqué sur l'entrée RB4. Le signal de
sortie est généré sur la sortie RB1. On utilisera l'interruption RBI
pour détecter les transitions du signal d'entrée.

94
Timers
Timer TMR0:
C’est un compteur 8 bits ayant les caractéristiques suivantes :
 Il est incrémenté en permanence soit par l’horloge interne Fosc/4 (mode timer) soit par
une horloge externe appliquée à la broche RA4 du port A (mode compteur). Le choix de
l'horloge se fait à l'aide du bit T0CS du registre OPTION_REG:
 T0CS = 0 alors horloge interne
 T0CS = 1 alors horloge externe appliquée à RA4
 Dans le cas de l'horloge externe, Le bit T0SE du registre OPTION_REG permet de choisir le
front sur lequel le TIMER s'incrémente.
 T0SE = 0 alors incrémentation sur fronts montants
 T0SE = 1 alors incrémentation sur fronts descendants
 Quelque soit l'horloge choisie, on peut la passer dans un diviseur de fréquence
programmable (prescaler) dont le rapport DIV est fixés par les bits PS0, PS1 et PS2 du
registre OPTION_REG. L'affectation ou non du prédiviseur se fait à l'aide du bit PSA du
registre OPTION_REG.
 PSA = 0 alors on utilise le prédiviseur
 PSA = 1 alors pas de prédiviseur (affecté au chien de garde)

95
Timers
Timer TMR0:
 Le contenu du timer TMR0 est accessible par le registre qui porte le même nom. Il peut
être lu ou écrit à n'importe quel moment. Après une écriture, le timer ne comte pas
pendant deux cycles machine.
 Au débordement de TMR0 (FF alors 00), le drapeau INTCON.T0IF est placé à 1. Ceci peut
déclencher l'interruption T0I si celle-ci est validée

96
Exercices d’application
Exercice:

PIC doté d'un quartz de 4 MHz. Programme qui fait clignoter une
LED branchée sur RB0, delay voisin de 0.5s à l'aide de TMR0

1. Par scrutation du drapeau T0IF (pas d'interruption)


2. En utilisant l'interruption T0I

97
Timers
Timer TMR1:
 TMR1 est un Timer/Compteur 16 bits accessible en lecture/écriture par l'intermédiaire
des registres 8 bits TMR1H (bank0) et TMR1L (bank0) qui constituent sa partie haute et
sa partie basse. On le configure à l'aide du registre T1CON (bank0)

98
Timers
Timer TMR1:
TMR1 peut fonctionner dans 3 modes différents :

 Timer Synchrone (horloge interne)


 Compteur Synchrone (horloge externe)
 Compteur Asynchrone (horloge externe)

Le bit de contrôle TMR1CS détermine le fonctionnement en Timer ou en Compteur et le bit


T1SYNC détermine le mode de fonctionnement en synchrone ou en asynchrone

 TMR1 peut être arrêté/démarré à l'aide du bit TMR1ON


 TMR1 peut être RAZ à l'aide du module de capture/comparaison CCP
 TMR1 peut être précédé d'un prédiviseur (Prescaler) qui peut diviser la fréquence par 1,
2, 4 ou 8 selon la valeur des bits T1CKPS1 et T1CKPS0

 A son débordement (FFFFh → 0000h) le drapeau PIR1.TMR1IF (bank0) est positionné ce


qui peut déclencher l'interruption périphérique TMR1I si elle est validée par son bit de
validation PIE1.TMR1IE (bank1).

99
Timer
Mode Timer:
Dans ce mode, TMR1 est incrémenté par l’horloge système Fosc/4
éventuellement prédivisée. Le bit de synchronisation n'a pas d'effet car
l'horloge Fosc/4 est toujours synchronisée sur l'horloge système.
Mode Compteur:
Dans ce mode, TMR1 est incrémenté à chaque front montant de
l'horloge externe T1CKI (RC0) ou l'horloge dédiée générée par
l’oscillateur T1OSC à condition de positionner le bit T1OSCEN à 1 et
de brancher un quartz entre les broche RC0 et RC1.
En mode compteur, RC0 et RC1 sont automatiquement configurées
en entrée, on n’a pas besoin de configurer les bits TRISC,0 et TRISC,1
En fonctionnement Synchrone, l'horloge externe (éventuellement prédivisée) n'incrémente pas directement le timer
mais elle est synchronisée sur l'horloge système ce qui peut entraîner un délai de l'ordre de 1 cycle machine. Dans
cette configuration

En fonctionnement Asynchrone, l'horloge externe (éventuellement prédivisée) incrémente le timer indépendamment


de l'horloge système.

En mode Compteur Asynchrone, on ne peut pas utiliser les modules CCP1 et CCP2 pour faire des captures ou des
100
comparaisons sur TMR1
Timer
Registre de control de T1CON

101
Exercices d’application

Exercice 1:

Clignoter une LED reliée à RE0. La temporisation voisine de 0.5s


sera réalisée à l'aide de TMR1 par scrutation du drapeau TMR1IF

Exercice 2:

Clignoter une LED reliée à RD0. La temporisation voisine de 0.5s


sera réalisée à l'aide de TMR1 est son interruption TMR1I

102
Plan de la deuxième partie du cours
 Compilateur mikroC PRO pour PIC
 Prise en main du logiciel Proteus et de compilateur MikroC PRO pour
programmer PIC16F877.
 Exemple du programme Programmation En Mikroc
 Commentaires
 Eléments de programmation en mikroC
 Tableaux
 Pointeurs
 Opérations mathématiques et logiques en mikroC
 Opérateurs du préprocesseur en MikroC
 Structures de contrôle de programme
 Utilisation des instruction assembleur dans le langage MikroC
 Fonctions et Bibliothèsque dans MikroC
 Exemples de simulation :
 Implémentation des bibliothèques LCD, Clavier...etc.
 Communication en série: Bibliothèque UART
 Bibliothèque de conversions 103
Programmation d’un PIC En MikroC
 le développement de systèmes embarqués sur la base de microcontrôleur
nécessite un langage de programmation évolutif qui assure une combinaison de
l'environnement de programmation avancée IDE (Integrated Development
Environment) , et d’un vaste ensemble de bibliothèques pour le matériel.

 Le compilateur mikroC pour PIC bénéficie d'une prise en main très intuitive et
d'une ergonomie sans faille. Ses très nombreux outils intégrés (mode
simulateur, terminal de communication Ethernet, terminal de communication
USB, gestionnaire pour afficheurs 7 segments, analyseur statistique, correcteur
d'erreur, explorateur de code, mode Débug ICD...) associé à sa capacité à pouvoir
gérer la plupart des périphériques rencontrés dans l'industrie (Bus I2C™,
1Wire™, SPI™, RS485, Bus CAN™, USB, gestion de cartes compact Flash et
SD™/MMC™, génération de signaux PWM, afficheurs LCD alphanumériques et
graphiques, afficheurs LEDs à 7 segments, etc...) en font un outil de
développement incontournable pour les systèmes embarqués, sans aucun
compromis entre la performance et la facilité de débogage.
10
4
Compilateur mikroC PRO pour PIC
 Nouvelle Version mikroC PRO V.5.0.1

La nouvelle version appelée mikroC PRO dispose de très


nombreuses améliorations du compilateur mikroC : nouvelles
variables utilisables, nouvelle interface, amélioration des
performances du linker et de l'optimisateur, cycle de
compilation plus rapide, code machine généré plus compact
(jusqu'à 40 % suivant les cas), nouveaux PIC supportés,
environnement de développement encore plus ergonomique,
nouveaux exemples d'applications, etc...

10
5
Prise en main du MikroC et Proteus

I- Le Proteus :

Le « Proteus » est une suite de logicielle permettant la CAO


électronique éditée par la société Labcenter Electronics. Proteus
est composé de deux logiciels principaux : ISIS, qui est un très
bon logiciel de simulation en électronique. Il est un éditeur de
schémas qui intègre un simulateur analogique, logique ou mixte.
ARES, dédié à la création de circuits imprimés. Grâce à des
modules additionnels, ISIS est également capable de simuler le
comportement d'un microcontrôleur (PIC, Atmel, 8051, ARM,
HC11...) et son interaction avec les composants qui l'entourent.
10
6
Prise en main du MikroC et Proteus

I- Le Proteus :

10
µContrôleur avancé / GMSA 2
7
Prise en main du MikroC et Proteus

II-Le MikroC PRO :


Le « micro C PRO » est un compilateur pour PIC Conçu par la
société « Mikroelektronika », le compilateur C nouvelle
génération "MikroC PRO" pour microcontrôleurs PIC bénéficie
d'une prise en main très facile. Il comporte plusieurs outils
intégrés (mode simulateur, terminal de communication,
gestionnaire 7 segments,). Il a une capacité à pouvoir gérer la
plupart des périphériques rencontrés dans l'industrie (Bus I2C,
1Wire, SPI, RS485, Bus CAN, cartes compact Flash, signaux PWM,
afficheurs LCD et 7 segments...), de ce fait il est un des outils de
développement incontournable et puissant. Il contient un
ensemble de bibliothèques de matériel, de composant et la 10

documentation complète. 8
Prise en main du MikroC et Proteus

II-Le MikroC PRO :

10
9
Prise en main du MikroC et Proteus

Création d’un nouveau projet :


Avec mikroC PRO, on crée un nouveau projet (Project --> New Project), et on choisit le
pic16f877 et un quartz de 20Mhz

11
0
Prise en main du MikroC et Proteus

Création d’un nouveau projet :


Avec mikroC PRO, on crée un nouveau projet (Project --> New Project), et on choisit le
pic16f877 et un quartz de 20Mhz

11
1
Prise en main du MikroC et Proteus

Création d’un nouveau projet :


On saisit ensuite le programme puis on le compile :

11
µContrôleur avancé / GMSA 2
2
Prise en main du MikroC et Proteus

Création d’un nouveau projet :


-Après compilation et s'il n'y a pas d'erreurs le fichier TP1.hex est créé. -Dans ISIS, on
double clic sur le microcontrôleur et on spécifie le fichier TP1.hex qui se trouve dans le
dossier TP puis OK

11
3
Programmation d’un PIC En MikroC

Règles générale d’écriture en mikroC Pro


 Les instructions propres au langage mikroC doivent être
écrites en minuscule.
(void main (void)).
 Les instructions particulières aux microcontrôleurs doivent
être écrites en majuscule
TRISB=0X00;
 Les retours à la ligne et les espaces servent uniquement à
aérer le code.
 Toutes instructions ou actions se terminent par un point
virgule « ; ».

11
4
Programmation En Mikroc
Exemple:

void main()
{
for(;;) // Boucle sans fin
{
TRISB = 0; // Configuration du PORTB en sortie
PORTB.0 = 0 // RB0 = 0
Delay_Ms(1000); // Pause d’une seconde
PORTB.0 = 1; // RB0 = 1
Delay_Ms(1000); // Pause d’une seconde
} // Fin de la boucle
}
115
Programmation En MikroC
 Commentaires
 En mikroC les commentaires de programmes peuvent être de deux
types:
 longs commentaires, s’étendant sur plusieurs lignes, et de
 courts commentaires, occupant une seule ligne.
 Les longs commentaires commencent par le caractère « /* » et se termine
par le caractère « */ ».
 De même, de courts commentaires commencent par le caractère « // » et
il n’a pas besoin d'un caractère de terminaison.

11
6
Exemple.
/********************************************************************
**** SURFACE D'UN CERCLE
====================
Ce programme appelle la fonction Cercle_Surface pour calculer la surface d'un cercle.
*********************************************************************
**/
//Calcule la surface d'un cercle en fonction de rayon
float Cercle_Surface (float rayon)
{
float s;
s = PI*rayon*rayon;
return s;
}
/* Début 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);
}
117
Programmation En MikroC
 Eléments de programmation en mikroC
 Les variables
Toute variable utilisée dans un programme doit auparavant être définie. La
définition d’une variable consiste à la nommer et lui donnée un type et
éventuellement lui donner une valeur initiale (initialiser).
 Les variables globales
 Les variables locales

 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 représente le même identifiant.
 Certains noms sont réservés pour le compilateur lui-même et ne peut pas être
utilisés comme noms de variables dans un programme (asm,signed, enum,
auto, …)
11
8
Programmation En Mikroc
Voici quelques identificateurs valides:
• temperature_V1, Pressure, no_hit, Dat2string, SUM3, _vtext
mais voici quelques identificateurs incorrectes:
• 7temp // ne peut pas commencer par un chiffre
• % Supérieur // ne peut pas contenir de caractères spéciaux
• int // ne peut pas répéter un mot-clé

11
9
Programmation En MikroC
Variable taille (bits) plage

12
0
Programmation En MikroC

 Constantes représentent des valeurs fixes (numérique ou caractère) dans


des programmes qui ne peuvent pas être changées.
 En mikroC, constantes peuvent être entiers, flottants, caractères, les
chaînes, ou des types énumérés.
 Les constantes sont déclarées en utilisant le mot-clé const et sont stockées
dans le flash de mémoire du microcontrôleur PIC. Par exemple, MAX est
déclaré comme la constante100 :
const MAX =100;
 Les constantes hexadécimales
const TOTAL = 0xFF;
 Les constantes octales
const CNT = 017;
 Les constantes binaires commencent par 0b ou 0B
const Min = 0b11110000

12
1
Programmation En Mikroc
 Les constantes à virgule flottante
 Entier décimal
 Point décimal
 Partie décimale fractionnaire
 e ou E et l'ordre du signe
Exemple
±1.17549435082 * 10-38
const TEMP = 37.50 ou const TEMP = 3.750E1

Character Constants const First_Alpha = ‘A’;


String Constants "Il s'agit d'un exemple de chaîne constante"

 Une constante chaîne peut être étendue à travers une frontière en ligne en
utilisant une barre oblique inverse « "\" » :
"C'est la première partie de la chaîne \
et c'est la poursuite de la chaîne "
12
2
Programmation En Mikroc
 Séquences d'échappement
caractères ASCII non imprimables.

12
3
Programmation En Mikroc
 Variables statiques
valeur d'une variable entre les appels successifs de la fonction doit être
préservée.
statique unsigned int count ;
 Variables externes
indique au compilateur que la variable est déclarée ailleurs dans un
code-source distincte
extern int sum1, SUM2 ;
 Variables volatiles
sont importantes dans l'interruption des programmes et de routines d’entrées-sorties.
Utilisation de mot-clé volatile indique que la valeur de la variable peut changer au
cours de la durée de vie du programme indépendant de l'écoulement normal du
programme.

volatile unsigned char Led;


16
Programmation En Mikroc
 Tableaux
stocker des éléments liés dans le même bloc de mémoire et en vertu d'un
nom spécifié.
unsigned int Total [5] ;
Total[0] se réfère au premier élément du tableau
Total[1] = 25; Temp = Total[2];
unsigned char mois[12] = {31,28,31,30,31,30,31,31,30,31,30,31};
unsigned char Hex_Letters[ ] ={‘A’, ‘B’, ‘C’, ‘D’, ‘E’, ‘F’};
unsigned char Mystring[ ] = “COMP”;
Est Identique à unsigned char Mystring[ ] = {‘C’, ‘O’, ‘M’, ‘P’, ‘\0’};

 Tableaux de dimensions multiples


P[2][3], unsigned char Q[2][2] = { {1,0}, {0,1} };

17
Programmation En Mikroc
 Pointeurs
occupent les adresses mémoire des autres variables.
unsigned char *pnt;
 Quand un nouveau pointeur est créé, son contenu est d'abord indéterminé 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 affectée à
une valeur en utilisant le caractère « * » en avant de son pointeur. Par exemple, le Count
peut être attribuée à 10 à l'aide de son pointeur :
* pnt = 10; // Count = 10
c’est la même 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
18
Programmation En Mikroc
 Pointeurs de tableaux
unsigned int Total[10];
Le nom Total est également un pointeur de ce tableau, et il contient l'adresse du
premier élément de la matrice. Ainsi, les deux énoncés suivants sont égaux:

Total[2] = 0; et *(Total + 2) = 0;
En outre, l'énoncé suivant est vrai:
Total[j] = Total + j ;

 Exemple
P = &Z[2];
ou
*P = 0; // Z[2] = 0 *P = 0; // Z[2] = 0
P = P + 1; // maintenant P pointe l’élément 3 de Z *(P +1) = 0; // Z[3] = 0
*P = 0; // Z[3] = 0

12
7
Programmation En Mikroc
Opérateurs et expressions en mikroC

Les opérateurs arithmétiques

12
8
Programmation En Mikroc
 Exemples

12
9
Programmation En Mikroc
 L’opérateur unaire « – » a une priorité supérieure aux opérateurs binaires
arithmétiques :

 Les opérateurs de comparaison

13
0
Programmation En Mikroc
Les opérateurs logiques

Une variable booléenne est une variable pouvant prendre la valeur vrai ou
faux.

13
1
Programmation En Mikroc
 Les opérateurs de manipulation de bits

13
2
Programmation En Mikroc
 Les autres opérateurs binaires d’affectation

13
3
Programmation En Mikroc
 Autres opérateurs unaires d’affectation

Exemple
y = x++ ; c’est le raccourci pour y = x ; x = x+1 ;
y = ++x ; c’est le raccourci pour x = x + 1 ; y = x ;
 Opérateur conditionnel

Exemple :
a = (v == 2) ? 1 : 2 ;
13
4
Programmation En Mikroc

 Opérateur séquentiel

Cet opérateur permet de regrouper plusieurs expressions en une


seule : l’évaluation de l’expression e1, e2 consiste en l’évaluation
successive (dans l’ordre) des expressions e1 puis de e2.

i++,j= i + k

13
5
Programmation En Mikroc
 Opérateurs du préprocesseur
 Toute ligne de code-source commence par « # » est considérée comme
un opérateur de préprocesseur.
 Les opérateurs du préprocesseur sont généralement placés au début du code-
source, mais ils ont le droit d'être n'importe où dans le programme.
 Le préprocesseur permet à un programmeur de :

 Compiler un programme de sorte que les parties du code ne sont pas compilés
 Remplacer les symboles avec d'autres symboles ou des valeurs
 Insérer des fichiers texte dans un programme
La syntaxe plus commune d'un opérateur du préprocesseur est :
#include <math.h>
MikroC compilateur prend en charge les commandes de préprocesseur suivantes:
#define #undef,
#if #elif #endif
#error
#ligne

13
6
Programmation En Mikroc

 Exemple
#define MAX 100
Notez que la commande préprocesseur #define n’occupe pas l’espace en
mémoire.

#define ADD (a, b) (a + b)


Lorsque cette macro est utilisée dans un programme, (a, b) sera remplacé
par (a + b) comme indiqué ci-dessous :
p = ADD (x, y) sera transformé en p = (x + y)

#define CARRE (a) (a * a)


Nous pouvons maintenant utiliser cette macro dans un programme :
p = CARRE (x) sera transformé en p = (x * x)

13
7
Programmation En Mikroc
 Commande du préprocesseur #include
La commande #include est utilisé pour inclure un fichier source dans un
programme. Habituellement les fichiers avec l'extension ". H" sont utilisés avec #include.
Il y a deux formats pour l'utilisation de #include:
#include <fichier>
et
#include "fichier"

 Dans la première option le fichier est recherché d'abord dans le répertoire


d'installation mikroC, puis dans les chemins de recherche des utilisateurs.

 En seconde option le fichier spécifié 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 spécifier un chemin de répertoire complet :

#include "C: \ temp \ last.h"


Le dossier dans ce cas n’est recherché que dans le chemin du répertoire spécifié.

13
8
Programmation En Mikroc
 Structure de contrôle de programme
 De sélection if et switch
 D'itération ou bouclage for
 Modifications inconditionnels d’exécution

 Instructions de sélection if et switch


Exemple if (x> 0 && x <10)
if (x> MAX)
{
if (x >MAX) {
P++; Total + = Sum;
P++; Sum++;
else Cnt = P;
}
P--; Sum = Sum = Cnt;
else
}
{
else
Total = 0;
P--;
Sum = 0;
}
13
9
Programmation En Mikroc
 Instruction switch et break
Exemple
La syntaxe de commutation
switch (condition)
{ switch (Cnt)
case condition1: Instructions; {
break; case 1: A = 1; break;
case condition2: Instructions; case 10: B = 1; break;
break; case 100: C = 1; break;
..................... défault: D = 1;
case condition: Instructions; }
break;
default: Instructions;
}
saut de contrôle en dehors de l'instruction switch lorsque le mot break est
rencontré.

14
0
Programmation En Mikroc
 Instructions d'itération for, while, do, goto, continue et break

 Utilisation de for
 Utilisation de while
 Utilisation de do
 Utilisation de goto, continue et break
La syntaxe d'une instruction for est :
for (expression initiale; expression de condition; expression incrément)
{
Instructions;
}
Exemple
// Boucle sans fin avec
for(i = 0; i < 10; i ++) // boucle sans fin
incrémentation i
{ for (i = 0;; i++)
for (;;)
Instructions; { {
} Instructions; Instructions;
} }
14
1
Programmation En Mikroc
 Instruction while
La syntaxe d'une instruction while est la suivante :
while (condition)
{
Instructions;
}

Exemple
// Une boucle qui s'exécute
10 fois
k = 0; // Une boucle sans fin
k = 0; // Une boucle sans fin
while (k <10) while (k = k)
{ while (k <10)
{ {
Instructions; Instructions;
k++; Instructions;
} }
}

14
2
Programmation En Mikroc
 Instruction goto, continue
 Une instruction goto peut être utilisée pour modifier le flux normal
de contrôle dans un programme. Elle provoque le programme à sauter à
une étiquette spécifiée.
 Une étiquette peut être n'importe quel jeu de caractères
alphanumériques commençant par une lettre et se terminant par le
caractère « : ».

exemples /* Calculer la somme des nombres ,2,3,4,6,7,8,9,10 */


/ * Exécute 10 fois * / Sum = 0;
k = 0; i = 1;
Boucle: for (i = 1; i <= 10; i++)
Instructions; {
k++; if (i == 5) continue; // Passer numéro 5
if (k < 10) goto Boucle; Sum = Sum + i;
}
14
3
Programmation En Mikroc
 Utilisation mikroC avec des instructions en langage d’assembleur

 Il devient parfois nécessaire d’utiliser la langue assembleur pour


microcontrôleurs 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
Exemple }
unsigned char Temp = 10;
asm
{
MOVLW Temp // W = Temp =10
..................
}
14
4
Exercices
1. Ecrire un programme pour mettre tous les 8 pattes du PORTB au
niveau 1.
2. Écrire un programme pour mettre les pattes impaires (1, 3, 5
et 7) du PORTB au niveau 1.
3. Ecrire un programme pour compter en binaire sans fin et
envoie ces données au PORTB :
4. Écrire un programme pour mettre tous les bits de PORTB au
niveau logique 1, puis à la logique 0, et répéter ce procédé dix
fois.
5. Ecrire un programme pour trouver le plus grand élément d'un
tableau d'entiers ayant dix éléments.
6. Ecrire un programme en utilisant une boucle while pour effacer
tous les dix éléments entiers dans un tableau M.
14
5
FONCTIONS ET BIBLIOTHEQUES DANS
MIKROC
Déclaration d’une fonction
type_de_résultat nom_fonction(para1, para2, .....)
{
.............
corps de la fonction
.............
}
Exemple:
int Mult(int a, int b)
{
return (a*b);
}
Appel d’une fonction
z = Mult (x, y);
14
6
Programmation En Mikroc
 Fonction ne provient pas de données
void LED(unsigned char D)
{
PORTB = D;
}

Fonctions void peut être appelée sans aucune instruction d'affectation, mais les
parenthèses sont nécessaire pour indiquer au compilateur que un appel de
fonction est faite:

void Compl()
{ Fonction Compl complète le PORTC du
PORTC =~PORTC; microcontrôleur
}

14
7
Programmation En Mikroc
Exercice

Écrire une fonction appelée Surface et une fonction


appelée 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.

14
8
Programmation En Mikroc
 Surface Et Volme D’un Cylindre
//Fonction pour calculer la surface d'un cylindre // Début du programme principale
float Surface(float rayon, float hauteur) void main ()
{float s; {float r = 2.0, h = 5.0;
s = 2.0*PI*rayon*hauteur; float Cylindre_Surface,
return s; Cylindre_Volume;
} Cylindre_Surface = Surface(r,h);
// Fonction pour calculer le volume d'un cylindre Cylindre_Volume = Volume(r,h);
float Volume(float rayon, float hauteur) }
{float s ;
s = PI*rayon*rayon*hauteur;
return s;
}

149
Programmation En Mikroc
 Exercice

Écrire une fonction appelée Minuscule_Majuscule pour convertir un caractère


de minuscule en majuscule.

 Solution
La valeur ASCII du caractère en majuscule du premier caractère ('A') est
égale à 0x41. De même, la valeur l'ASCII du premier caractère en minuscule
('a') est égale à 0x61. Un caractère minuscule peut être converti en son
équivalent majuscule en soustrayant 0x20 du caractère en minuscule.

15
0
Programmation En Mikroc
 Solution
/* Fonction pour convertir un caractère minuscule en un majuscule*/
unsigned char Minuscule_Majuscule (unsigned char c)
{
if(c > ='a' && c <= 'z')
return(c - 0x20);
else
return c;
}
void main () // Début du programme principal
{
unsigned char Lc, Uc;
Lc = ‘r’;
Uc = Minuscule_Majuscule (Lc);
}

15
1
Programmation En Mikroc
 Prototypes de fonctions

Si une fonction n'est pas définie avant qu'il ne soit appelé, le


compilateur génère une erreur.
Une façon de contourner ce problème est de créer un prototype
de fonction. Une fonction prototype est construite facilement en
faisant une copie de la tête de la fonction.

float Area(float rayon);


ou
float Area (float);

15
2
Programmation En Mikroc
 Fonctions intégrées
Des fonctions qui peuvent être appelées à partir du programme. La
plupart de ces fonctions peuvent être utilisées dans un programme
sans avoir à inclure des fichiers d'en-tête.

15
3
Programmation En Mikroc
Une LED est connectée au PORTB (broche RB0) d'un microcontrôleur PIC16F84A à
travers une résistance de limitation figure ci-dessous

Exercice
Ecrire un programme qui fera clignoter le LED ON et OFF en permanence dans
l’intervalle d'une seconde.

15
4
Programmation En Mikroc
Solution
Une LED peut être connectée à un microcontrôleur en deux modes : source
de courant et absorption de courant.

En mode d'absorption de courant une patte de la LED est connectée à + 5 V à


travers une résistance R de limitation de courant et l'autre patte est reliée à la
patte de port de sortie du microcontrôleur. La LED sera allumée lorsque le port
de sortie du microcontrôleur est au niveau logique 0 (à savoir, environ +0 V).

En mode de source de courant une patte de la LED est reliée au port de sortie
du microcontrôleur et l'autre patte est reliée à la masse à travers une
résistance R de limitation de courant. La LED sera allumé lorsque le port de
sortie du microcontrôleur est au niveau logique 1 (à savoir, environ +5 V).

15
5
Programmation En Mikroc

• LED CLIGNOTANTE
• ================
• void main ()
•{
• TRISB = 0; // Configurer PORTB en sortie
• for (;;) // Boucle sans fin
•{
• PORTB = 1; // Activer LED
Delay_ms (1000);
• Delay_ms (1000);
// Retard 1 seconde
// Retard 1 seconde
•} PORTB = 0; // Désactiver LED
}

15
6
LED CLIGNOTANTE_2
En utilisant les commandes de préprocesseur #define le programme est devenu plus
facile à suivre.
Microcontrôleur: 16F84A
Oscillateur: HS, 4.0000 Mhz
*************************************************************************/
#define LED PORTB.0
#define ON 1
#define OFF 0
#define One_Second_Delay Delay_ms(1000)
void main()
{
TRISB = 0; // PORTB est configuré en sortie
for(; ;) // Boucle sans fin
{
LED = ON; // LED est allumée (ON)
One_Second_Delay; // Retard 1 seconde
LED = OFF; // LED est désactivée (OFF)
One_Second_Delay; // Retard 1 seconde
}
}
15
7
Fonctions de la bibliothèque mikroC
 Fonctions disponibles avec le compilateur mikroC.

50
Exemple: Bibliothèque pour LCD
 La programmation en assembleur d'un écran LCD en mode parallèle ou en série
est généralement une tâche complexe et nécessite d’une bonne compréhension
du fonctionnement interne de l'écran LCD.

 Le langage mikroC fournit des fonctions pour les deux modes de


programmation basée sur le texte déjà préparé, ce qui simplifie l'utilisation
d'écrans LCD.

Le contrôleur LCD HD44780


 HD44780 est l'un des contrôleurs de cristaux liquides les plus appréciés (en
industrie)
 Le module est monochrome et vient dans différentes formes et tailles. Des
modules avec 8, 16, 20, 24, 32 et 40 caractères sont disponibles.
 Selon le modèle, l'écran LCD est fabriqué avec 14 ou 16 pattes pour l'interface.

15
9
Contrôleur LCD HD44780

Les pattes du module LCD HD44780


16
0
Contrôleur LCD HD44780
 Ensemble de fonctions utilisées pour la gestion de l’écran LCD
 Lcd_Config
 Lcd_Init
 Lcd_Out
 Lcd_Out_Cp
 Lcd_Chr
 Lcd_Chr_Cp
 Lcd_Cmd
 Lcd_Config
La fonction Lcd_Config est utilisée pour configurer l'interface LCD.
 Lcd_Out
La fonction Lcd_Out affiche du texte à la ligne indiquée et la position des
colonnes de l'écran LCD. La fonction doit être appelée avec des paramètres dans
l'ordre suivant :
ligne, colonne, texte
Lcd_Out (1, 2, "Ordinateur");
16
1
Contrôleur LCD HD44780

 Lcd_Cmd est une fonction


utilisée pour envoyer une
commande à l'écran LCD.

Lcd_Cmd (Lcd_Clear);

16
2
Programmation En MikroC
 Exercice
Un contrôleur de texte LCD est relié à un microcontrôleur PIC16F887 dans le
mode par défaut comme illustre la figure ci-dessous

Ecrire un programme pour envoyer le texte test_LCD à


la ligne 1, à la colonne 4 de l’écran LCD.
Programmation En MikroC
Solution
Configuration du contrôleur LCD.
// Connections de LCD
sbit LCD_RS at RB4_bit;
sbit LCD_EN at RB5_bit;
sbit LCD_D4 at RB0_bit;
sbit LCD_D5 at RB1_bit;
sbit LCD_D6 at RB2_bit;
sbit LCD_D7 at RB3_bit;
sbit LCD_RS_Direction at TRISB4_bit;
sbit LCD_EN_Direction at TRISB5_bit;
sbit LCD_D4_Direction at TRISB0_bit;
sbit LCD_D5_Direction at TRISB1_bit;
sbit LCD_D6_Direction at TRISB2_bit;
sbit LCD_D7_Direction at TRISB3_bit;
// Fin de connections
16
4
Programmation En MikroC
void main()
{
TRISB = 0;
PORTB = 0xFF;
TRISB = 0xff;
//Configurer E/S du portB comme numériques
ANSELH = 0;
ANSEL = 0;
Lcd_Init(); // Initialiser LCD
Lcd_Cmd(_LCD_CLEAR); // Effacer un texte sur l’ecrant LCD
Lcd_Cmd(_LCD_CURSOR_OFF); // Curseur est en off
Lcd_Out(1,2,"-- AFFICHAGE -- "); // Ecrire le texte sur la 1ère ligne
Lcd_Out(2,1,"display_LCD_4bit"); // Ecrire le texte sur la 2ème ligne
}

16
5
Programmation En MikroC
 Bibliothèque pour UART (réalisation Software)
L’émetteur-récepteur asynchrone universel (UART) est un logiciel de
bibliothèque Dans la communication de série, seulement deux câbles (plus un
câble de terre) sont nécessaires pour transférer (TX et RX) des données dans
les deux sens. Les données sont envoyés en format série bit par bit.
Normalement, le dispositif de réception est au repos.

Envoi un caractère "A" par la communication série

16
6
Programmation En MikroC
 Connecteur RS232
 Les niveaux de tension spécifiés par le protocole RS232 sont ± 12V. Un signal
logique HIGH (haut) est à - 12V et un signal logique LOW (bas) est à + 12V.
Les microcontrôleurs PIC, fonctionnent normalement à des niveaux de tension
: 0 et 5 V. Donc les signaux pour RS232 doivent être convertie pour l'entrée
d'un microcontrôleur. De même, la sortie du microcontrôleur doit être
convertie en ± 12V avant l'envoi au dispositif de réception RS232.

Les connecteurs RS232

 La conversion de tension est généralement réalisée avec des circuits de


conversion, comme le MAX232, fabriqué par Maxim Inc.

16
7
Programmation En MikroC

 Le mikroC PRO pour PIC fournit des routines pour la mise en œuvre du
logiciel de communication UART. Ces routines sont indépendantes du
matériel et peut être utilisé avec n'importe quel microcontrôleur.

 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

16
8
Programmation En MikroC
 Fonction Soft_UART_Init
La fonction Soft_UART_Init spécifie les paramètres de communication série
et le fait dans l'ordre suivant :
 port, rx patte, tx patte, vitesse de transmission, mode
 port est le port utilisé comme UART logiciel (par exemple, PORTB) ;
 rx est le receveur d’un nombre de transmission ;
 tx est l’émméteur de transmission ;
 vitesse de transmission est le taux de transmission choisi, où la valeur
maximale dépend de la fréquence d'horloge du microcontrôleur ;
 mode spécifie si les données devraient être inversés ou non lors
de la sortie. Un 0 indiquent qu’ils ne devraient pas être inversés,
et un 1 indique qu'ils devraient être inversés. Quand un RS232 est
utilisé donc dans ce cas le mode doit être réglé à 1.
Soft_Uart_Init doit être la première fonction appelée avant que le logiciel
soit établié.
Soft_Uart_Init (PORTB, 0, 1, 9600, 0);

16
9
Programmation En MikroC
 Soft_Uart_Read
 La fonction Soft_Uart_Read reçoit un octet à partir d'une patte du port
série spécifié. Larenvoie une condition d'erreur et les données sont
lues à partir du port série. La fonction ne pas attendre que les données
soient disponibles sur le port, et donc le paramètre d'erreur doit être
testé si un octet est prévu. 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 série en appelant la fonction Soft_Uart_Init. L'octet reçu est
stocké dans une variable Temp:
do
Temp = Soft_Uart_Read(&Rx_Error);
while (Rx_Error);

17
0
Programmation En MikroC
 Soft_Uart_Write

 La fonction Soft_Uart_Write transmet un octet à une patte de port


configuré en série. Les données à envoyer doivent être spécifiés comme
un paramètre dans l'appel de la fonction.

 Par exemple, pour envoyer un caractère "A" à la patte de port série :


char MyData = ‘A’;
Soft_Uart_Write(MyData);

17
1
Programmation En MikroC
 Bibliothèques standards ANSI C
 Ctype bibliothèque

17
2
Programmation En MikroC
 Math bibliothèque

17
3
Programmation En MikroC
 Stdlib bibliothèque

17
4
Programmation En MikroC

 Bibliothèque String

17
5
Programmation En Mikroc

Bibliothèque de conversions

17
6
177
Bibiographie

▶ www.microchip.com
▶ Datasheet PIC 16F8XX
▶ Datasheet 18F45K22

178

Vous aimerez peut-être aussi