Mohamed Massour El Aoud January
Mohamed Massour El Aoud January
Mohamed Massour El Aoud January
ed
Cours de la première année cycle ingénieur
am
Mohamed Massour El Aoud
January �, ����
oh
M
d
ou
A
ENSA Khouribga
El
ur
so
as
A LATEX lover
M
ed
am
oh
M
d
ou
A
Disclaimer
El
Copyright
Colophon
ur
Publisher
First printed in January ���� by, ENSA Khouribga
M
ed
� Introduction
am
oh
La situation dans laquelle nous nous trouvons aujourd’hui dans le domaine des �.� Introduction . . . . . . . . . �
microcontrôleurs trouve ses origines dans le développement de la technologie ALL THE MICROCON-
des circuits intégrés. Il nous a permis de stocker des centaines de milliers de TROLLER CAN DO . . . . . . �
M
transistors dans une seule puce, ce qui était une condition préalable à la fabrication �.� Rappel logique de base . . �
de microprocesseurs. Les premiers ordinateurs ont été fabriqués en y ajoutant
des périphériques externes, tels que de la mémoire, des lignes d’entrée/sortie,
REGISTER . . . . . . . . . . �
SFR REGISTERS . . . . . . �
INPUT / OUTPUT PORTS �
d
des minuteries et d’autres circuits. L’augmentation supplémentaire de la densité INTERRUPT . . . . . . . . . �
des boîtiers a entraîné la conception d’un circuit intégré contenant à la fois un CENTRAL PROCESSOR
ou
processeur et des périphériques. C’est ainsi qu’a été développée la première puce UNIT (CPU) . . . . . . . . . . . �
contenant un micro-ordinateur connu plus tard sous le nom de microcontrôleur. BUS . . . . . . . . . . . . . . . �
SERIAL COMMUNICA-
TION . . . . . . . . . . . . . . . . �
A
Les novices en électronique pensent généralement que le microcontrôleur est le SPI (BUS D’INTERFACE PÉ-
même que le microprocesseur. Ce n’est pas vrai. Ils diffèrent les uns des autres RIPHÉRIQUE SÉRIE) . . . . . �
à bien des égards. La première et la plus importante différence en faveur du UART (RÉCEPTEUR/ÉMET-
microcontrôleur est sa fonctionnalité. Pour que le microprocesseur puisse être TEUR ASYNCHRONE UNI-
ur
utilisé, il faut lui ajouter d’autres composants, la mémoire en premier. Même s’il VERSEL) . . . . . . . . . . . . . �
est considéré comme une machine informatique puissante, il n’est pas adapté OSCILLATEUR . . . . . . . �
CIRCUIT
pour communiquer avec un environnement périphérique. Afin de permettre
so
D’ALIMENTATION . . . . . . �
au microprocesseur de communiquer avec l’environnement périphérique, des
MINUTEURS/COMP-
circuits spéciaux doivent être utilisés. C’était comme ça au début et c’est toujours TEURS . . . . . . . . . . . . . . . �
pareil aujourd’hui. D’autre part, le microcontrôleur est conçu pour être tout
as
UTILISATION
cela en un. Aucun autre composant externe spécialisé n’est nécessaire pour son D’UN PRÉDÉCAR-
application car tous les circuits nécessaires qui appartiennent par ailleurs aux TEUR(PRESCALER ) EN
M
périphériques y sont déjà intégrés. Il permet d’économiser le temps et l’espace FONCTIONNEMENT PAR
nécessaires à la conception d’un appareil. MINUTERIE . . . . . . . . . . . �
UTILISATION DE
L’INTERRUPTION DANS
ALL THE MICROCONTROLLER CAN DO LE FONCTIONNEMENT DE
LA MINUTERIE . . . . . . . ��
Il y a une dizaine d’années, la conception d’un dispositif électronique contrôlant COMPTEURS . . . . . . . ��
MINUTERIE DE CHIEN
l’ascenseur dans un immeuble à plusieurs étages était extrêmement difficile,
(WATCHDOG )DE GARDE ��
même pour une équipe d’experts. Avez-vous déjà pensé aux exigences auxquelles
A/D CONVERTER . . . . ��
un ascenseur ordinaire doit répondre ? Comment gérer la situation lorsque
ARCHITECTURE IN-
deux personnes ou plus appellent l’ascenseur en même temps ? Quel appel TERNE . . . . . . . . . . . . . . ��
est prioritaire ? Comment gérer question de sécurité, perte d’électricité, panne, �.� INSTRUCTION SET . . . ��
mauvaise utilisation...? Ce qui vient après la résolution de ces questions de base RISC (ORDINATEUR DE
JEU D’INSTRUCTIONS RÉ-
DUIT) . . . . . . . . . . . . . . ��
CISC (ORDINATEUR
� Introduction �
ed
am
oh
Figure �.�: Microcontrôleur
M
est un processus minutieux de conception d’une électronique appropriée à l’aide
d’un grand nombre de puces spécialisées. Selon la complexité de l’appareil, ce
processus peut prendre des semaines ou des mois. Une fois terminé, il est temps
d
de concevoir une carte de circuit imprimé et d’assembler le dispositif. Un appareil
ou
des améliorations... et n’oubliez pas que nous parlons toujours de faire fonctionner
un ascenseur ordinaire.
Lorsque votre appareil commence enfin à fonctionner parfaitement et que tout
ur
le monde est satisfait et que vous êtes enfin payé pour le travail que vous avez
effectué, de nombreuses entreprises de construction s’intéressent à votre travail.
Bien sûr, si vous avez de la chance, un autre jour vous apportera une offre de
so
ed
Le fonctionnement de ces éléments est basé sur des principes établis par un
mathématicien britannique George Boole au milieu du ��ème siècle, avant même
que la première ampoule ne soit inventée. À l’origine, l’idée principale était
am
d’exprimer des formes logiques à travers des fonctions algébriques. Une telle
réflexion a rapidement été transformée en un produit pratique qui a été évalué
bien plus tard dans ce que l’on appelle aujourd’hui des circuits logiques ET, OU
et NON. Le principe de leur fonctionnement est connu sous le nom d’algèbre de
oh
Boole.
REGISTER
M
En bref, un registre ou une cellule mémoire est un circuit électronique qui peut
mémoriser l’état d’un octet.
d
SFR REGISTERS
ou
fonction est prédéterminée par le constructeur. Leurs bits sont connectés (littérale- Figure �.�: REGISTER
ment) à des circuits internes du microcontrôleur tels que des minuteries, des
convertisseurs A/N, des oscillateurs et autres, ce qui signifie qu’ils commandent
El
En d’autres termes, l’état des bits du registre est modifié à partir du programme,
les registres exécutent de petits circuits dans le microcontrôleur ; ces circuits sont
via des broches de microcontrôleur connectées à l’électronique périphérique qui
so
ed
am
oh
Figure �.�: SFR REGISTERS
Il est simplement effectué par un logiciel, ce qui signifie qu’une fonction de broche
M
peut être modifiée pendant le fonctionnement.
L’une des spécifications importantes des broches d’entrée/sortie (E/S) est le
courant maximum qu’elles peuvent gérer. Pour la plupart des microcontrôleurs,
le courant obtenu à partir d’une broche est suffisant pour activer une LED ou
d
un autre dispositif à faible courant (��-�� mA). Plus il y a de broches d’E/S,
ou
plus le courant maximum d’une broche est faible. En d’autres termes, le courant
maximum indiqué dans la fiche technique du microprocesseur est partagé sur
tous les ports d’E/S. Une autre fonction importante de la broche est qu’elle peut Figure �.�: INPUT / OUTPUT PORTS
avoir des résistances de rappel. Ces résistances connectent les broches à la tension
A
configurables par logiciel. Chaque port d’E/S est généralement sous le contrôle
du SFR spécialisé, ce qui signifie que chaque bit de ce registre détermine l’état
de la broche du microcontrôleur correspondante. Par exemple, en écrivant un (�)
ur
logique dans un bit du registre de contrôle (SFR), la broche de port appropriée est
automatiquement configurée comme une entrée et la tension qui lui est apportée
peut être lue comme � ou �. Sinon, en écrivant zéro au SFR, la broche de port
so
appropriée est configurée en tant que sortie. Sa tension (�V ou �V) correspond à
l’état du bit de registre de port approprié.
as
INTERRUPT
M
Comme son nom l’indique, il s’agit d’une unité qui surveille et contrôle tous les
processus au sein du microcontrôleur. Il se compose de plusieurs sous-unités,
dont les plus importantes sont :
I Le décodeur d’instructions est une partie de l’électronique qui décode les
instructions du programme et exécute d’autres circuits sur cette base. Le «
jeu d’instructions » qui est différent pour chaque famille de microcontrôleurs
exprime les capacités de ce circuit.
ed
I L’unité arithmétique et logique (ALU) effectue toutes les opérations math-
ématiques et logiques sur les données ; et Accumulateur est une SFR
étroitement liée au fonctionnement de l’ALU. C’est une sorte de bureau de
travail utilisé pour stocker toutes les données sur lesquelles une opération
am
doit être effectuée (ajout, décalage/déplacement... etc.). Il stocke également
les résultats prêts à être utilisés dans un traitement ultérieur.
L’un des SFR, appelé Status Register (PSW), est étroitement lié à l’accumulateur. Il
oh
indique à tout moment le « statut » d’un nombre stocké dans l’accumulateur (le
nombre est supérieur ou inférieur à zéro... etc.). L’accumulateur est également
appelé registre de travail et est marqué comme registre W ou simplement W, par
conséquent.
M
d
ou
A
BUS
notre cas il fait � bits ou fils de large. Il est utilisé pour connecter tous les circuits
du microcontrôleur.
as
SERIAL COMMUNICATION
M
BAUD RATE
ed
Le terme débit en bauds est utilisé pour désigner le nombre de bits transférés par
seconde [bps]. Notez qu’il fait référence à des bits, pas à des octets. Le protocole
am
exige généralement que chaque octet soit transféré avec plusieurs bits de contrôle.
Cela signifie qu’un octet dans le flux de données série peut être composé de ��
bits. Par exemple, si le débit en bauds est de ��� bps, alors un maximum de �� et
un minimum de �� octets peuvent être transférés par seconde. Les systèmes de
oh
communication série les plus couramment utilisés sont :
M
Le circuit inter-intégré est un système d’échange de données série entre les
microcontrôleurs et les circuits intégrés spécialisés d’une nouvelle génération.
d
Il est utilisé lorsque la distance entre eux est courte (le récepteur et l’émetteur
sont généralement sur la même carte imprimée). La connexion est établie via
ou
deux conducteurs. L’un est utilisé pour le transfert de données et l’autre pour
la synchronisation (signal d’horloge). Comme le montre la figure ci-dessous, un
appareil est toujours un maître. Il effectue l’adressage d’une puce esclave avant le
début de la communication. De cette façon, un microcontrôleur peut communiquer
A
La distance entre les appareils qui communiquent sur un bus I�C est limitée à
plusieurs mètres.
ur
so
as
ed
Figure �.�: BUS D’INTERFACE PÉ-
RIPHÉRIQUE SÉRIE
am
UART (RÉCEPTEUR/ÉMETTEUR ASYNCHRONE
UNIVERSEL)
oh
pour le transfert du signal d’horloge n’est pas utilisée. Dans certaines applications,
telles que la connexion radio ou la télécommande par ondes infrarouges, cette
fonctionnalité est cruciale. Étant donné qu’une seule ligne de communication est
utilisée, le récepteur et l’émetteur fonctionnent à la même vitesse prédéfinie afin
M
de maintenir la synchronisation nécessaire. Il s’agit d’un moyen très simple de
transférer des données car il représente essentiellement la conversion de données
� bits du format parallèle au format série. Le débit en bauds n’est pas élevé, jusqu’à
d
� Mbit/s.
ou
OSCILLATEUR
CIRCUIT D’ALIMENTATION
M
MINUTEURS/COMPTEURS
ed
Il est facile de mesurer de courts intervalles de temps, jusqu’à ��� microsecondes,
de la manière décrite ci-dessus car c’est le plus grand nombre qu’un registre peut
stocker. Cette restriction peut être facilement surmontée de plusieurs manières,
am
par exemple en utilisant un oscillateur plus lent, des registres avec plus de
bits, un pré-échelonneur ou des interruptions. Les deux premières solutions ont
quelques faiblesses, il est donc plus recommandé d’utiliser des préscalers ou des
interruptions.
oh
M
d
ou
simultanément.
as
M
ed
modifié dans une routine d’interruption. L’ensemble du processus (à l’exception
de la routine d’interruption) est automatiquement exécuté dans les coulisses, ce qui
permet aux circuits principaux du microcontrôleur de fonctionner normalement.
am
La figure ?? illustre l’utilisation d’une interruption dans le fonctionnement du
oh
M
d
Figure �.��: MINUTEURS/COMPTEURS
ou
COMPTEURS
El
pourquoi ils ne peuvent pas être utilisés pour la mesure du temps, mais à d’autres
fins telles que le comptage de produits sur une chaîne de montage, le nombre de
rotation d’axe, les passagers, ...etc. (selon le capteur utilisé).
as
ed
am
oh
Figure �.��: MINUTERIE DE CHIEN (WATCH-
M
DOG )DE GARDE
A/D CONVERTER
d
ou
ARCHITECTURE INTERNE
Tous les microcontrôleurs mis à niveau utilisent l’un des deux modèles de
so
mémoire.
VON-NEUMANN ARCHITECTURE
M
HARVARD ARCHITECTURE
ed
différents. L’un a une largeur de � bits et connecte le processeur à la RAM. L’autre
se compose de ��, �� ou �� lignes et connecte le CPU à la ROM. Par conséquent;
la CPU peut lire une instruction et accéder à la mémoire de données en même
am
temps. Étant donné que tous les registres de mémoire RAM ont une largeur de �
bits, toutes les données échangées sont de la même largeur. Lors du processus
d’écriture d’un programme, seules les données � bits sont prises en compte. En
d’autres termes, tout ce que vous pouvez modifier à partir du programme et tout Figure �.��: HARVARD ARCHITECTURE
oh
ce que vous pouvez influencer est de � bits. Tous les programmes écrits pour
ces microcontrôleurs seront stockés dans la ROM interne du microcontrôleur
après avoir été compilés en code machine. Cependant, les emplacements mémoire
ROM n’ont pas �, mais ��, �� ou �� bits. Le reste des bits �, � ou � représente une
> Toutes les données du programme ont une largeur d’un octet (� bits). Comme
d
le bus de données utilisé pour la lecture du programme comporte ��, �� ou
�� lignes, les instructions et les données peuvent être lues simultanément à
ou
l’aide de ces bits de réserve. Pour cette raison, toutes les instructions sont
des instructions à cycle unique, à l’exception de l’instruction de saut qui est
une instruction à deux cycles.
A
> Du fait que le programme (ROM) et les données temporaires (RAM) sont
séparés, la CPU peut exécuter deux instructions à la fois. En termes simples,
pendant que la lecture ou l’écriture de la RAM est en cours (la fin d’une
El
ed
qu’il exécute. L’utilisateur ne peut voir que les résultats finaux. Enfin, il n’est pas
si difficile d’expliquer où se trouve l’aéroport si vous utilisez les bons mots tels
que gauche, droite, kilomètres...etc.
am
CISC (ORDINATEUR COMPLEXE D’ENSEMBLE
D’INSTRUCTIONS)
oh
CISC est l’opposé de RISC ! Les microcontrôleurs conçus pour reconnaître plus
de ��� instructions différentes peuvent faire beaucoup de choses à grande vitesse.
Cependant, il faut comprendre comment prendre tout ce qu’offre une langue aussi
M
riche, ce qui n’est pas du tout facile... COMMENT FAIRE LE BON CHOIX ? Ok,
vous êtes débutant et vous avez pris la décision de vous lancer dans l’aventure de
travailler avec les microcontrôleurs. Félicitations pour votre choix ! Cependant, il
n’est pas aussi facile de choisir le bon microcontrôleur qu’il y paraît. Le problème
d
n’est pas une gamme limitée d’appareils, mais le contraire !
ou
relais ? A-t-il besoin d’un module spécialisé tel qu’une communication série, un
convertisseur A/N, etc. ? Lorsque vous créez une image claire de ce dont vous
avez besoin, la gamme de sélection est considérablement réduite et il est temps de
El
en pratique après l’avoir lu. Afin d’éviter des explications fastidieuses et des
histoires sans fin sur les fonctionnalités utiles de différents microcontrôleurs, ce
cours décrit le fonctionnement d’un modèle particulier appartenant à la « haute
classe moyenne ». C’est le PIC��F��� - assez puissant pour mériter l’attention et
assez simple pour être facilement présenté à tout le monde. Ainsi, les chapitres
suivants décrivent ce microcontrôleur en détail, mais font également référence à
l’ensemble de la famille PIC.
Table �.�: Base-Line �-bit architecture, ��-bit Instruction Word Length
Family ROM RAM PINS Clock A/D Reso Compa �/�� Serial PWM Others
ed
[Kbytes] [bytes] Freq. In- lution rators – bit Comm. Out-
[MHz] putsof Timers puts
A/D
am
Con-
verter
Base-Line �-bit architecture, ��-bit Instruction Word Length
PIC��FXXX �.��� - �� - �-� �-� �-� � �-� �x� - - -
oh
�.�� ��
PIC��FXXX �.�� - � �� -
���
�� �-� � �-�
M �x� - - EEPROM
d
PIC��HVXXX �.� �� ��- �� - - - �x� - - Vdd =
�� ��V
ou
I�C SPI
Tous les microcontrôleurs PIC utilisent l’architecture Harvard, ce qui signifie que
leur mémoire programme est connectée au CPU sur plus de � lignes. Selon la
� Introduction ��
ed
JEU D’INSTRUCTIONS
am
Le jeu d’instructions pour le ��F�XX comprend �� instructions au total. La
raison d’un si petit nombre d’instructions réside dans l’architecture RISC. Cela
signifie que les instructions sont bien optimisées du point de vue de la vitesse
de fonctionnement, de la simplicité de l’architecture et de la compacité du code.
La mauvaise chose à propos de l’architecture RISC est que le programmeur
oh
est censé faire face à ces instructions. Bien sûr, cela n’est pertinent que si vous
utilisez le langage assembleur pour la programmation. Ce cours fait référence à la
programmation dans le langage de programmation supérieur C, ce qui signifie
M
que la plupart des travaux ont été effectués par quelqu’un d’autre. Il suffit d’utiliser
des instructions relativement simples.
d
TEMPS D’EXECUTION DES INSTRUCTIONS
ou
Toutes les instructions sont des instructions à cycle unique. La seule exception
peut-être des instructions de branchement conditionnel (si la condition est remplie)
ou des instructions exécutées sur le compteur de programme. Dans les deux
A
cas, deux cycles sont nécessaires pour l’exécution de l’instruction, tandis que le
deuxième cycle est exécuté en tant que NOP (No Operation). Les instructions à
cycle unique consistent en quatre cycles d’horloge. Si un oscillateur �MHz est
El
ed
am
oh
M
d
ou
A
El
ur
so
as
M
M
d
ou
A
El
ur
so
as
M
ed
� Programming Microcontrollers
am
oh
Vous savez certainement qu’il ne suffit pas de connecter le microcontrôleur à �.� LANGUES DE PROGRAM-
d’autres composants et d’allumer l’alimentation pour le faire fonctionner, n’est-ce MATION . . . . . . . . . . . . ��
pas ? Il y a autre chose qui doit être fait. Le microcontrôleur doit être programmé AVANTAGES DES
M
LANGUES DE PROGRAMMA-
pour être capable d’effectuer tout ce qui est utile. Si vous pensez que c’est
TION SUPÉRIEURES . . . . ��
compliqué, alors vous vous trompez. Toute la procédure est très simple. Lisez
�.� Langages de programma-
simplement le texte suivant et vous changerez d’avis.
tion . . . . . . . . . . . . . . . . ��
d
Langage machine . . . . . ��
Langage assembleur . . . ��
ou
L’algorithme . . . . . . . . ��
Utilisation de MPLABX
IDE . . . . . . . . . . . . . . . . ��
Création du projet dans
ur
MPLABX . . . . . . . . . . . . ��
Le premier programme
d’activation et de désactivation
so
d’une sortie . . . . . . . . . . . ��
Les principaux aspects d’un
programme « C » . . . . . . . ��
as
peut reconnaître sont appelées ensemble le jeu d’instructions. Quant aux micro-
contrôleurs PIC dont les mots de programmation sont composés de �� bits, le jeu
d’instructions compte au total �� instructions différentes.
Comme le processus d’écriture de code exécutable était infiniment fatigant, le
premier langage de programmation « supérieur » appelé langage d’assemblage
a été créé. La vérité est que cela a rendu le processus de programmation plus
compliqué, mais d’un autre côté, le processus d’écriture du programme a cessé
d’être un cauchemar. Les instructions en langage assembleur sont représentées
sous la forme d’abréviations significatives, et le processus de leur compilation en
ed
code exécutable est confié à un programme spécial sur un PC appelé compilateur.
Le principal avantage de ce langage de programmation est sa simplicité, c’est-
à-dire que chaque instruction de programme correspond à un emplacement
mémoire dans le microcontrôleur. Il permet un contrôle complet de ce qui se passe
am
dans la puce, rendant ainsi ce langage couramment utilisé aujourd’hui. Cependant,
oh
M
d
ou
programmation supérieurs ont été créés. L’un d’eux est le C. Le principal avantage
de ces langages est la simplicité d’écriture du programme. Il n’est plus possible de
savoir exactement comment s’exécute chaque commande, mais cela n’a de toute
El
façon plus d’intérêt. Dans ce cas, une séquence écrite en langage assembleur peut
toujours être insérée dans le programme, l’activant ainsi.
Semblable au langage assembleur, un programme spécialisé dans un PC appelé
ur
ed
am
oh
M
d
ou
A
Par exemple, il n’y a pas d’instruction appropriée pour multiplier deux nombres,
mais il n’y a également aucune raison de s’en inquiéter. Chaque problème a
as
une solution et celle-ci ne fait pas exception grâce aux mathématiques qui nous
permettent d’effectuer des opérations complexes en les décomposant en un certain
nombre d’opérations simples. Concrètement, la multiplication peut être facilement
M
ed
am
oh
M Figure �.�: Programming Microcontrollers
d
�.� Langages de programmation
ou
est couramment utilisé dans les systèmes à microprocesseur. C’est parce que le
binaire n’a que deux chiffres discrets « � » et « � ». Considérons le nombre binaire
suivant : �������� Cela représente vraiment �v�v�v�v�v�v�v�v Le �v et le �v est
ur
Langage machine
as
ed
En programmation réelle, nous utilisons un programme appelé un compilateur
pour ce faire.
am
Langage assembleur
oh
tenant collectivement appelés langage assembleur. Il en existe différents pour
différents systèmes tels que TASAM pour TINA avec les EMMA, MASAM pour
Microsoft utilisé dans les programmes DOS et l’assembleur MPLAB de Microchip.
M
Lors de l’utilisation du langage assembleur, toutes les instructions comportent
deux parties :
I L’OPCODE. C’est la partie qui décrit l’opération (c’est-à-dire, LDA charge
d
l’accumulateur).
I L’OPÉRANDE. Où le micro obtient les données à utiliser dans l’opération
ou
(c’est-à-dire ´ # ˇ)
Cela signifie que les données sont ce qui suit immédiatement dans la mémoire
micros. Comme ce cours est basé sur le langage de programmation C, il n’y
A
avancés tels que les PIC �� bits. De plus, je pense que Siemens s’oriente maintenant Table �.�: Langages de programmation les plus
vers la programmation de ses automates en « C ». Les langages plus modernes courants
M
ed
tester des aspects du programme.
I Une variété d’outils de débogage pour permettre au programmeur de tester
le programme en direct dans le micro.
am
Tout cela se trouve dans l’IDE que nous choisissons ; Microsoft a Visual Studio,
Microchip a MPLABX et Freescale utilise CodeWarrior. Notez que CODEBLOCK
est un IDE pour écrire des programmes ’C’ génériques qui s’exécuteront sur votre
PC. Comme ce cours est basé sur le micro PIC, il se concentrera sur MPLABX et
oh
Micro C. MPLABX dispose d’un éditeur de texte amélioré pour donner au texte
des codes de couleur différents lorsque nous enregistrons le fichier en tant que
fichier de programme .asm ou .c pour c tel que le bleu clair pour les mots-clés, le
M
gris clair pour les commentaires, etc.
Il existe d’autres programmes d’organisation dans MPLABX, tels que la possibilité
d’écrire dans les registres de configuration du PIC. Il y a aussi la possibilité de
simuler vos programmes au sein de l’IDE. Tout cela fait de MPLABX un outil
d
utile pour programmer des PIC. Il existe également un programme appelé MCC
ou
Microchip Code Configurator. Cela produira en fait une grande partie du code
dont vous avez besoin, pour utiliser divers aspects du PIC, pour vous. Cependant,
je crois fermement que vous devez produire vous-même le code que vous utilisez
afin de bien comprendre le code que vous utilisez. Je ne couvrirai pas l’utilisation
A
du MCC. De plus, Microchip n’a pas écrit le MCC pour tous leurs PIC, et le
��F���� est celui qu’ils ont manqué jusqu’à présent. Vraiment, lorsqu’on vous
demande qui est le programmeur, vous devriez pouvoir dire que vous êtes et non
El
le MCC. Lorsque vous prenez le temps d’étudier comment écrire votre propre
code, vous constaterez que ce n’est pas aussi difficile que vous le pensiez au
départ. De plus, vous obtiendrez une meilleure récompense personnelle si vous
ur
écrivez tout vous-même. Le seul aspect des programmes que je laisse Microchip
faire pour moi est d’écrire les bits de configuration du code qui configurent le
PIC. C’est uniquement parce que c’est si simple à faire et que cela couvre toutes
so
ed
application pratique, plutôt qu’à des variantes du langage C standard (en gros, il
n’y a pas de différences).
La figure �.� illustre la structure d’un programme simple, en soulignant les parties
am
qui le composent.
oh
M
d
ou
A
El
ur
so
as
Après avoir lu ce chapitre, vous devriez être capable de créer un projet et d’écrire
un programme qui utilise les entrées des commutateurs et active les sorties. Nous
allons commencer par écrire un programme qui fera attendre le PIC jusqu’à
ce qu’un interrupteur connecté au bit � de PORTA passe au niveau haut. il
s’allumera alors une LED sur le bit � du PORTB. Le PIC attendra alors qu’un
deuxième interrupteur, connecté cette fois au bit � de PORTA, passe à l’état haut.
Lorsque cela se produit, la LED du bit � de PORTB s’éteint. Notez que les deux
commutateurs seront des commutateurs momentanés simples, c’est-à-dire qu’ils
� Programming Microcontrollers ��
ne resteront élevés que lorsqu’ils sont enfoncés ; quand ils seront relâchés, leur
logique baissera.
Tous les programmes doivent être planifiés. Le programmeur ne doit pas simple-
ment commencer à écrire du code dans l’IDE. Un bon programmeur doit écrire un
algorithme puis construire un organigramme puis écrire la liste du programme.
ed
L’algorithme
Il s’agit en fait de mettre simplement vos pensées sur la façon dont vous allez
am
amener le CIP à faire ce qui lui est demandé, sur papier. Le but est de concentrer
votre esprit sur la façon d’accomplir la tâche. Il vous permettra également de
choisir le bon PIC pour le travail. L’algorithme doit couvrir au moins les éléments
suivants :
oh
1! Vous devez expliquer la séquence d’événements que vous souhaitez con-
trôler.
1! Vous devez ensuite identifier tous les périphériques d’entrée et de sortie
M
dont vous aurez besoin.
1! Vous devez ensuite créer une liste d’attribution pour la commande et
identifier toutes les entrées ou sorties spéciales ou commandes dont vous
d
aurez besoin, telles que les entrées analogiques, les sorties PWM et toutes
les minuteries.
ou
Avant d’aller trop loin dans les profondeurs de MPLABX, je vais discuter de
l’utilisation de MCC et MPLAB Harmony. Microchip s’est rendu compte qu’il y a
de nombreux aspects de l’écriture de programmes pour le PIC qui doivent être
El
effectués dans chaque programme. Par conséquent, ils vous donnent la possibilité
d’utiliser leurs programmes de génération de code pour écrire le code pour
vous. MCC, MPLABX Code Configurator, est le programme qui le fait pour vous.
MPLAB Harmony fait cela pour les micros �� bits. Wow, n’est-ce pas génial? Ben
ur
pour contrôler son fonctionnement. Je crois fermement qu’il est important pour
vous, en tant que programmeur, de comprendre ce que vous contrôlez et comment
M
ed
am
oh
M
Il est à noter que Microchip sort constamment de nouvelles versions de son IDE.
Figure �.�: L’écran d’ouverture pour MPLABX
d
Cependant, les bases ne changent pas vraiment, et si vous apprenez à utiliser
une version de l’IDE, vous comprendrez très rapidement comment passer à la
ou
nouvelle version. Ce cours est basé sur la version �.� qui peut être téléchargée sur
le site Web de Microchip.
Après avoir installé le logiciel et ouvert le programme, un écran qui ressemble à
A
Pour créer un nouveau projet, cliquez avec la souris sur le deuxième symbole,
� Programming Microcontrollers ��
le carré orange avec la petite croix verte, dans la barre de menu, comme illustré
à la Figure �.�. Vous pouvez également sélectionner un fichier dans la barre de
ed
am
oh
Figure �.��: Sélectionnez la fenêtre de
M
l’appareil
Nous pouvons maintenant choisir quel PIC nous utiliserons réellement. À côté
de la fenêtre « Famille », cliquez sur la flèche et sélectionnez les MCU � bits
avancés (PIC��) comme indiqué précédemment. Ensuite, à côté de la fenêtre
"Périphérique", cliquez sur la flèche et sélectionnez le périphérique PIC��f����
comme indiqué ou le microcôntrolleur de votre choix. Notez que vous pouvez
taper le numéro du PIC dans la boîte de l’appareil et le programme déplacera la
fenêtre vers le PIC pertinent. Une fois que vous êtes satisfait de votre sélection,
� Programming Microcontrollers ��
cliquez sur Suivant pour passer à la fenêtre suivante, comme illustré à la Figure .
ed
am
oh
M
Figure �.��: La fenêtre d’outil de sélection
dans la Figure
El
ur
so
as
M
Cette fenêtre montre quels compilateurs ont été installés sur votre système. En
supposant que vous ayez un compilateur XC� approprié, vous devriez pouvoir
le sélectionner comme illustré à la Figure . Une fois que vous l’avez sélectionné,
cliquez sur Suivant et la fenêtre illustrée à la Figure s’affiche.
Cette fenêtre est l’endroit où vous donnez un nom à votre projet et décidez où
vous voulez l’enregistrer. Assurez-vous de savoir où vous enregistrez votre projet
� Programming Microcontrollers ��
ed
am
Figure �.��: Nommer le projet
oh
et nommez-le « myFirst��F », comme illustré à la Figure . Notez que j’utiliserai la
méthode d’utilisation de camel Font pour écrire des étiquettes. Cela permet au
M
programmeur d’écrire plusieurs mots en un seul mot. le la première lettre du mot
complet est en minuscule, mais la première lettre de tous les mots suivants est
en majuscule comme dans « myFirst��F ». Cliquez maintenant sur Terminer et le
d
projet sera créé. La fenêtre principale s’affichera maintenant, comme illustré à la
Figure .
ou
Nous devons maintenant ajouter le document texte qui contiendra toutes les
instructions « C » pour le programme. Ce sera le fichier source, et nous devons
donc cliquer avec le bouton droit de la souris sur les fichiers source des éléments
A
dans l’arborescence du projet sur le côté gauche. Cliquez maintenant avec la souris
sur Nouveau, puis sélectionnez main.c dans la fenêtre contextuelle qui apparaît.
Après avoir sélectionné le fichier main.c dans la fenêtre contextuelle, la fenêtre
El
ed
am
Figure �.��: La fenêtre d’édition
C’est dans cet écran que vous taperez toutes les instructions de votre programme.
Le logiciel a déjà inséré des commentaires des lignes � à �. C’est parce que le
oh
logiciel utilise intelli-sense qui est comme un texte prédictif sur votre téléphone.
Ce logiciel a également automatiquement ajouté une directive « include » à la ligne
�, et il a inclus la boucle principale entre les lignes �� et ��. Nous en dirons plus à ce
M
sujet plus tard. Si les numéros de ligne ne sont pas affichés dans l’éditeur de texte
et que vous souhaitez les voir, comme je le fais, cliquez simplement sur le mot
« Affichage » dans la barre de menu principale. Cochez ensuite la case "Afficher
les numéros de ligne" qui apparaît dans le menu déroulant, ou décochez-la selon
d
vos préférences. Cependant, par expérience, je pense qu’il est utile d’afficher les
numéros de ligne car cela aide à trouver les erreurs dans votre codage. Nous
ou
illustrée à la Figure .
El
ur
so
as
M
Une fois que vous êtes satisfait de votre choix, cliquez sur OK. J’ai sélectionné les
polices et les couleurs, puis j’ai changé la couleur des commentaires en magenta.
� Programming Microcontrollers ��
Vous venez de créer votre premier projet dans MPLABX. Vous devez pratiquer le
processus de création d’un projet afin que vous soyez à l’aise avec le processus.
Cela prendra du temps mais cela en vaut vraiment la peine. Ne vous contentez
pas de modifier un ancien projet.
ed
écrivant le code du programme. Si vous n’avez jamais écrit de programme en
« C », vous devrez peut-être lire certaines choses à ce stade.
am
Les principaux aspects d’un programme « C »
oh
les applications Windows et maintenant les microcontrôleurs. Le programme
« C » pour les PIC possède toutes les fonctions de base d’un programme « C »,
mais il existe également des instructions spécifiques liées aux PIC, telles que
M
PORTAbits.RA�.
L’aspect principal d’un programme « C » est qu’il s’exécute à l’intérieur d’une série
de boucles. Il existe une boucle « principale » à partir de laquelle toutes les autres
d
boucles, parfois appelées fonctions, mais je préfère les appeler sous-routines,
sont appelées. La boucle principale doit être présente dans le programme car
ou
c’est la boucle "principale" vers laquelle le micro doit aller au tout début du
programme pour obtenir la première instruction du programme. Le micro exécute
ensuite les instructions de manière séquentielle les unes après les autres jusqu’à
ce qu’il atteigne la dernière instruction de la boucle principale. A moins que cette
A
Le premier programme que nous examinerons est une tâche très courante, celle
d’attendre qu’un interrupteur soit enfoncé ou allumé, puis d’allumer une LED
so
types principaux de commentaires : des commentaires sur une seule ligne, qui
expliquent généralement ce que fait l’instruction en cours, et plusieurs lignes ou
un paragraphe de commentaires, qui donnent une explication plus approfondie.
M
Les commentaires simples sont tout ce qui est écrit sur la ligne en cours après
deux barres obliques telles que //. Les commentaires sur plusieurs lignes sont
tout ce qui est écrit entre les symboles suivants /⇤ ⇤ /comme indiqué ici, par
exemple, /⇤ Vos commentaires vont ici ⇤/. Après avoir créé votre nouveau fichier
’C’, la première chose que vous devez faire est d’insérer des commentaires pour
dire à tout le monde qu’il s’agit de votre programme et quand vous l’avez écrit.
Cependant, comme il s’agit d’un point de départ courant pour les programmeurs,
l’intelli-sense a déjà fait quelques commentaires. Vous pouvez ou non les modifier.
Cependant, pour essayer de conserver tout ce que vous voyez sur vos écrans
comme dans mes captures d’écran, je vous suggère de supprimer tout ce qui se
trouve actuellement dans la fenêtre d’édition de texte afin d’avoir une fenêtre
de texte vide dans l’éditeur. Vous devez maintenant saisir les commentaires et
� Programming Microcontrollers ��
commandes suivants afin que votre écran soit exactement le même que le mien et
que mes références correspondent à vos écrans.
1 /* Un programme de base pour allumer et teindre une LED. R d i g par M. �.�: Premier programme.
Listing
Alpha en date du 22/12/2021 pour le 18f4525 PIC */
2 /*Aucune modification ce jour */
3
4 \#include <xc.h>
5 vide principal (vide)
6 {
7 retourner;
ed
8 }
Évidemment, vous devez utiliser votre propre nom et la date du jour. Notez
également que lorsque vous écrivez le texte dans l’éditeur de texte, l’intelli-sense
am
donnera au texte les couleurs appropriées car il existe différentes couleurs pour
différents types de mots-clés. Ceux-ci doivent être placés en haut de votre fichier
programme dans la fenêtre principale de l’éditeur. Cela devrait occuper les neuf
premières lignes et le curseur devrait maintenant clignoter à la ligne dix, prêt
oh
pour la prochaine entrée.
Notez que vous pouvez utiliser ces commentaires pour garder une trace de
toutes les modifications qui sont apportées et quand elles ont été apportées. La
M
prochaine chose que vous devez faire est de dire au PIC comment nous avons
l’intention d’utiliser certains de ses principaux attributs de variables. C’est parce
que tous les PIC sont très polyvalents dans la mesure où, entre autres, ils peuvent
être exécutés à partir d’une grande variété d’oscillateurs. Notez que toutes les
d
instructions du programme et toutes les autres actions sont synchronisées sur un
ou
signal d’horloge. Ce signal d’horloge peut obtenir sa source d’une grande variété
d’oscillateurs différents, du simple RC basse fréquence, résistance-condensateur,
oscillateur à l’oscillateur à cristal haute fréquence précis. Ces sources d’oscillateur
peuvent être externes ou internes à L’image. Le programmeur doit indiquer au PIC
A
configurent comment nous allons utiliser le PIC. Ceci peut être réalisé en utilisant
une fenêtre spéciale dans l’IDE MPLABX. Pour ouvrir cette fenêtre, cliquez sur le
mot « Fenêtre » dans la barre de menu principale, puis sélectionnez « Vues de la
mémoire cible » dans le menu déroulant, puis sélectionnez Bits de configuration
ur
dans le menu déroulant qui apparaît. Une fois cela fait, votre fenêtre principale
deviendra celle illustrée à la Figure �.��.
so
as
M
Vous devrez peut-être faire glisser la fenêtre vers le haut pour l’agrandir, comme
indiqué. Je dois m’excuser à ce stade, car je ne vais pas vous montrer comment
� Programming Microcontrollers ��
ed
sur la petite flèche, une petite fenêtre s’ouvre. Si vous déplacez la sélection vers la
suivante, ce sera celle que nous voulons, INTIO��, ce qui signifie utiliser le bloc
oscillateur interne comme source principale et laisser les bits � et � sur PORTA
comme bits d’entrée-sortie normaux. Par conséquent, cliquez avec la souris sur le
am
terme INTIO�� pour changer l’oscillateur en cette option.
Les autres changements sont plus simples car nous devons régler le WDT sur
« OFF ». Il est important de désactiver le WDT, la minuterie du chien de garde,
oh
comme si rien ne se passait pendant une période de temps prédéfinie dans un
programme, le WDT arrêtera le programme. Nous ne voulons pas que cela se
produise, nous devons donc désactiver le WDT. Cela se fait en cliquant avec la
souris sur la petite flèche à côté du WDT et en cliquant avec la souris sur l’option off.
M
La dernière option que je change habituellement est l’option LVP, "Programmation
basse tension". J’ai l’habitude de désactiver cela. Ceci est désactivé de la même
manière que le WDT a été désactivé.
d
Une fois que vous avez modifié ces paramètres, nous pouvons générer le code
source, puis coller ce code dans notre programme. Cliquez sur l’onglet "Générer le
ou
code source vers la sortie" affiché en bas de l’IDE. Le code source doit apparaître
dans la fenêtre de sortie à l’écran. Utilisez la souris pour sélectionner tout ce code,
puis copiez-le tout et collez-le dans le fichier c "myFirst��FProg.c" que vous avez
A
dans la fenêtre ouverte. Vous devez également coller tous les différents mots de
configuration et les commentaires dans votre fichier « C », mais vous n’avez pas
besoin de copier la ligne « include <xc.h> » car intelli-sense l’a déjà inséré. Nous
El
apprendrons bientôt l’importance de cette ligne « include <xc.h> ». J’ai collé ces
instructions source dans ma fenêtre de fichier ouvert à partir de la ligne � et se
terminant à la ligne ��. Cela déplace le "include <xc.h> " jusqu’à la ligne ��. Le
vôtre peut différer en raison des commentaires que vous avez mis. Votre écran
ur
Le include <xc.h> est important car nous devons dire au compilateur nous voulons
utiliser des étiquettes pour représenter toutes les adresses que nous utiliserons.
Les adresses les plus importantes que nous utiliserons sont les adresses des SFR,
Special Function Registers. C’est avec ces SFR que le programmeur peut contrôler
� Programming Microcontrollers ��
chaque aspect du PIC avec les "�" et les "�" qu’ils écrivent dans ces registres de
contrôle. Le compilateur veut vraiment utiliser l’adresse des registres. Cependant,
nous, les humains, pouvons vouloir utiliser des étiquettes pour donner les noms
du registre au lieu d’utiliser le numéro d’adresse réel.
Un exemple d’utilisation d’une étiquette est PORTA. Il s’agit d’un SFR à l’adresse
�XF�� dans ce PIC. Le compilateur n’a besoin que du nombre hexadécimal « F�� » ;
notez que le « �X » signifie hexadécimal. Cependant, pour rendre le programme
plus facile à lire pour nous, les humains, nous voudrions utiliser l’étiquette PORTA.
Pour permettre cela, nous devons indiquer au compilateur que cette étiquette, et
ed
les autres étiquettes, représentent la bonne adresse des SFR. Il y a une instruction
simple qui fait cela qui est EQU PORTA �XF��. Cela indique au compilateur que
l’étiquette PORTA signifie en fait le nombre F�� au format hexadécimal. Pour
nous aider à faire cela, et économiser beaucoup de travail, quelqu’un a écrit les
am
EQU pour toutes les étiquettes pour tous les SFR que nous pourrions utiliser.
Cependant, pour utiliser ces équivalences, nous devons dire au compilateur de les
inclure dans notre programme. Cela se fait en utilisant la ligne « include <xc.h> »
dans notre programme. N’oubliez pas qu’il existe un programme « Linker » dans
oh
l’IDE. Cela relie notre propre programme et tous les fichiers d’en-tête que nous
indiquons au programme Linker dans « include » ; mais nous DEVONS dire au
programme de liaison de les inclure. Celui-ci est inséré maintenant dans notre
M
fichier programme. Plus tard, nous devrons peut-être utiliser d’autres fichiers
d’inclusion. Nous expliquerons l’importance de ce « include <xc.h> » avec un
exemple plus tard.
Nous sommes presque prêts à commencer à écrire notre programme. Une chose
d
très importante à retenir est que tous les programmes « C » et « C++ » utilisent
ou
principale, toutes les autres boucles, que j’appellerai des sous-programmes, qui
sont utilisées pour exécuter différents aspects du programme, sont appelées.
El
Le TRISA et le TRIB
Nous utiliserons PORTA comme port d’entrée, auquel les deux commutateurs
seront connectés, et PORTB comme port de sortie, auquel toutes les LEDS sera
connecté à. Cependant, le PIC n’a aucune idée de la manière dont nous voulons
so
utiliser les PORTS. Chaque port peut être un port d’entrée ou de sortie. En effet,
nous pouvons les mélanger beaucoup plus car chaque bit individuel du port
peut être soit en entrée, soit en sortie et avec le ��F����, chaque PORT a � bits.
as
Nous, en tant que programmeurs, devons dire au PIC comment nous voulons
utiliser les PORTS et leurs bits. Cela nécessite de régler certaines des broches
d’E/S en entrée et d’autres en sortie. Notez que tous les PIC ont au moins deux
M
PORTS qui peuvent être utilisés pour permettre au PIC de communiquer avec le
monde extérieur. Les PORTS sont identifiés comme PORT A, B, C, etc. Chaque
PORT aura un certain nombre de bits individuels qui peuvent être définis pour
prendre des données dans le PIC, c’est-à-dire être des entrées, ou pour envoyer
des données hors du PIC, c’est-à-dire être des sorties. Un PIC � bits tel que le
��F���� a jusqu’à � bits sur chaque PORT, tandis que les PICS �� bits ont jusqu’à
�� bits par PORT. Le PIC ne sait pas quel type vous voulez que les bits soient, en
entrée ou en sortie.
En tant que programmeur, vous devez indiquer au PIC, au moyen d’instructions
dans votre programme, quel type vous voulez que les bits de chaque port soient.
Pour vous permettre de faire cela, il existe des SFR, Special Function Registers,
appelés TRIS qui permettent de le faire. Il y a un TRIS pour chaque PORT, et
� Programming Microcontrollers ��
chaque TRIS a le même nombre de bits que chaque PORT. Le bit particulier de
chaque TRIS est mappé sur le même bit dans le PORT correspondant, comme
illustré à la Figure �.��.
Dans notre premier programme, nous allons faire tous les bits sur les entrées
PORTA et tous les bits dans PORTB comme sortie.
Les instructions suivantes, avec leurs commentaires respectifs, feront le néces-
ed
saire. Figure �.��: La cartographie du TRIS sur le
PORT
1 rend �.�: Premier programme.
TRISA = 0 x F F ; //Faire de tous les bits de TRISA un ’1’ logique qui Listing
am
2 tous les bits sur les e n t r e s PORTA
3 TRISB = 0 x 0 0 ; //Faire de tous les bits de TRISB un ’0’ logique qui rend
4 tous les bits sur les sorties PORTB
Notez que le �x devant les données signifie que nous utilisons des nombres
hexadécimaux. En effet, nous n’avons besoin d’utiliser que � chiffres, car � chiffre
oh
hexadécimal représente � bits binaires. Peu importe si nous utilisons des lettres
minuscules ou majuscules pour ces chiffres. Notez également que nous utilisons
le point-virgule, ’;’ après les données OXFF. Ceci indique la fin de l’instruction en
M
cours. Notez également l’utilisation de commentaires sur une seule ligne pour
expliquer ce que fait l’instruction ; veuillez noter que dans l’éditeur de texte de
MPLABX, ces commentaires seraient sur une seule ligne. La dernière des deux
instructions aurait pu s’écrire comme suit : TRISB = � ; Cela fera de tous les bits
d
de TRISB un « � » logique qui définit tous les bits de PORTB sur les sorties. Cela
ou
utilise la base par défaut, ou le système de nombres, utilisé dans MPLABX, qui
est décimal. L’instruction TRISB = � ; signifie que la valeur stockée dans le TRISB
serait zéro, c’est-à-dire �b�������� ou �X��. Une chose très importante à noter
est que nous utilisons des majuscules dans le mot TRISA et TRISB ; c’est parce
A
que c’est ainsi que les étiquettes ont été définies dans le fichier d’inclusion que
nous utilisons. Vraiment, le micro voit TRISA comme la valeur numérique de
�XF�� qui est l’endroit où se trouve le SFR dans la mémoire du PIC. NB : Notez
El
d’inclusion contient toutes les étiquettes que nous utiliserons pour les SFR, et elles
sont toutes en majuscules. Par exemple, si nous voulons allumer toutes les LED ou
tous les appareils connectés au PORTB, nous devrons écrire PORTB = �b��������;
Noter portb = �b��������; ne fonctionnerait pas car l’étiquette pour PORTB doit
so
équivalent décimal de �b�������� et decimal est la base par défaut pour MPLABX
.
M
Not Used Not Used VCFG� VCFG� VCFG� VCFG� VCFG� VCFG�
ed
� negative reference from VDD
am
B� B� B� B� AN� AN� AN AN� AN� AN� AN� AN� AN� AN� AN� AN� AN�
�� �� ��
� � � � A A A A A A A A A A A A A
� � � � A A A A A A A A A A A A A
oh
� � � � A A A A A A A A A A A A A
� � � � D A A A A A A A A A A A A
� � � � D D A A A A A A A A A A A
� � � � D D D A A A A A A A A A A
M
� � � � D D D D A A A A A A A A A
� � � � D D D D D A A A A A A A A
� � � � D D D D D D A A A A A A A
� � � � D D D D D D D A A A A A A
d
� � � � D D D D D D D D A A A A A
� � � � D D D D D D D D D A A A A
ou
� � � � D D D D D D D D D D A A A
� � � � D D D D D D D D D D D A A
� � � � D D D D D D D D D D D D A
A
� � � � D D D D D D D D D D D D D
Le réglage par défaut est qu’ils sont tous analogiques. Notez qu’une entrée
El
nous montre que nous pouvons programmer le PORT pour qu’il soit l’une des
nombreuses variantes de tous les bits étant analogiques à tous les bits étant
numériques.
as
Le tableau �.�fait référence aux bits du registre ADCON� qui est un registre à �
bits qui contrôle certains aspects de l’ADC. Le principe derrière l’ADC est qu’il
M
n’y a qu’un seul circuit ADC à l’intérieur du PIC qui peut être commuté sur l’une
des �� entrées pouvant avoir une entrée analogique connectée. Il s’agit d’une
méthode appelée « multiplexage » où le � CAN dessert �� entrées analogiques
possibles. L’ADC créera alors un nombre binaire qui représente la tension réelle
appliquée à l’entrée. L’ADC utilisé dans le PIC est un ADC �� bits qui donne au
programmeur une résolution possible des éléments suivants : La résolution de
l’ADC est la plus petite valeur qu’il puisse reconnaître. Cela peut être calculé en
utilisant l’expression suivante.
'0= 64
'4 B>;DC8>= =
2=
5
'4 B>;DC8>= = = 4.833<+
210
� Programming Microcontrollers ��
C’est-à-dire si nous utilisions tous les �� bits, et comme il s’agit d’un micro � bits, il
y a un problème avec cela, mais nous y reviendrons plus tard. L’ADC est contrôlé
par trois registres ; ADCON�, ADCON� et ADCON�. L’ADCON� contrôle quelle
plage de tension est utilisée et si le bit sur le port est analogique ou numérique.
L’ADCON� contrôle si l’ADC est allumé et à quel bit ou canal l’ADC est connecté.
Le registre ADCON� contrôle la synchronisation de l’ADC ; nous examinerons
tous ces registres plus tard.
En fait, nous ne voulons pas utiliser l’ADC et nous voulons que tous les bits
connectés à PORTA soient numériques ; par conséquent, nous devons désactiver
ed
l’ADC et rendre tous les bits sur PORTA et PORTB numériques. C’est le bit �
du registre ADCON� qui active l’ADC, c’est-à-dire le bit � = �, ou le désactive,
c’est-à-dire le bit � = �. Par conséquent, mettez tous les bits du registre ADCON�
sur � logique. Cela définira b� à un « � » logique et ainsi désactiver l’ADC.
am
Ce sont les bits �, �, � et � du registre ADCON� qui déterminent si les bits sur
PORTA et PORTB sont des bits analogiques ou numériques. Ceci est montré
dans le Tableau �-�. Si le bit dans le registre ADCON� est un « � » logique, alors
oh
l’entrée serait une entrée analogique. Si le bit est un "�" logique, alors l’entrée
serait numérique. C’est un bon exemple de la façon dont les bits réels sont utilisés
pour contrôler les actions du PIC.
M
Comme nous avons besoin que toutes les entrées soient numériques, nous devons
nous assurer que tous ces quatre bits, les bits �, �, � et �, dans le registre ADCON�
sont définis sur le « � » logique.
Les instructions suivantes configureront l’ADC comme nous le souhaitons.
d
1 ADCON0 = 0x00; //This turns the ADC off Listing �.�: Premier programme.
ou
2 ADCON1 = 0x0F; //This sets all the bits on PORTA and PORTB as digital
Notez que ces instructions ont des commentaires qui sont séparés de la fin de
l’instruction, signifiés par le point-virgule « ; », avec l’utilisation de deux barres
A
obliques « // ». Cela signifie que tout ce qui est écrit après ces barres obliques sur
cette ligne courante sont des commentaires et ne sont pas compilés par le logiciel
de compilation. Les commentaires peuvent être utilisés pour aider à décrire ce
El
2 PORTA inputs
3 TRISB = 0x00;//Make all bits in TRISB a logic ’0’ which makes all bits on
4 PORTB outputs
so
5 ADCON0 = 0x00;//Makes all the bits in the ADCON0 logic ’0’ This turns the
6 ADC off
7 ADCON1 = 0x0F;//This make bits 7,6,5 and 4 logic ’0’//This make bits 7,6,5
as
Configuration de l’oscillateur
Nous avons utilisé les mots de configuration pour indiquer au PIC que nous
voulons utiliser le bloc d’oscillateur interne comme source d’oscillateur principal,
c’est-à-dire INTIO��. Cependant, nous n’avons pas dit au PIC quel oscillateur
nous voulons utiliser. Ce sont les bits du registre OSCCON , OSCillator CONtrol,
qui contrôlent le bloc oscillateur interne. Nous pouvons utiliser huit fréquences
d’oscillateur possibles et ce sont les bits b�, b� et b� qui contrôlent les paramètres.
Nous allons régler l’oscillateur sur �Mhz et rendre la fréquence stable. Pour régler
la fréquence de l’oscillateur sur � Mhz, nous réglons les trois bits, b�, b� et b�, sur
un « � » logique. Pour rendre la fréquence stable, nous définissons le bit � sur un
« � » logique.
� Programming Microcontrollers ��
ed
Does not oscillator not oscillator
enter sleep running not stable
am
Table �.�: Bits �, �, and � of OSCON� Register
Bit � Bit � Bit � Oscillator frequency Setting the Oscillator Frequency
ICRF� ICRF� ICRF�
a Le �� kHz peut provenir de l’oscillateur
� � � ��Khza
principal divisé par ��� ou directement de
� � � ���Khz l’oscillateur RC interne
oh
� � � ���Khz
� � � ���Khz
� � � �Mhz
� � � �Mhz
M
� � � �Mhz
� � � �Mhz
d
Nous devons dire au PIC où il obtiendra le signal pour l’horloge système. Il
y a trois options possibles contrôlées par les bits b� et b� de ce registre. Cela
ou
nous donnerait trois options, en fait quatre, mais nous n’en voulons que trois.
Cependant, comme nous avons défini la source de l’oscillateur principal dans les
mots de configuration comme étant l’oscillateur interne, les deux options sont
A
les mêmes. Nous pouvons simplement définir ces deux bits sur logique ’�’ car la
source principale est le bloc oscillateur interne. Le bit � du registre OSCCON est
le bit IDLEN qui est utilisé pour le mode veille. Nous n’utiliserons ce mode que
El
bien plus tard ; par conséquent, définissez ce bit sur un « � » logique. Le bit � est
en fait un signal du micro au programmeur afin que celui-ci puisse également
être réglé sur un « � » logique.
ur
Cela signifie que les huit bits du registre OSCCON peuvent être définis comme
suit :
1 Listing �.�: Premier programme.
OSCCON = 0b01110100;//This sets the internal oscillator to 8MHz and makes
so
2 it stable.
Les tableaux �.� à �.� devraient aider à expliquer ces paramètres L’appareil se
as
Maintenant que nous avons configuré les PORTS, nous devons faire attendre le
PIC jusqu’à ce que le commutateur connecté au bit � de PORTA passe à un "�"
logique. Cela se produira si l’interrupteur est configuré de telle sorte que lorsqu’il
est enfoncé, le niveau logique passe à un niveau élevé, c’est-à-dire à � V ou à « � »
ed
logique.
Il existe un certain nombre de façons de le faire, mais il s’agit essentiellement
de tester le bit pour voir s’il a atteint un niveau élevé. Le moyen le plus simple
am
consiste à faire attendre le micro jusqu’à ce que l’entrée passe au niveau haut.
Ensuite, lorsque l’entrée devient élevée, passez à autre chose et faites quelque
chose. Vous pensez peut-être que vous devriez continuer à vous poser la question
: est-ce que la contribution est devenue élevée ? Le problème avec cette approche
oh
est que vous devez faire reculer le micro et poser à nouveau la question si l’entrée
n’est pas montée au niveau haut. Cependant, une autre façon de considérer ce
test est de dire que tant que l’entrée est faible ou faible, ne faites rien. En effet,
c’est l’approche que nous utilisons dans un programme "C". Cela peut être fait en
1
2
utilisant une commande while comme indiqué ici :
while (PORTAbits.RA0 == 0)
{ M
d
3 }
ou
Le concept de cette instruction while est que tandis que la condition de test, écrite
en GRAS seulement cette fois-ci pour rendre évident ce que l’on entend par le test,
exprimée à l’intérieur des accolades normales est vraie, exécute les instructions
qui sont écrites entre les accolades . Dans ce cas, il n’y a pas d’instructions entre
A
les accolades, et donc le micro ne fait rien. Nous utilisons le signe double = =
pour dire qu’il devient égal à. Cela signifie que le test est alors que PORTA bit �
devient égal à �, le test est vrai, et donc faites ce que je dis ; dans ce cas, ce qui est
El
à l’intérieur des accolades, ce qui n’est rien. De cette façon, l’instruction dit que
tant que l’entrée sur le bit � de PORTA est au "�" logique, ne faites rien.
Notez que vous pouvez signifier le bit d’un PORT comme indiqué précédemment,
ur
Cela fait exactement la même chose. Notez également que nous utilisons le ’;’
M
ed
am
oh
M
Figure �.��: La fenêtre d’édition
en utilisant
1 PORTBbits.RB0 = 1; //Turn on what is connected to b0 of PORTB
ur
Nous pouvons maintenant faire attendre le PIC qu’un interrupteur d’arrêt soit
so
enfoncé pour que le micro puisse ensuite désactiver la sortie sur le bit � du PORTB.
Cela peut être fait comme suit:
as
Notez que nous devons mettre toutes les instructions à l’intérieur de la boucle
principale. Les instructions de programme réelles qui commencent à �� et se
terminent à la ligne �� du programme du Listing �-� doivent aller à l’intérieur des
accolades de la fenêtre d’édition. Pour vous aider à apprécier, cet écran devrait se
terminer comme illustré à la Figure �.��.
Une fois que nous avons écrit toutes les instructions pour le premier programme,
le La fenêtre de l’éditeur doit ressembler à celle montrée ici dans le Listing �-�.
1 /*A basic program to turn on and off a led. Listing �.�: The Completed LED Start Stop
2 Program Instructions
3 No modifications at this date*/
4 // PIC18F4525 Configuration Bit Settings
5 // C’ source line config statements.
� Programming Microcontrollers ��
6
7 // CONFIG1H
8 #pragma config OSC = INTIO67 // Oscillator Selection bits (Internal
9 oscillator block, port function on RA6
10 and RA7)
11 #pragma config FCMEN = OFF // Fail-Safe Clock Monitor Enable bit
12 (Fail-Safe Clock Monitor disabled)
13 #pragma config IESO = OFF // Internal/External Oscillator Switchover
14 bit (Oscillator Switchover mode disabled)
15 // CONFIG2L
ed
16 #pragma config PWRT = OFF // Power-up Timer Enable bit (PWRT disabled)
17 #pragma config BOREN = SBORDIS// Brown-out Reset Enable bits (Brown-out
18 Reset enabled in hardware only
19 (SBOREN is disabled))
am
20 #pragma config BORV = 3 // Brown Out Reset Voltage bits (Minimum
21 setting)
22 // CONFIG2H
23 #pragma config WDT = OFF // Watchdog Timer Enable bit(WDT disabled
24 (control is placed on the SWDTEN bit))
oh
25 #pragma config WDTPS = 32768 // Watchdog Timer Postscale Select bits
26 (1:32768)
27 // CONFIG3H
M
28 #pragma config CCP2MX = PORTC // CCP2 MUX bit (CCP2 input/output is
29 multiplexed with RC1)
30 #pragma config PBADEN = ON // PORTB A/D Enable B<4:0> pins are
31 configured as analog input channels
d
32 on Reset)
33 #pragma config LPT1OSC = OFF // Low-Power Timer1 Oscillator Enable bit
ou
34 (Timer1 configured for higher power
35 operation)
36 #pragma config MCLRE = ON // MCLR Pin Enable bit (MCLR pin enabled;
37 RE3 input pin disabled)
A
38 // CONFIG4L
39 #pragma config STVREN = ON // Stack Full/Underflow Reset Enable bit
40 (Stack full/underflow will cause Reset)
#pragma config LVP = ON // Single-Supply ICSP Enable bit (Single-
El
41
42 Supply ICSP enabled)
43 #pragma config XINST = OFF // Extended Instruction Set Enable bit
44 (Instruction set extension and
ur
55 #pragma config CPB = OFF // Boot Block Code Protection bit (Boot
56 block (000000-0007FFh)
57 not code- protected)
58 #pragma config CPD = OFF // Data EEPROM Code Protection bit (Data
59 EEPROM not code-protected)
60 // CONFIG6L
61 #pragma config WRT0 = OFF // Write Protection bit (Block 0
62 (000800-003FFFh) not write-protected)
63 #pragma config WRT1 = OFF // Write Protection bit (Block 1
64 (004000-007FFFh) not write-protected)
65 #pragma config WRT2 = OFF // Write Protection bit (Block 2
66 (008000-00BFFFh) not write- protected)
67 // CONFIG6H
68 #pragma config WRTC = OFF // Configuration Register Write Protection
� Programming Microcontrollers ��
ed
79 table reads executed in other blocks)
80 #pragma config EBTR1 = OFF // Table Read Protection bit (Block 1
81 (004000- 007FFFh) not protected from
82 table reads executed in other blocks)
am
83 #pragma config EBTR2 = OFF // Table Read Protection bit (Block 2
84 (008000-00BFFFh) not protected from
85 table reads executed in other blocks)
86 // CONFIG7H
87 #pragma config EBTRB = OFF // Boot Block Table Read Protection bit
oh
88 (Boot Block (000000-0007FFh) not
89 protected from table reads executed
90 in other blocks)
M
91
92 #include <xc.h>. // the directive to include the header
93 file xc.h
94 void main(). // this is where the micro goes to
d
95 find the first instruction of the
96 program
ou
97 { // the opening of the main loop
98 TRISA = 0xFF; // Make all bits on PORTA inputs
99 TRISB = 0x00; // Make all bits on PORTB outputs
100 ADCON0 = 0x00; // This turns the ADC off
A
101 ADCON1 = 0x0F; // This sets all the bits on PORTA and
102 PORTB as digital
103 OSCCON = 0b01110100; // set the internal oscillator to 8 Mhz
stable
El
104
105 while (PORTAbits.RA0 == 0);// Do nothing while the logic at b0 of
106 PORTA is atlogic ’0’ When it goes to a
107 logic ’1’ move to next instruction.
ur
Notez que c’est la seule fois où je montrerai toutes les instructions, y compris les
M
Cela se fait en utilisant une autre instruction while. Le format est indiqué dans le
listing �-�.
1 void main() Listing �.�: La boucle While (�) insérée
//this is where the micro goes to find the first
2 instruction of the program
3 { //the opening of the main loop
4 TRISA = 0xFF; //Make all bits on PORTA inputs
5 TRISB = 0x00; //Make all bits on PORTB outputs
6 ADCON0 = 0x00; //This turns the ADC off
7 ADCON1 = 0x0F; //This sets all the bits on PORTA as digital
8 OSCCON = 0b01110100; //set the internal oscillator to 8Mhz stable
ed
9
10 while (1) //While the result of the test is true do what is
11 inside the curly brackets. Note the result of
am
12 the test will be a logic’1’ if it were true and
13 a logic’0’ if it were untrue. The test is
14 specified inside the normal brackets. This test
15 is simply a logic’1’ which will always be true
16 as it is always a logic ’1’ This means the micro
oh
17 will always carry out the instruction inside the
18 curly brackets. That is why it is called the
19 forever loop. It will always be true and the
20 micro will carryout the instructions written
M
21 between the two curly brackets forever.
22 { //the opening curly bracket of the for ever loop
23 while (PORTAbits.RA0 == 0); //Do nothing while the logic at b0 of PORTA
24 is at logic ’0’
d
25 PORTBbits.RB0 = 1; //Turn on what is connected to b0 of PORTB
26 while (PORTAbits.RA1 == 0); //Do nothing while the logic at b1 of PORTA
ou
27 is at logic ’0’.
28 PORTBbits.RB0 = 0; //Turn on what is connected to b0 of PORTB
29 } //the closing of the for ever loop
A
La boucle while (�), entre les lignes �� et ��, exécutera les instructions données
à l’intérieur des accolades s’il y a plus d’une instruction tant que le test est vrai.
El
Pour que le test soit vrai, le résultat logique du test doit être un "�" logique. Il est
assez évident que le résultat du test (�) sera toujours un ’�’ logique, et donc le
micro doit toujours exécuter les instructions écrites à l’intérieur des accolades.
C’est-à-dire qu’il s’agit d’une boucle permanente ou, plus correctement, d’une
ur
boucle inconditionnelle. Cela signifie que le micro exécutera les cinq premières
instructions qui sont en dehors de cette boucle while (�), mais à partir de là, le
micro sera coincé à l’intérieur de la boucle while (�), et donc il n’exécutera jamais
so
les cinq premières instructions encore. Génial car c’est exactement ce que nous
voulons.
as
Notez également qu’aux lignes �� et ��, le mot continuer a été supprimé car il
n’est pas nécessaire. L’instruction ne fait toujours rien, alors que le test est true
car il n’y a pas d’instructions entre le crochet fermant de l’instruction de test et le
M
Tester le programme
ed
am
oh
M
Figure �.��: L’écran d’édition avec la fenêtre
de stimulation ouverte
Figure �.��: L’option de fenêtre de stimulation
quelle action a lieu lorsque les entrées sont déclenchées. Pour ajouter RA�, cliquez
simplement avec la souris sur la case vide sous le mot pin. Ce qui est montré dans
d
la Figure �.�� vous sera présenté.
ou
A
El
Vous pouvez faire défiler la petite fenêtre vers le bas pour trouver la broche RA�.
ur
Nous devons définir l’action pour basculer. Nous pouvons maintenant ajouter
une autre ligne à l’aide de la deuxième icône d’outil dans la fenêtre de stimulus,
comme illustré à la figure �.��.
so
as
M
Vous devriez vous retrouver avec ce qui est montré dans la Figure �-��.
Notez qu’il y a deux commentaires, un pour chaque bouton qui décrit ce que
fait le bouton ; vous devez taper un commentaire pour le commutateur. Nous
pouvons observer ce qui se passe en utilisant l’option de broche d’E/S de la même
option de simulateur dans le menu déroulant de l’option Windows dans la barre
de menu principale illustrée à la Figure �.��. Notez que cela peut ressembler un
peu à ��Pin dans la barre de menu, mais c’est I O pour Input/Output. Lorsque
vous utilisez la fenêtre des broches d’E/S, nous pouvons ajouter les broches que
� Programming Microcontrollers ��
nous voulons examiner. Nous devons sélectionner RA�, RA� et RB�. Ceci est
ed
illustré à la figure �.��.
am
Figure �.��: The Input Output PIN Selection
oh
Window
M
stimulus et la fenêtre des broches d’E/S en même temps. Vous pouvez faire glisser
et déplacer la fenêtre de stimulus pour essayer de les organiser comme illustré à
la Figure �.��.
d
ou
A
El
ur
ed
Cependant, nous pourrions construire et démarrer la simulation en une seule
opération. Pour effectuer ce processus, il vous suffit de cliquer avec la souris sur
l’icône Debug Main Project dans la barre de menu, comme illustré à la Figure
�.��.
am
oh
Figure �.��: The Debug Main Project Icon
M
Lors de la compilation, une nouvelle fenêtre de sortie devrait apparaître en bas
de la fenêtre MPLABX. Cela montre la progression de la compilation. Une fois
terminé, il indiquera où se trouvent les erreurs s’il y en a. Si la compilation est
d
réussie, elle doit montrer que le programme utilisateur est en cours d’exécution.
ou
fonctionnement du programme.
Cliquez sur l’icône Debug Main Project, comme illustré à la Figure �.��, et attendez
El
que le programme se compile avec succès. S’il y a des erreurs, vous devez revenir
en arrière et vérifier que vous avez tout tapé exactement comme indiqué ci-dessus
ou dans la liste complète des programmes présentée en annexe. Si une erreur se
produit, la ligne sera affichée en bleu avec un message d’erreur affiché dans la
ur
fenêtre de sortie. Si vous cliquez avec la souris sur cette ligne bleue, vous devriez
allez directement à cette ligne dans la fenêtre d’édition où se trouve l’erreur. Vous
devez être très prudent et vous assurer que vous avez tout tapé, à l’exception des
so
essayez de simuler des interrupteurs momentanés qui ne se ferment que tant que
vous gardez votre doigt sur le bouton.
Pour simuler cela avec le stimulus, vous devez cliquer deux fois avec la souris sur
le bouton de tir de ce commutateur. Le premier clic envoie la logique haut. Le
deuxième clic remet la logique à zéro. Lorsque vous faites cela, vous devriez voir
les broches d’E/S sur RB� et RA� passer au vert, ce qui signifie qu’il est allumé.
Vous devez maintenant cliquer à nouveau avec la souris sur la broche RA�, ce
qui fera passer la logique de cette broche à la logique « � ». Vous devriez voir
le voyant vert sur la broche d’E/S RA� s’éteindre mais le voyant vert sur le RB�
rester vert.
De cette façon, vous avez simulé l’appui sur l’interrupteur de démarrage mo-
mentané. Si vous effectuez maintenant le même processus sur le bouton d’arrêt,
� Programming Microcontrollers ��
ed
am
oh
M
d
ou
vous devriez voir le voyant vert sur RB� s’éteindre et le voyant vert sur RA�
s’allumer puis s’éteindre. De cette façon, vous avez simulé l’appui momentané de
El
l’interrupteur d’arrêt.
Si vous répétez maintenant tout le processus, vous devriez voir les voyants verts
sur les E/S s’allumer et s’éteindre correctement. Cela signifie que vous avez créé
ur
Ce programme est probablement l’un des programmes les plus simples que vous
as
puissiez écrire ; J’espère que vous l’avez trouvé assez simple. Il n’est donc vraiment
pas nécessaire de construire un circuit pratique pour cela. Il peut être plus excitant
de construire un circuit pratique d’un ensemble de feux de circulation qui est un
M
ed
am
oh
M
Figure �.��: The Edit Properties Window for
the PIC��f����
Vous verrez le symbole du répertoire à côté de la zone Program File dans la fenêtre.
d
Vous devez ouvrir la fenêtre du répertoire en cliquant avec la souris sur le symbole
de répertoire jaune, puis vous devez rechercher le fichier hexadécimal du projet.
ou
Si vous regardez la fenêtre de sortie après avoir construit le projet dans MPLABX,
vous trouverez en fait l’emplacement du fichier hexadécimal que vous recherchez.
Ceci est illustré à la figure �.��. Ce devrait être le seul fichier hexadécimal de ce
A
El
répertoire. Tu devrais cliquer sur Ouvrir pour insérer cet emplacement dans la
ur
boîte de fichier programme dans la fenêtre des propriétés dans PROTÉE. Une fois
que vous l’avez là-dedans, cliquez sur le bouton OK, et vous devrait revenir à la
fenêtre schématique. Vous devriez maintenant pouvoir exécuter la simulation
so
Si vous avez le bon logiciel pour PROTEUS, cela devrait devenir une méthode
très utile pour exécuter votre programme sans acheter beaucoup d’équipement.
Vous pouvez simuler presque tous les programmes PIC que vous écrivez à l’aide
M
de ce logiciel.
Un aspect très important que nous pouvons apprendre du schéma est l’utilisation
des résistances R�, R�, R� et R�. R� et R� sont liés aux deux entrées. L’entrée du
PIC est numérique, ce qui signifie que ce sera un « � » logique, c’est-à-dire � V
ou un « � » logique, c’est-à-dire � V. Cela signifie qu’il doit y avoir un chemin
vers l’une de ces deux tensions pour l’entrée. Un chemin devient actif lorsque le
bouton est enfoncé, et l’autre doit être actif lorsque le bouton n’est pas enfoncé.
Notez que vous ne devez jamais laisser un peu sur le port que votre programme
utilise non connecté. C’est ce qu’on appelle le flottement.
Si vous le laissez flotter, il flottera inévitablement au mauvais niveau logique et
peut perturber votre programme. Avec l’entrée RA�, l’entrée passe au �V logique
’�’ si le bouton n’est pas enfoncé. Cela doit être vrai car aucun courant ne sort du
� Programming Microcontrollers ��
PIC car il s’agit d’une entrée, et donc aucun courant ne traverse R�. Cela signifie
que la tension au sommet de R�, c’est-à-dire à l’entrée RA�, est la même que la
tension au bas de la résistance, car aucun courant ne la traverse. Comme la tension
au bas de R� est à la masse, la tension d’entrée de RA� est également à la masse
ou �V.
Lorsque le bouton de démarrage est enfoncé, le haut de R� qui est connecté à
l’entrée de RA� est connecté directement à VCC qui est de +�V. Cela signifie que
la tension à RA� passe à +�V, ce qui est le « � » logique. Notez que la résistance R�
est là pour limiter le courant à travers le commutateur à � mA, et ainsi protéger
ed
le commutateur lui-même. Cet agencement est appelé pull up car la fermeture
de l’interrupteur fait monter la tension jusqu’à VCC lorsque l’interrupteur est
fermé.
am
Lorsque le bouton de démarrage est enfoncé, le haut de R� qui est connecté à
l’entrée de RA� est connecté directement à VCC qui est de +�V. Cela signifie que
la tension à RA� passe à +�V, ce qui est le « � » logique. La même disposition
est utilisée pour RA� et même l’entrée MCLR. Cependant, le commutateur à
oh
l’entrée MCLR est appelé pull down car il abaisse le commutateur à � V lorsque
le commutateur est fermé.
Avec la sortie, sur RB�, la condition logique « � » met � V en haut de la LED verte.
M
Pour s’allumer réellement, la LED chute d’environ �,� V mais n’a besoin que
d’environ �� mA de courant direct pour briller. Cela signifie qu’il reste �,� volts à
laisser tomber sur la résistance R� ; puis sa valeur est fixée à ��� pour limiter le
courant à ��mA.
d
NB : Par mesure de précaution contre les étincelles ou les bruits à haute fréquence
ou