µC avancé 2022
µC avancé 2022
µC avancé 2022
Microcontrôleurs:
PIC 16F877 Année universitaire 2024/2025
[email protected]
Généralités
3
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.
4
Technologies Concurrentes
Logique câblée
Réseaux de logique programmables (PAL, GAL,
PLD, FPGA, ...)
Les μprocesseurs
5
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
6
Choix de technologies
7
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
8
Défauts des microcontrôleurs
Le microcontrôleur est souvent surdimensionné
devant les besoins de l’application
9
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
10
Domaines d’applications
Les µCs sont adaptés pour piloter les applications embarquées
dans de nombreux domaines:
11
Familles des PICs
Les PICs sont des µC à architecture RISC.
La famille des PICs est subdivisée en 3 grandes familles:
12
Familles des PICs: identification
13
Architecture du µC (PIC)
Boîtier PIC PIC
17
PIC
16F877/874
19
Architecture de µC
Programmer un µC
20
PIC 16F877 PINOUT Description
22
PIC 16F877: description des pins (suite)
23
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)
24
Architecture PIC 16F8XX
PIC
25
Organisation de la mémoire RAM
avancé / GMSA 2 30
Organisation de La mémoire RAM
Registre d’Etat
Au reset : STATUS = 00011XXX
29
Organisation de La RAM
Registre d’Etat (STATUS)
Bits 6 et 5 : RP1 et RP0 = permettent la sélection des pages
en adressage direct.
30
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.
31
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)
37
Les registres internes (16F8XX)
34
Les registres internes (16F8XX)
OPTION REGISTER (OPTION-REG) : h'81' ou h'181'.
35
Les registres internes
OPTION REGISTER
36
Les registres internes
PIC
OPTION REGISTER
Quand le pré diviseur est affecté au Watchdog (PSA=1), TMR0 est pré
divisé par 1.
37
Les registres internes RAM
38
Les registres internes PIC
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.
39
Les Registres Internes
Les registres de configuration avec leurs états après un
RESET
40
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.
41
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”.
43
Exemple: Horloge de type Quartz et reset
44
Module de conversion A/N
Architecture
45
Le module de conversion A/N
46
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).
51
Le module de conversion A/N
Registre ADCON0 (suite)
48
Le module de conversion A/N
Registre ADCON1
49
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.
Registers
52
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
53
Les ports d’E/S
Le port d' E/S PORTB PIC
54
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.
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.
55
Les ports d’E/S
Le port d' E/S PORTD PIC
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
56
Les ports d’E/S
Le port d' E/S PORTE
PIC
Situation au démarrage
58
Architecture interne du PIC16F877
59
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. 60
Instructions du PIC 16F876/877
62
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
63
Instructions du PIC 16F876/877
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.
66
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>
#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.)
68
Directive de l’assembleur MPASM
Directives
72
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
73
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.
74
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 75
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
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. 76
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
77
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
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 79
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 :
80
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é 81
Interruptions
82
Interruptions
83
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.
85
Exemple de programme d’interruption
Solution de l’Exercice 1:
;++++++++++++++++++++++++++++++++++
; Déclaration des variables
;+++++++++++++++++++++++++++++++++++
COMPT1 EQU 0x0C
COMPT2 EQU 0X0D
SAVE_WORK EQU 0X0E
SAVE_STAT EQU 0X0F
86
Exemple de programme d’interruption
Solution de l’Exercice 1:
;+++++++++++++++++++++++++++++++++++++++++++++++++++
; Vecteurs
;++++++++++++++++++++++++++++++++++++++++++++++++++++
ORG 0000h
GOTO START
ORG 0004H
GOTO INT_VECT
87
Exemple de programme d’interruption
Solution de l’Exercice 1:
;++++++++++++++++++++++++++++++++++++++++++++++++++++
; Programme principal
;++++++++++++++++++++++++++++++++++++++++++++++++++++
RETFIE
Exemple de programme d’interruption
Solution de l’Exercice 1:
;++++++++++++++++++++++++++++++++++++++++++++++++++++
; Programme de temporisation avec timer0
;++++++++++++++++++++++++++++++++++++++++++++++++++++
91
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)
92
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
93
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
94
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)
95
Timers
Timer TMR1:
TMR1 peut fonctionner dans 3 modes différents :
96
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 mode Compteur Asynchrone, on ne peut pas utiliser les modules CCP1 et CCP2 pour faire des captures ou des
97
comparaisons sur TMR1
Timer
Registre de control de T1CON
98
Exercices d’application
Exercice 1:
Exercice 2:
99
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 100
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
1
Compilateur mikroC PRO pour PIC
Nouvelle Version mikroC PRO V.5.0.1
10
2
Prise en main du MikroC et Proteus
I- Le Proteus :
I- Le Proteus :
10
µContrôleur avancé / GMSA 2
4
Prise en main du MikroC et Proteus
documentation complète. 5
Prise en main du MikroC et Proteus
10
6
Prise en main du MikroC et Proteus
10
7
Prise en main du MikroC et Proteus
10
8
Prise en main du MikroC et Proteus
10
µContrôleur avancé / GMSA 2
9
Prise en main du MikroC et Proteus
11
0
Programmation d’un PIC En MikroC
11
1
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
}
112
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
3
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);
}
114
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
5
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
6
Programmation En MikroC
Variable taille (bits) plage
11
7
Programmation En MikroC
11
8
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
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 "
11
9
Programmation En Mikroc
Séquences d'échappement
caractères ASCII non imprimables.
12
0
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.
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
4
Programmation En Mikroc
Opérateurs et expressions en mikroC
12
5
Programmation En Mikroc
Exemples
12
6
Programmation En Mikroc
L’opérateur unaire « – » a une priorité supérieure aux opérateurs binaires
arithmétiques :
12
7
Programmation En Mikroc
Les opérateurs logiques
Une variable booléenne est une variable pouvant prendre la valeur vrai ou
faux.
12
8
Programmation En Mikroc
Les opérateurs de manipulation de bits
12
9
Programmation En Mikroc
Les autres opérateurs binaires d’affectation
13
0
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
1
Programmation En Mikroc
Opérateur séquentiel
i++,j= i + k
13
2
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
3
Programmation En Mikroc
Exemple
#define MAX 100
Notez que la commande préprocesseur #define n’occupe pas l’espace en
mémoire.
13
4
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"
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 :
13
5
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
13
7
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;
} }
13
8
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;
} }
}
13
9
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 « : ».
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
4
Programmation En Mikroc
Exercice
14
5
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;
}
146
Programmation En Mikroc
Exercice
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.
14
7
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);
}
14
8
Programmation En Mikroc
Prototypes de fonctions
14
9
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
0
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
1
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 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
2
Programmation En Mikroc
• LED CLIGNOTANTE
• ================
• void main ()
•{
• TRISB = 0; // Configurer PORTB en sortie
• for (;;) // Boucle sans fin
•{
• PORTB = 1; // Activer LED
• Delay_ms (1000); // Retard 1 seconde
• PORTB = 0; // Désactiver LED
• Delay_ms (1000); //Retard 1 seconde
•}
•}
15
3
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
4
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.
15
6
Contrôleur LCD HD44780
Lcd_Cmd (Lcd_Clear);
15
9
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
16
2
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.
16
3
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.
16
4
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.
16
5
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
6
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.
16
7
Programmation En MikroC
Soft_Uart_Write
16
8
Programmation En MikroC
Bibliothèques standards ANSI C
Ctype bibliothèque
16
9
Programmation En MikroC
Math bibliothèque
17
0
Programmation En MikroC
Stdlib bibliothèque
17
1
Programmation En MikroC
Bibliothèque String
17
2
Programmation En Mikroc
Bibliothèque de conversions
17
3
174
Bibiographie
▶ www.microchip.com
▶ Datasheet PIC 16F8XX
▶ Datasheet 18F45K22
175