SlideShare une entreprise Scribd logo
1  sur  38
Télécharger pour lire hors ligne
Programmation des PIC en C


Microcontrôleur facile pour électronicien amateur

                   PARTIE 1




                     Noxyben
                      2007




                       -1-
Introduction ................................................................................................................................ 3
Intérêt de la programmation en langage C ................................................................................. 4
Choix du compilateur ................................................................................................................. 5
Choix d’un PIC : le 16F877 ....................................................................................................... 6
Choix du programmateur ........................................................................................................... 7
Structure du PIC 16F877............................................................................................................ 8
   Le cœur du PIC : le microprocesseur ..................................................................................... 9
   La mémoire .......................................................................................................................... 11
   La Pile et le Compteur Programme ...................................................................................... 13
   Les Ports d’Entrées/Sorties généraux : PORTA, PORTB, PORTC, PORTD, PORTE....... 15
   Le Port Parallèle Esclave (PSP : Parallel Slave Port) .......................................................... 17
   Le circuit de génération d’horloge ....................................................................................... 18
   Le TIMER0 .......................................................................................................................... 19
   Le TIMER1 .......................................................................................................................... 20
   Le TIMER2 .......................................................................................................................... 22
   Les modules CCP1 et CCP2................................................................................................. 23
   Le convertisseur Analogique – Digital 10bits :.................................................................... 25
   L’USART ............................................................................................................................. 27
   Le SSP, Synchronous Serial Port ......................................................................................... 29
   La logique de RESET........................................................................................................... 31
   L’In-Circuit Debugger.......................................................................................................... 33
   Low-Voltage Programming et ICSP (In-Circuit Serial Programming) ............................... 34
   Les Bits de Configuration .................................................................................................... 36
   Les Interruptions .................................................................................................................. 36
   Le mode SLEEP ................................................................................................................... 37
Brochage du PIC16F877 .......................................................................................................... 38
Conclusion................................................................................................................................ 38




                                                                    -2-
Introduction
Dans un passé pas très lointain, l’électronique pour les amateurs (éclairés) se
résumait essentiellement aux circuits analogiques et éventuellement en logique
câblée (portes logiques, compteurs, registres à décalage…). L’usage des
microprocesseurs était plutôt réservé à un public averti d’ingénieurs sachant les
interfacer avec différents circuits périphériques (eprom, ram…) et programmer en
assembleur.
Au fil du temps on a vu apparaître de nouveaux circuits regroupant dans une seule
puce le microprocesseur et ses circuits périphériques : les microcontrôleurs.
On en trouve maintenant partout : automobile, lave-vaisselle, rasoir, brosse à dent
électrique…
L’offre en microcontrôleurs s’est développée d’autant : plus de périphériques
intégrés, capacité de calcul accrue, plus de mémoire embarquée. Il y a maintenant
de nombreux fabricants de microcontrôleurs, possédant chacun plusieurs gammes
allant du circuit « généraliste », véritable couteau suisse électronique, à la puce
spécialisée dédiée par exemple, à la régulation de vitesse d’un moteur de ventilateur.
La voie royale pour tirer le maximum des performances de ces circuits est toujours la
programmation en assembleur. On accède alors au moindre bit enfoui dans
n’importe quel registre du circuit. Cela nécessite néanmoins un investissement en
temps conséquent, l’assembleur n’étant pas un langage très « naturel ». De plus,
d’un constructeur à l’autre, voire d’un circuit à l’autre dans la même gamme, il existe
des différences qui obligent à réapprendre tout ou partie du langage lorsque l’on
change de microcontrôleur. C’est un investissement intéressant pour un
professionnel qui cherche à produire un code optimisé sur la puce la moins chère
possible, mais pénible pour un amateur qui ne dispose que de relativement peu de
temps pris sur ses loisirs.
Heureusement, avec la montée en puissance des microcontrôleurs, on voit
apparaître actuellement des compilateurs en langage C (voire même C++) qui
permettent de gagner un temps considérable pour le développement et le débogage
des programmes.
Pour tous ceux qui se sont retrouvé largué sur le bord du chemin à cause de ces
            de microcontrôleurs, c’est à mon avis une formidable opportunité de
sauter dans le train de l’électronique numérique et d’apprivoiser ces étranges petites
bêtes. Et pourquoi pas un ampli à tubes piloté par microcontrôleur ? Les capacités
étonnantes de ces circuits vous ouvrent un espace de créativité infini. Ce serait
vraiment dommage de se passer de leurs services…
Une fois la décision prise « je vais me lancer dans les micros ! » se pose la question
du comment. On trouve sur internet toutes les informations nécessaires, la difficulté
serait plutôt de les trier. Vous pouvez commencer par exemple par lire la
documentation de Microchip sur la gamme de PIC « mid-range », c’est une
excellente idée, mais ça va vous prendre du temps (plus de 800 pages !)
Dans le but de vous simplifier la tâche, je vais essayer dans le présent ouvrage de
synthétiser quelque peu ces informations. Et pour éviter la frustration du « je saurais
utiliser un microcontrôleur PIC, mais avant je dois me taper un bouquin de 1000
pages » je vais tâcher d’utiliser une approche progressive permettant de, très
rapidement, créer de véritables petits circuits.




                                         -3-
Intérêt de la programmation en langage C
Tout d’abord, les inconvénients : Un compilateur C produit du code plus volumineux
et moins performant que ce que sait faire un bon programmeur en assembleur. De
plus, selon le compilateur employé, on n’accède plus difficilement, voire pas du tout à
certaines ressources de bas niveau. Et n’ayant plus besoin de plonger les mains
dans le cambouis, on risque également de moins approfondir l’étude du
microcontrôleur utilisé. Un dernier point : les compilateurs C sont souvent payants.
En contrepartie, il y a de sacrés avantages : connaître la programmation en C permet
de créer des programmes sur de multiples plateformes, à commencer par les PC.
Autrement dit, les connaissances utilisées sont en grande partie réutilisables. Le C
est un langage de « haut niveau », comparé à l’assembleur, qui permet d’écrire des
programmes nettement plus intelligibles et donc plus faciles à relire et corriger ou
modifier. Le compilateur contrôle la cohérence du code au moment de la compilation
et signale bon nombre d’erreurs, qui seront autant de bogues en moins à corriger. Le
compilateur prend en charge la gestion d’un certain nombre de mécanismes
fastidieux : par exemple, pas besoin de spécifier la page mémoire dans laquelle on
veut écrire, le compilateur s’en charge ! De plus, certains compilateurs permettent
tout de même d’accéder à des ressources de bas niveau, voir même d’insérer dans
le code des portions d’assembleur. A vrai dire, à moins d’être un « pro » de
l’assembleur, vous pourrez certainement créer avec un bon compilateur C un code
plus propre et plus robuste, en nettement moins de temps. Et, cerise sur le gâteau, le
portage d’un de vos programmes sur un nouveau microcontrôleur sera nettement
simplifié.
Pour bien fixer les idées sur la différence de niveau de langage entre assembleur et
C, je vais donner un exemple. Soit à décrire une action simple : ouvrir la fenêtre de la
pièce dans laquelle vous êtes actuellement.

En assembleur ça donnerait :
       -   soulever pied droit
       -   avancer pied droit
       -   poser pied droit
       -   soulever pied gauche
       -   avancer pied gauche
       -   poser pied gauche
       -   soulever pied droit
       -   avancer pied droit
       -   ….
       -   Sélectionner bras gauche
       -   Soulever bras
       -   Avancer bras
       -   Prendre poignée fenêtre dans main gauche
       -   Tourner poignée de -90°
       -   Tirer poignée
       -   Etc.…

En C ce serait plutôt :

       -   Ouvrir la fenêtre

Et c’est le compilateur qui se chargerait de traduire la fonction « ouvrir la fenêtre » en
instructions élémentaires compréhensibles par le microcontrôleur.
Alors, merci qui ? Merci le C !
                                             -4-
Choix du compilateur
Il y a sur le marché plusieurs compilateurs C. Le microcontrôleur étudié ici étant un
PIC Microchip, la solution la plus évidente consiste à voir ce que propose Microchip :
Si on nous propose bien des compilateurs, ceux-ci sont payants et ne couvrent que
le haut de la gamme des PIC, ce qui est un peu luxueux pour un amateur désirant
s’initier à l’utilisation de ces petites bêtes.
D’autres éditeurs proposent également des compilateurs dont certains sont très
complets, livrés avec des bibliothèques simplifiant l’utilisation des périphériques du
PIC. Malheureusement, ici encore c’est assez cher, jusqu’à plusieurs centaines
d’euros pour un environnement de développement intégré couvrant l’essentiel de la
gamme des PIC.
Heureusement il existe des alternatives moins onéreuses. Par exemple, en
cherchant bien sur internet on peut dénicher des compilateurs freeware en ligne de
commande.
Mon choix s’est porté sur le compilateur BoostC de la société SourceBoost, pour les
raisons suivantes : Il existe une version gratuite avec quelques limitations mineures
(taille du code généré…) permettant de se faire la main et de créer des applications
personnelles, les versions payantes (à des tarifs très raisonnables) permettent de
créer des applications commerciales et d’avoir accès au code source des
bibliothèques. BoostC est livré avec un environnement de développement intégré
facilitant le développement d’applications. Le langage est du C « ANSI », avec
toutefois quelques extensions destinées à tirer pleinement parti de toutes les
spécificités des microcontrôleurs PIC. Et surtout, BoostC reste assez proche du
matériel : on peut très facilement accéder à tous les bits d’un registre quelquonque.
On peut faire l’essentiel de ce qu’il est possible de faire en assembleur, avec les
contraintes en moins. Ce qui sous-entend néanmoins de s’intéresser d’assez près à
la structure du PIC et de des différents sous-ensembles. A noter que SourceBoost
propose également un compilateur C++ pour PIC, ainsi qu’un compilateur Basic.

http://www.sourceboost.com




                                         -5-
Choix d’un PIC : le 16F877
Pour apprendre, la meilleurs solution est de se faire la main sur du concret. On va
donc étudier un vrai microcontrôleur, sachant que ce qui aura été vu sera assez
facilement transposable à d’autres PIC. Le 16F877 est un PIC de la série « Mid-
range » qui se prête particulièrement bien à la programmation en C. Les PIC de la
série inférieure sont un peu justes en performance et en capacité mémoire pour
accueillir un programme issu d’un compilateur C ; mieux vaut les programmer en
assembleur. Les gammes supérieures (16 ou 32 bits) supportent sans problème la
programmation en C, mais comme se sont des circuits plus complexes (et plus
chers), commençons par quelque chose de plus simple et de plus didactique. Le
16F877 (F comme « Flash ») convient parfaitement : mémoire programme de taille
suffisante (8K), nombreux périphériques intégrés, fréquence de fonctionnement
jusqu’à 20 MHz. Tout ce qu’il faut pour créer des applications sympa en s’amusant !




                                        -6-
Choix du programmateur
Une fois le programme créé, il faudra le transférer dans la mémoire programme du
PIC. Pour cela, il existe plusieurs solutions :
Vous pouvez construire votre propre programmateur. De nombreuses variantes
existent, il suffit de faire une recherche sur le net pour s’en rendre compte. Ces
programmateurs se raccordent sur un port série RS232 ou parallèle. A vrai dire la
majorité des circuits ont un air de famille. Pas sûr néanmoins que tous fonctionnent.
Si vous vous engagez dans cette voie, un des « design » les plus rigoureux est
certainement celui proposé par Microchip dans une de ses « Application Note » (à
voir sur le site de Microchip).
Vous pouvez aussi acheter un programmateur tout fait, en état de marche. Il en
existe pour port série, parallèle et, USB ! Sachant que les ports série RS232 et
parallèle tendent à disparaître au profit de l’USB, cette dernière option, bien que
souvent un peu plus onéreuse semble être un bon choix. Il existe en outre des outils
permettant à la fois de programmer le microcontrôleur, mais aussi de le déboguer en
temps réel et tout ça avec le microcontrôleur en place dans son circuit d’application
(voir les outils proposés par Microchip à ce sujet).
Enfin, il y a la solution du programmateur en kit. Après m’être lancé dans un premier
temps dans la réalisation d’un programmateur « home made » (décrit dans un livre
fort onéreux) qui n’a jamais daigné fonctionner, je me suis tourné vers cette dernière
solution : Un programmateur en kit Velleman K8076 pour une quarantaine d’euros
(c'est-à-dire moins cher que le prix des composants de celui que j’ai vainement tenté
de réaliser moi-même), équipé d’un support ZIF (Zéro Insertion Force). Il permet en
outre la programmation « in-circuit », et est livré avec un logiciel de transfert
compatible avec l’essentiel de la gamme des PIC. Des mises à jour étant disponibles
sur le site de Velleman pour les circuits les plus récents. Il faut procéder au montage
soi-même, mais ça marche du premier coup ! (du moins si vous êtes rigoureux au
moment du montage). Le seul inconvénient : il s’agit ici d’un programmateur à
raccorder sur port RS232, donc impossible à raccorder sur un pc portable récent. Un
jour ou l’autre il faudra bien passer par l’USB…

http://www.velleman.be




                                         -7-
Structure du PIC 16F877

                                          13                                      DATA Bus           8     PORTA
                                                Program Counter
                                                                                                                   RA0 /   AN0
                           FLASH                                                                                   RA1 /   AN1
                                                                                                                   RA2 /   AN2 / Vref-
                           Program
                           Memory                                                   RAM                            RA3 /   AN3 / Vref+
                                                  8 Level Stack
                                                     ( 13-bit )                     File                           RA4 /   T0CKl
                                                                                  Registers                        RA5 /   AN4 / SS
              Program      14                                                                              PORTB
                Bus                                                  RAM Addr (1)          9
                                                                                                                   RB0 /   INT
                                                                                  Addr MUX                         RB1
                        Instruction reg
                                                                                                                   RB2
                                               Direct Addr       7                              Indirect
                                                                                           8                       RB3 /   PGM
                                                                                                  Addr
                                                                                                                   RB4
                                                                                           FSR reg                 RB5
                                                                                                                   RB6 /   PGC
                                                                                       STATUS reg                  RB7 /   PGD
                                          8
                                                                                                           PORTC
                                                                                                                   RC0 /   T1OSO / T1CKL
                                                                              3             MUX
                                                  Power-up                                                         RC1 /   T1OSI / CCP2
                                                   Timer                                                           RC2 /   CCP1
                         Instruction                                                                               RC3 /   SCK / SCL
                                                  Oscillator
                          Decode &              Start-up Timer                                                     RC4 /   SDI / SDA
                                                                                    ALU
                           Control                                                                                 RC5 /   SD0
                                                  Power-on                                                         RC6 /   TX / CK
                                                   Reset                  8
                                                                                                                   RC7 /   RX / DT
                          Timing                  Watchdog
                                                                                   W reg
                         Generation                Timer                                                   PORTD
    OSC1 / CLKIN                                 Brown-out                                                         RD0 /   PSP0
    OSC2 / CLKOUT                                  Reset                                                           RD1 /   PSP1
                                                  In-Circuit                                                       RD2 /   PSP2
                                                  Debugger                                                         RD3 /   PSP3
                                                Low-Voltage                                                        RD4 /   PSP4
                                                Programming                         Parallel Slave Port            RD5 /   PSP5
                                                                                                                   RD6 /   PSP6
                                                                                                                   RD7 /   PSP7

                                                                                                           PORTE

                                               MCLR     VDD, Vss                                                   RE0 / AN5 / RD

                                                                                                                   RE1 / AN6 / WR

                                                                                                                   RE2 / AN7 / CS
     Timer0                     Timer1                     Timer2                         10-bit A/D




                                                      Synchronous
  Data EEPROM                   CCP1,2                                                     USART
                                                       Serial Port




   Note 1 : High order bits are from the STATUS register




Le schéma ci-dessus représente les différents modules du PIC 16F877. Ca a l’air un
peu complexe au premier abord, une visite guidée nous permettra d’y voir plus clair.




                                                                         -8-
Le cœur du PIC : le microprocesseur
Un microcontrôleur, c’est avant tout un microprocesseur, une unité de traitement
logique qui effectue l’une après l’autre les opérations contenues dans un
microprogramme stocké en mémoire (la mémoire FLASH). On peut le voir sur le
schéma (en jaune ci-dessous), il est essentiellement composé de l’ « ALU » (Unité
Arithmétique et Logique) qui effectue les opérations sur les donnés, le registre de
travail « W reg. », le multiplexeur « MUX », le registre de statut « status reg », le
registre « FSR reg » utilisé pour l’adressage indirect (en assembleur…), le
multiplexeur d’adresse « Addr mux », le compteur programme « Program Counter »
qui pointe les instructions à exécuter, la pile à 8 niveaux « 8 level Stack », le registre
d’instruction « Instruction reg », ainsi que les différents bus qui relient tous ces
éléments entre eux.


                                           13                                      DATA Bus           8     PORTA
                                                 Program Counter
                                                                                                                    RA0 /   AN0
                            FLASH                                                                                   RA1 /   AN1
                                                                                                                    RA2 /   AN2 / Vref-
                            Program
                            Memory                                                   RAM                            RA3 /   AN3 / Vref+
                                                   8 Level Stack
                                                      ( 13-bit )                     File                           RA4 /   T0CKl
                                                                                   Registers                        RA5 /   AN4 / SS
               Program      14                                                                              PORTB
                 Bus                                                  RAM Addr (1)          9
                                                                                                                    RB0 /   INT
                                                                                   Addr MUX                         RB1
                         Instruction reg
                                                                                                                    RB2
                                                Direct Addr       7                              Indirect
                                                                                            8                       RB3 /   PGM
                                                                                                   Addr
                                                                                                                    RB4
                                                                                            FSR reg                 RB5
                                                                                                                    RB6 /   PGC
                                                                                        STATUS reg                  RB7 /   PGD
                                           8
                                                                                                            PORTC
                                                                                                                    RC0 /   T1OSO / T1CKL
                                                                               3             MUX
                                                   Power-up                                                         RC1 /   T1OSI / CCP2
                                                    Timer                                                           RC2 /   CCP1
                          Instruction                                                                               RC3 /   SCK / SCL
                                                   Oscillator
                           Decode &              Start-up Timer                                                     RC4 /   SDI / SDA
                                                                                     ALU
                            Control                                                                                 RC5 /   SD0
                                                   Power-on                                                         RC6 /   TX / CK
                                                    Reset                  8
                                                                                                                    RC7 /   RX / DT
                           Timing                  Watchdog
                                                                                    W reg
                          Generation                Timer                                                   PORTD
     OSC1 / CLKIN                                 Brown-out                                                         RD0 /   PSP0
     OSC2 / CLKOUT                                  Reset                                                           RD1 /   PSP1
                                                   In-Circuit                                                       RD2 /   PSP2
                                                   Debugger                                                         RD3 /   PSP3
                                                 Low-Voltage                                                        RD4 /   PSP4
                                                 Programming                         Parallel Slave Port            RD5 /   PSP5
                                                                                                                    RD6 /   PSP6
                                                                                                                    RD7 /   PSP7

                                                                                                            PORTE

                                                MCLR     VDD, Vss                                                   RE0 / AN5 / RD

                                                                                                                    RE1 / AN6 / WR

                                                                                                                    RE2 / AN7 / CS
      Timer0                     Timer1                     Timer2                         10-bit A/D




                                                       Synchronous
   Data EEPROM                   CCP1,2                                                     USART
                                                        Serial Port




    Note 1 : High order bits are from the STATUS register




                                                                          -9-
On n’entrera pas ici dans les détails du fonctionnement d’un microprocesseur ; c’est
très intéressant à connaître, indispensable même si on programme en assembleur.
Mais en ce qui nous concerne, on veut programmer en C, et c’est donc le
compilateur qui se chargera de traduire notre code source en instructions de bas-
niveau pour le microprocesseur contenu dans le PIC. C’est là le principal avantage
de la programmation en C : on prend du recul par rapport au fonctionnement intime
du système. On se concentre d’avantage sur « ce que fait le programme » que sur
« comment fonctionne le programme ».
On va tout de même jeter un petit coup d’œil sur le schéma ci-dessus, histoire de
comprendre quelques particularités du PIC, déroutantes au premier abord. On
s’aperçoit que les bus autour de l’ALU ont un format de 8 bits : le PIC 16F877
travaille sur des données de 8 bits, c’est donc bien un microcontrôleur 8 bits !
(logique…).
Pourquoi donc ce cas le « Program Bus » est-il, lui, large de 14 bits ? C’est simple,
certaines instructions peuvent être codées sur plus de 8 bits. Si ce bus n’était large
que de 8 bits, il faudrait plus d’un cycle d’horloge pour transmettre ces instructions,
alors qu’avec un bus plus large, ça passe en une fois. De plus, la mémoire
programme, indépendante du bus de données, est elle-même adressée avec un bus
large : le « Program Counter », qui pointe sur l’instruction en cours, à une largeur de
13 bits. Et avec 13 bits on peut coder environ 8000 adresses. Autrement dit, on à
8000 cases de mémoire programme pouvant contenir chacune 1 instruction
complète. Cette architecture avec bus de données et de programme séparés
(architecture « Harvard ») permet donc d’optimiser le fonctionnement du PIC. La
plupart du temps, votre PIC exécute une instruction et charge la suivante
simultanément en un seul cycle d’horloge. En comparaison, un microcontrôleur 8 bits
construit selon l’architecture concurrente « Von Neumann » (mémoire programme et
données reliés au microprocesseur par un unique bus 8 bits) devra faire plusieurs
cycles pour chercher les instructions en mémoire (en plusieurs fois si c’est une
instruction longues) et les exécuter ensuite. En conséquence, à fréquence d’horloge
égales, un microprocesseur « Harvard » sera plus rapide qu’un « Von Neumann ».




                                         - 10 -
La mémoire
Sur le PIC, il n’y a pas une mais trois mémoires :
                                           13                                      DATA Bus           8     PORTA
                                                 Program Counter
                                                                                                                    RA0 /   AN0
                            FLASH                                                                                   RA1 /   AN1
                                                                                                                    RA2 /   AN2 / Vref-
                            Program
                            Memory                                                   RAM                            RA3 /   AN3 / Vref+
                                                   8 Level Stack
                                                      ( 13-bit )                     File                           RA4 /   T0CKl
                                                                                   Registers                        RA5 /   AN4 / SS
               Program      14                                                                              PORTB
                 Bus                                                  RAM Addr (1)          9
                                                                                                                    RB0 /   INT
                                                                                   Addr MUX                         RB1
                         Instruction reg
                                                                                                                    RB2
                                                Direct Addr       7                              Indirect
                                                                                            8                       RB3 /   PGM
                                                                                                   Addr
                                                                                                                    RB4
                                                                                            FSR reg                 RB5
                                                                                                                    RB6 /   PGC
                                                                                        STATUS reg                  RB7 /   PGD
                                           8
                                                                                                            PORTC
                                                                                                                    RC0 /   T1OSO / T1CKL
                                                                               3             MUX
                                                   Power-up                                                         RC1 /   T1OSI / CCP2
                                                    Timer                                                           RC2 /   CCP1
                          Instruction                                                                               RC3 /   SCK / SCL
                                                   Oscillator
                           Decode &              Start-up Timer                                                     RC4 /   SDI / SDA
                                                                                     ALU
                            Control                                                                                 RC5 /   SD0
                                                   Power-on                                                         RC6 /   TX / CK
                                                    Reset                  8
                                                                                                                    RC7 /   RX / DT
                           Timing                  Watchdog
                                                                                    W reg
                          Generation                Timer                                                   PORTD
     OSC1 / CLKIN                                 Brown-out                                                         RD0 /   PSP0
     OSC2 / CLKOUT                                  Reset                                                           RD1 /   PSP1
                                                   In-Circuit                                                       RD2 /   PSP2
                                                   Debugger                                                         RD3 /   PSP3
                                                 Low-Voltage                                                        RD4 /   PSP4
                                                 Programming                         Parallel Slave Port            RD5 /   PSP5
                                                                                                                    RD6 /   PSP6
                                                                                                                    RD7 /   PSP7

                                                                                                            PORTE

                                                MCLR     VDD, Vss                                                   RE0 / AN5 / RD

                                                                                                                    RE1 / AN6 / WR

                                                                                                                    RE2 / AN7 / CS
      Timer0                     Timer1                     Timer2                         10-bit A/D




                                                       Synchronous
   Data EEPROM                   CCP1,2                                                     USART
                                                        Serial Port




    Note 1 : High order bits are from the STATUS register




La Mémoire Programme, de type FLASH sur le 16F877. Capacité : 8K. C’est dans
celle-ci qu’est stocké le programme du PIC. Après compilation de votre code, le
compilateur génère un fichier « .hex », une suite de codes hexadécimaux. Celui-ci
est transféré ensuite dans la mémoire programme du PIC à l’aide du programmateur.
Cette mémoire n’est pas reliée au bus de données (DATA Bus), sa vocation est de
stocker le programme du PIC, mais PAS les variables de votre programme. Le gros
avantage de la mémoire FLASH c’est que vous pouvez la réécrire, donc implanter un
nouveau programme dans le PIC. Les PIC existent également avec d’autres versions
de mémoire programme (non-FLASH), certaines ne pouvant être programmée
qu’une seule fois.
                                                                         - 11 -
La Mémoire RAM, qui fait partie de la zone d’adressage des données. Elle
comprend tous les registres spéciaux permettant de contrôler le cœur du PIC ainsi
que ses périphériques. Elle contient également des cases mémoires à usage
générique dans lesquelles pourront être stockées les variables de nos futurs
programmes.

La Mémoire EEPROM. L’EEPROM est plutôt une mémoire de stockage de données
à long terme, alors que la RAM est utilisée pour les variables du programme. Sur le
PIC 16F877, on a 256 octets d’EEPROM disponible. Les mémoires de type
EEPROM sont limitées en nombre de cycles d’effacement / écriture. Ce nombre de
cycle est tout de même de l’ordre du million pour le PIC, mais si on l’utilisait pour
stocker des variables modifiées plusieurs milliers de fois par secondes, cette limite
pourrais être atteinte plus vite qu’on ne le croît. Par contre, pour stocker toute les
heures une mesure de température, c’est tout bon !




                                        - 12 -
La Pile et le Compteur Programme
On les a déjà évoqués dans le paragraphe « le cœur du PIC : le microprocesseur »,
mais puisqu’on vient de parler de la mémoire, une petite remarque s’impose.

                                          13                                      DATA Bus           8     PORTA
                                                Program Counter
                                                                                                                   RA0 /   AN0
                           FLASH                                                                                   RA1 /   AN1
                                                                                                                   RA2 /   AN2 / Vref-
                           Program
                           Memory                                                   RAM                            RA3 /   AN3 / Vref+
                                                  8 Level Stack
                                                     ( 13-bit )                     File                           RA4 /   T0CKl
                                                                                  Registers                        RA5 /   AN4 / SS
              Program      14                                                                              PORTB
                Bus                                                  RAM Addr (1)          9
                                                                                                                   RB0 /   INT
                                                                                  Addr MUX                         RB1
                        Instruction reg
                                                                                                                   RB2
                                               Direct Addr       7                              Indirect
                                                                                           8                       RB3 /   PGM
                                                                                                  Addr
                                                                                                                   RB4
                                                                                           FSR reg                 RB5
                                                                                                                   RB6 /   PGC
                                                                                       STATUS reg                  RB7 /   PGD
                                          8
                                                                                                           PORTC
                                                                                                                   RC0 /   T1OSO / T1CKL
                                                                              3             MUX
                                                  Power-up                                                         RC1 /   T1OSI / CCP2
                                                   Timer                                                           RC2 /   CCP1
                         Instruction                                                                               RC3 /   SCK / SCL
                                                  Oscillator
                          Decode &              Start-up Timer                                                     RC4 /   SDI / SDA
                                                                                    ALU
                           Control                                                                                 RC5 /   SD0
                                                  Power-on                                                         RC6 /   TX / CK
                                                   Reset                  8
                                                                                                                   RC7 /   RX / DT
                          Timing                  Watchdog
                                                                                   W reg
                         Generation                Timer                                                   PORTD
    OSC1 / CLKIN                                 Brown-out                                                         RD0 /   PSP0
    OSC2 / CLKOUT                                  Reset                                                           RD1 /   PSP1
                                                  In-Circuit                                                       RD2 /   PSP2
                                                  Debugger                                                         RD3 /   PSP3
                                                Low-Voltage                                                        RD4 /   PSP4
                                                Programming                         Parallel Slave Port            RD5 /   PSP5
                                                                                                                   RD6 /   PSP6
                                                                                                                   RD7 /   PSP7

                                                                                                           PORTE

                                               MCLR     VDD, Vss                                                   RE0 / AN5 / RD

                                                                                                                   RE1 / AN6 / WR

                                                                                                                   RE2 / AN7 / CS
     Timer0                     Timer1                     Timer2                         10-bit A/D




                                                      Synchronous
  Data EEPROM                   CCP1,2                                                     USART
                                                       Serial Port




   Note 1 : High order bits are from the STATUS register




                                                                        - 13 -
Le « Program Counter » ou PC est le compteur qui pointe dans la mémoire
programme la prochaine instruction à exécuter. Il est lié à la pile système (Pile =
Stack en anglais) qui est sur le PIC 16F877 une pile 8 niveaux. Qu’est ce que cela
signifie ? Simplement qu’on peut avoir jusqu'à 8 niveaux d’imbrication d’appels de
sous-programme ou fonctions. Ce point est surtout critique pour la programmation en
assembleur : un sous-programme peut appeler un autre sous-programme qui appelle
à son tour un autre sous-programme… jusqu’à une « profondeur » de 8. Au-delà,
c’est la cata : votre programme est buggé et va faire n’importe quoi, étant donné que
le PIC ne peut « dépiler » que 8 niveaux. Le Compteur Programme n’arrivera pas à
revenir à la racine des appels. La programmation en C apporte là un peu de
souplesse : un bon compilateur veillera pour vous à ce que la limite de 8 niveaux ne
soit pas dépassée, quitte à recopier localement une fonction pour éviter un saut à
l’adresse mémoire où cette fonction est déjà présente. Au détriment donc de
l’occupation en mémoire. Ainsi, mieux vaut-il éviter de créer trop de niveaux
d’imbrication d’appels de fonctions dans nos programmes.




                                        - 14 -
Les Ports d’Entrées/Sorties généraux : PORTA, PORTB, PORTC,
PORTD, PORTE

                                          13                                      DATA Bus           8     PORTA
                                                Program Counter
                                                                                                                   RA0 /   AN0
                           FLASH                                                                                   RA1 /   AN1
                                                                                                                   RA2 /   AN2 / Vref-
                           Program
                           Memory                                                   RAM                            RA3 /   AN3 / Vref+
                                                  8 Level Stack
                                                     ( 13-bit )                     File                           RA4 /   T0CKl
                                                                                  Registers                        RA5 /   AN4 / SS
              Program      14                                                                              PORTB
                Bus                                                  RAM Addr (1)          9
                                                                                                                   RB0 /   INT
                                                                                  Addr MUX                         RB1
                        Instruction reg
                                                                                                                   RB2
                                               Direct Addr       7                              Indirect
                                                                                           8                       RB3 /   PGM
                                                                                                  Addr
                                                                                                                   RB4
                                                                                           FSR reg                 RB5
                                                                                                                   RB6 /   PGC
                                                                                       STATUS reg                  RB7 /   PGD
                                          8
                                                                                                           PORTC
                                                                                                                   RC0 /   T1OSO / T1CKL
                                                                              3             MUX
                                                  Power-up                                                         RC1 /   T1OSI / CCP2
                                                   Timer                                                           RC2 /   CCP1
                         Instruction                                                                               RC3 /   SCK / SCL
                                                  Oscillator
                          Decode &              Start-up Timer                                                     RC4 /   SDI / SDA
                                                                                    ALU
                           Control                                                                                 RC5 /   SD0
                                                  Power-on                                                         RC6 /   TX / CK
                                                   Reset                  8
                                                                                                                   RC7 /   RX / DT
                          Timing                  Watchdog
                                                                                   W reg
                         Generation                Timer                                                   PORTD
    OSC1 / CLKIN                                 Brown-out                                                         RD0 /   PSP0
    OSC2 / CLKOUT                                  Reset                                                           RD1 /   PSP1
                                                  In-Circuit                                                       RD2 /   PSP2
                                                  Debugger                                                         RD3 /   PSP3
                                                Low-Voltage                                                        RD4 /   PSP4
                                                Programming                         Parallel Slave Port            RD5 /   PSP5
                                                                                                                   RD6 /   PSP6
                                                                                                                   RD7 /   PSP7

                                                                                                           PORTE

                                               MCLR     VDD, Vss                                                   RE0 / AN5 / RD

                                                                                                                   RE1 / AN6 / WR

                                                                                                                   RE2 / AN7 / CS
     Timer0                     Timer1                     Timer2                         10-bit A/D




                                                      Synchronous
  Data EEPROM                   CCP1,2                                                     USART
                                                       Serial Port




   Note 1 : High order bits are from the STATUS register




                                                                        - 15 -
Le PIC 16F877 est généreusement doté de 5 ports, ce qui est plutôt confortable. Un
examen plus attentif du schéma ci-dessus nous montre cependant que les lignes
d’entrées/sorties (les pattes du composant) correspondantes sont également
utilisées par d’autres modules du PIC. Ainsi, les pattes du PORTA servent également
au convertisseur Analogique/Numérique, les pattes du PORTD au Port Parallèle
Esclave, etc. Il faudra faire des choix au moment de la conception du schéma
électronique ! On voit également que les ports B, C et D ont 8 lignes d’entrée/sortie,
alors que le port A n’en a que 6 et le port E que 3. Ils sont tous connectés au bus de
donnée (DATA BUS), on pourra donc librement les adresser pour y lire ou écrire des
données, et donc allumer des LED, commander des moteurs pas à pas, des
afficheurs LCD, lire les données envoyées par un clavier ou un bouton poussoir…
On peut configurer les entrées/sorties de chaque port en entrée ou en sortie, grâce à
un registre spécial dédié à chaque port.
De plus, un des ports (le port B) possède des résistances de « pull-up » internes qui
peuvent êtres validées ou non par logiciel.




                                        - 16 -
Le Port Parallèle Esclave (PSP : Parallel Slave Port)

                                           13                                      DATA Bus           8     PORTA
                                                 Program Counter
                                                                                                                    RA0 /   AN0
                            FLASH                                                                                   RA1 /   AN1
                                                                                                                    RA2 /   AN2 / Vref-
                            Program
                            Memory                                                   RAM                            RA3 /   AN3 / Vref+
                                                   8 Level Stack
                                                      ( 13-bit )                     File                           RA4 /   T0CKl
                                                                                   Registers                        RA5 /   AN4 / SS
               Program      14                                                                              PORTB
                 Bus                                                  RAM Addr (1)          9
                                                                                                                    RB0 /   INT
                                                                                   Addr MUX                         RB1
                         Instruction reg
                                                                                                                    RB2
                                                Direct Addr       7                              Indirect
                                                                                            8                       RB3 /   PGM
                                                                                                   Addr
                                                                                                                    RB4
                                                                                            FSR reg                 RB5
                                                                                                                    RB6 /   PGC
                                                                                        STATUS reg                  RB7 /   PGD
                                           8
                                                                                                            PORTC
                                                                                                                    RC0 /   T1OSO / T1CKL
                                                                               3             MUX
                                                   Power-up                                                         RC1 /   T1OSI / CCP2
                                                    Timer                                                           RC2 /   CCP1
                          Instruction                                                                               RC3 /   SCK / SCL
                                                   Oscillator
                           Decode &              Start-up Timer                                                     RC4 /   SDI / SDA
                                                                                     ALU
                            Control                                                                                 RC5 /   SD0
                                                   Power-on                                                         RC6 /   TX / CK
                                                    Reset                  8
                                                                                                                    RC7 /   RX / DT
                           Timing                  Watchdog
                                                                                    W reg
                          Generation                Timer                                                   PORTD
     OSC1 / CLKIN                                 Brown-out                                                         RD0 /   PSP0
     OSC2 / CLKOUT                                  Reset                                                           RD1 /   PSP1
                                                   In-Circuit                                                       RD2 /   PSP2
                                                   Debugger                                                         RD3 /   PSP3
                                                 Low-Voltage                                                        RD4 /   PSP4
                                                 Programming                         Parallel Slave Port            RD5 /   PSP5
                                                                                                                    RD6 /   PSP6
                                                                                                                    RD7 /   PSP7

                                                                                                            PORTE

                                                MCLR     VDD, Vss                                                   RE0 / AN5 / RD

                                                                                                                    RE1 / AN6 / WR

                                                                                                                    RE2 / AN7 / CS
      Timer0                     Timer1                     Timer2                         10-bit A/D




                                                       Synchronous
   Data EEPROM                   CCP1,2                                                     USART
                                                        Serial Port




    Note 1 : High order bits are from the STATUS register




Le Port Parallèle Esclave est un port 8 bits permettant d’interfacer le PIC avec, par
exemple, un autre microprocesseur. Les données transitent via les lignes PSP0 à
PSP7, qui physiquement utilisent les mêmes broches que le PORTD. Le flux de
données est contrôlé par les lignes RD, WR et CS qui correspondent aux broches du
PORTE.
C’est le microprocesseur externe qui est le chef d’orchestre : il valide notre PIC par la
ligne CS (Chip Select), et indique au PIC s’il lit ou écrit grâce aux lignes RD (Read) et
WR (Write). D’où l’appellation de port parallèle ESCLAVE. Esclave, puisque c’est le
microprocesseur externe qui donne les ordres, notre PIC ne fait qu’exécuter.


                                                                         - 17 -
Le circuit de génération d’horloge

                                          13                                      DATA Bus           8     PORTA
                                                Program Counter
                                                                                                                   RA0 /   AN0
                           FLASH                                                                                   RA1 /   AN1
                                                                                                                   RA2 /   AN2 / Vref-
                           Program
                           Memory                                                   RAM                            RA3 /   AN3 / Vref+
                                                  8 Level Stack
                                                     ( 13-bit )                     File                           RA4 /   T0CKl
                                                                                  Registers                        RA5 /   AN4 / SS
              Program      14                                                                              PORTB
                Bus                                                  RAM Addr (1)          9
                                                                                                                   RB0 /   INT
                                                                                  Addr MUX                         RB1
                        Instruction reg
                                                                                                                   RB2
                                               Direct Addr       7                              Indirect
                                                                                           8                       RB3 /   PGM
                                                                                                  Addr
                                                                                                                   RB4
                                                                                           FSR reg                 RB5
                                                                                                                   RB6 /   PGC
                                                                                       STATUS reg                  RB7 /   PGD
                                          8
                                                                                                           PORTC
                                                                                                                   RC0 /   T1OSO / T1CKL
                                                                              3             MUX
                                                  Power-up                                                         RC1 /   T1OSI / CCP2
                                                   Timer                                                           RC2 /   CCP1
                         Instruction                                                                               RC3 /   SCK / SCL
                                                  Oscillator
                          Decode &              Start-up Timer                                                     RC4 /   SDI / SDA
                                                                                    ALU
                           Control                                                                                 RC5 /   SD0
                                                  Power-on                                                         RC6 /   TX / CK
                                                   Reset                  8
                                                                                                                   RC7 /   RX / DT
                          Timing                  Watchdog
                                                                                   W reg
                         Generation                Timer                                                   PORTD
    OSC1 / CLKIN                                 Brown-out                                                         RD0 /   PSP0
    OSC2 / CLKOUT                                  Reset                                                           RD1 /   PSP1
                                                  In-Circuit                                                       RD2 /   PSP2
                                                  Debugger                                                         RD3 /   PSP3
                                                Low-Voltage                                                        RD4 /   PSP4
                                                Programming                         Parallel Slave Port            RD5 /   PSP5
                                                                                                                   RD6 /   PSP6
                                                                                                                   RD7 /   PSP7

                                                                                                           PORTE

                                               MCLR     VDD, Vss                                                   RE0 / AN5 / RD

                                                                                                                   RE1 / AN6 / WR

                                                                                                                   RE2 / AN7 / CS
     Timer0                     Timer1                     Timer2                         10-bit A/D




                                                      Synchronous
  Data EEPROM                   CCP1,2                                                     USART
                                                       Serial Port




   Note 1 : High order bits are from the STATUS register




Pour faire battre le cœur de notre PIC, on a besoin d’un circuit de génération
d’horloge. Avec les PIC « Mid Range », plusieurs options possibles : circuit RC
(résistance + condensateur), ou circuit résonateur céramique, ou oscillateur à
quartz... Le mode de fonctionnement est déterminé au moment de la programmation
du PIC par des « bits de configuration » qui sont en fait des emplacements de
mémoire non-volatile. Pour générer un « cycle d’instruction », il faut 4 cycles
d’horloge. Autrement dit, si votre quartz bat à 20 MHz, les instructions du programme
s’exécutent à une cadence de 5 MHz.



                                                                        - 18 -
Le TIMER0

                                           13                                      DATA Bus           8     PORTA
                                                 Program Counter
                                                                                                                    RA0 /   AN0
                            FLASH                                                                                   RA1 /   AN1
                                                                                                                    RA2 /   AN2 / Vref-
                            Program
                            Memory                                                   RAM                            RA3 /   AN3 / Vref+
                                                   8 Level Stack
                                                      ( 13-bit )                     File                           RA4 /   T0CKl
                                                                                   Registers                        RA5 /   AN4 / SS
               Program      14                                                                              PORTB
                 Bus                                                  RAM Addr (1)          9
                                                                                                                    RB0 /   INT
                                                                                   Addr MUX                         RB1
                         Instruction reg
                                                                                                                    RB2
                                                Direct Addr       7                              Indirect
                                                                                            8                       RB3 /   PGM
                                                                                                   Addr
                                                                                                                    RB4
                                                                                            FSR reg                 RB5
                                                                                                                    RB6 /   PGC
                                                                                        STATUS reg                  RB7 /   PGD
                                           8
                                                                                                            PORTC
                                                                                                                    RC0 /   T1OSO / T1CKL
                                                                               3             MUX
                                                   Power-up                                                         RC1 /   T1OSI / CCP2
                                                    Timer                                                           RC2 /   CCP1
                          Instruction                                                                               RC3 /   SCK / SCL
                                                   Oscillator
                           Decode &              Start-up Timer                                                     RC4 /   SDI / SDA
                                                                                     ALU
                            Control                                                                                 RC5 /   SD0
                                                   Power-on                                                         RC6 /   TX / CK
                                                    Reset                  8
                                                                                                                    RC7 /   RX / DT
                           Timing                  Watchdog
                                                                                    W reg
                          Generation                Timer                                                   PORTD
     OSC1 / CLKIN                                 Brown-out                                                         RD0 /   PSP0
     OSC2 / CLKOUT                                  Reset                                                           RD1 /   PSP1
                                                   In-Circuit                                                       RD2 /   PSP2
                                                   Debugger                                                         RD3 /   PSP3
                                                 Low-Voltage                                                        RD4 /   PSP4
                                                 Programming                         Parallel Slave Port            RD5 /   PSP5
                                                                                                                    RD6 /   PSP6
                                                                                                                    RD7 /   PSP7

                                                                                                            PORTE

                                                MCLR     VDD, Vss                                                   RE0 / AN5 / RD

                                                                                                                    RE1 / AN6 / WR

                                                                                                                    RE2 / AN7 / CS
      Timer0                     Timer1                     Timer2                         10-bit A/D




                                                       Synchronous
   Data EEPROM                   CCP1,2                                                     USART
                                                        Serial Port




    Note 1 : High order bits are from the STATUS register




Dans le passé, le Timer0 s’appelait RTCC. C’est un compteur 8 bits (0 à 255) simple,
qui compte des impulsions soit internes, soit d’une source externe. On peut par
ailleurs lui appliquer une pré-division programmable entre 1 et 256.
On peut librement lire ou écrire dans le registre de comptage associé. On peut donc
le pré charger avec une valeur, à partir de laquelle il comptera jusqu’à atteindre 255.
Une fois le registre de comptage plein, il peut générer une interruption.
Étant donné qu’une fois configuré il fonctionne quasi-indépendamment du
microprocesseur, on pourra s’en servir comme base de temps.




                                                                         - 19 -
Le TIMER1

                                         13                                      DATA Bus           8     PORTA
                                               Program Counter
                                                                                                                  RA0 /   AN0
                          FLASH                                                                                   RA1 /   AN1
                                                                                                                  RA2 /   AN2 / Vref-
                          Program
                          Memory                                                   RAM                            RA3 /   AN3 / Vref+
                                                 8 Level Stack
                                                    ( 13-bit )                     File                           RA4 /   T0CKl
                                                                                 Registers                        RA5 /   AN4 / SS
             Program      14                                                                              PORTB
               Bus                                                  RAM Addr (1)          9
                                                                                                                  RB0 /   INT
                                                                                 Addr MUX                         RB1
                       Instruction reg
                                                                                                                  RB2
                                              Direct Addr       7                              Indirect
                                                                                          8                       RB3 /   PGM
                                                                                                 Addr
                                                                                                                  RB4
                                                                                          FSR reg                 RB5
                                                                                                                  RB6 /   PGC
                                                                                      STATUS reg                  RB7 /   PGD
                                         8
                                                                                                          PORTC
                                                                                                                  RC0 /   T1OSO / T1CKL
                                                                             3             MUX
                                                 Power-up                                                         RC1 /   T1OSI / CCP2
                                                  Timer                                                           RC2 /   CCP1
                        Instruction                                                                               RC3 /   SCK / SCL
                                                 Oscillator
                         Decode &              Start-up Timer                                                     RC4 /   SDI / SDA
                                                                                   ALU
                          Control                                                                                 RC5 /   SD0
                                                 Power-on                                                         RC6 /   TX / CK
                                                  Reset                  8
                                                                                                                  RC7 /   RX / DT
                         Timing                  Watchdog
                                                                                  W reg
                        Generation                Timer                                                   PORTD
   OSC1 / CLKIN                                 Brown-out                                                         RD0 /   PSP0
   OSC2 / CLKOUT                                  Reset                                                           RD1 /   PSP1
                                                 In-Circuit                                                       RD2 /   PSP2
                                                 Debugger                                                         RD3 /   PSP3
                                               Low-Voltage                                                        RD4 /   PSP4
                                               Programming                         Parallel Slave Port            RD5 /   PSP5
                                                                                                                  RD6 /   PSP6
                                                                                                                  RD7 /   PSP7

                                                                                                          PORTE

                                              MCLR     VDD, Vss                                                   RE0 / AN5 / RD

                                                                                                                  RE1 / AN6 / WR

                                                                                                                  RE2 / AN7 / CS
    Timer0                     Timer1                     Timer2                         10-bit A/D




                                                     Synchronous
 Data EEPROM                   CCP1,2                                                     USART
                                                      Serial Port




  Note 1 : High order bits are from the STATUS register




                                                                       - 20 -
Le Timer1 fonctionne sur le même principe que le Timer0, mais avec un registre de
comptage plus gros : 16 bits au lieu de 8, ce qui étend notablement ces capacités de
comptage. De plus, il possède un mode de fonctionnement particulier : on peut
l’utiliser en association avec un des modules CCP (modules de capture et de
comparaison, voir plus loin). Voyons rapidement le mode « capture » : lorsqu’un
événement survient sur l’entrée du module CCP, la valeur du Timer1 est lue. Comme
on connaît la fréquence de comptage, on peut en quelque sorte « chronométrer » la
survenue d’un événement. Exemple : si l’entrée du module CCP est reliée à un
capteur qui délivre une impulsion à chaque tour de l’arbre d’un moteur, la valeur
contenue dans le registre du Timer1 au moment de l’impulsion est le reflet de la
vitesse de rotation.
Voyons maintenant le mode « comparaison » : Le Timer1 compte en continu, et une
interruption est générée chaque fois que la valeur du compteur est égale à celle
qu’on aura pré chargée dans le registre de comparaison. On peut s’en servir pour,
par exemple, générer un signal carré.




                                       - 21 -
Le TIMER2

                                          13                                      DATA Bus           8     PORTA
                                                Program Counter
                                                                                                                   RA0 /   AN0
                           FLASH                                                                                   RA1 /   AN1
                                                                                                                   RA2 /   AN2 / Vref-
                           Program
                           Memory                                                   RAM                            RA3 /   AN3 / Vref+
                                                  8 Level Stack
                                                     ( 13-bit )                     File                           RA4 /   T0CKl
                                                                                  Registers                        RA5 /   AN4 / SS
              Program      14                                                                              PORTB
                Bus                                                  RAM Addr (1)          9
                                                                                                                   RB0 /   INT
                                                                                  Addr MUX                         RB1
                        Instruction reg
                                                                                                                   RB2
                                               Direct Addr       7                              Indirect
                                                                                           8                       RB3 /   PGM
                                                                                                  Addr
                                                                                                                   RB4
                                                                                           FSR reg                 RB5
                                                                                                                   RB6 /   PGC
                                                                                       STATUS reg                  RB7 /   PGD
                                          8
                                                                                                           PORTC
                                                                                                                   RC0 /   T1OSO / T1CKL
                                                                              3             MUX
                                                  Power-up                                                         RC1 /   T1OSI / CCP2
                                                   Timer                                                           RC2 /   CCP1
                         Instruction                                                                               RC3 /   SCK / SCL
                                                  Oscillator
                          Decode &              Start-up Timer                                                     RC4 /   SDI / SDA
                                                                                    ALU
                           Control                                                                                 RC5 /   SD0
                                                  Power-on                                                         RC6 /   TX / CK
                                                   Reset                  8
                                                                                                                   RC7 /   RX / DT
                          Timing                  Watchdog
                                                                                   W reg
                         Generation                Timer                                                   PORTD
    OSC1 / CLKIN                                 Brown-out                                                         RD0 /   PSP0
    OSC2 / CLKOUT                                  Reset                                                           RD1 /   PSP1
                                                  In-Circuit                                                       RD2 /   PSP2
                                                  Debugger                                                         RD3 /   PSP3
                                                Low-Voltage                                                        RD4 /   PSP4
                                                Programming                         Parallel Slave Port            RD5 /   PSP5
                                                                                                                   RD6 /   PSP6
                                                                                                                   RD7 /   PSP7

                                                                                                           PORTE

                                               MCLR     VDD, Vss                                                   RE0 / AN5 / RD

                                                                                                                   RE1 / AN6 / WR

                                                                                                                   RE2 / AN7 / CS
     Timer0                     Timer1                     Timer2                         10-bit A/D




                                                      Synchronous
  Data EEPROM                   CCP1,2                                                     USART
                                                       Serial Port




   Note 1 : High order bits are from the STATUS register




Le Timer2 a un fonctionnement différent des Timer0 et Timer1. C’est un compteur 8
bits avec pré-diviseur et post-diviseur. On s’en sert pour générer des signaux carrés,
ou, en association avec le module CCP, des signaux PWM.
PWM étant l’acronyme de « Pulse Width Modulation » ou, en français, Modulation de
Largeur d’Impulsion (MLI).




                                                                        - 22 -
Les modules CCP1 et CCP2

                                          13                                      DATA Bus           8     PORTA
                                                Program Counter
                                                                                                                   RA0 /   AN0
                           FLASH                                                                                   RA1 /   AN1
                                                                                                                   RA2 /   AN2 / Vref-
                           Program
                           Memory                                                   RAM                            RA3 /   AN3 / Vref+
                                                  8 Level Stack
                                                     ( 13-bit )                     File                           RA4 /   T0CKl
                                                                                  Registers                        RA5 /   AN4 / SS
              Program      14                                                                              PORTB
                Bus                                                  RAM Addr (1)          9
                                                                                                                   RB0 /   INT
                                                                                  Addr MUX                         RB1
                        Instruction reg
                                                                                                                   RB2
                                               Direct Addr       7                              Indirect
                                                                                           8                       RB3 /   PGM
                                                                                                  Addr
                                                                                                                   RB4
                                                                                           FSR reg                 RB5
                                                                                                                   RB6 /   PGC
                                                                                       STATUS reg                  RB7 /   PGD
                                          8
                                                                                                           PORTC
                                                                                                                   RC0 /   T1OSO / T1CKL
                                                                              3             MUX
                                                  Power-up                                                         RC1 /   T1OSI / CCP2
                                                   Timer                                                           RC2 /   CCP1
                         Instruction                                                                               RC3 /   SCK / SCL
                                                  Oscillator
                          Decode &              Start-up Timer                                                     RC4 /   SDI / SDA
                                                                                    ALU
                           Control                                                                                 RC5 /   SD0
                                                  Power-on                                                         RC6 /   TX / CK
                                                   Reset                  8
                                                                                                                   RC7 /   RX / DT
                          Timing                  Watchdog
                                                                                   W reg
                         Generation                Timer                                                   PORTD
    OSC1 / CLKIN                                 Brown-out                                                         RD0 /   PSP0
    OSC2 / CLKOUT                                  Reset                                                           RD1 /   PSP1
                                                  In-Circuit                                                       RD2 /   PSP2
                                                  Debugger                                                         RD3 /   PSP3
                                                Low-Voltage                                                        RD4 /   PSP4
                                                Programming                         Parallel Slave Port            RD5 /   PSP5
                                                                                                                   RD6 /   PSP6
                                                                                                                   RD7 /   PSP7

                                                                                                           PORTE

                                               MCLR     VDD, Vss                                                   RE0 / AN5 / RD

                                                                                                                   RE1 / AN6 / WR

                                                                                                                   RE2 / AN7 / CS
     Timer0                     Timer1                     Timer2                         10-bit A/D




                                                      Synchronous
  Data EEPROM                   CCP1,2                                                     USART
                                                       Serial Port




   Note 1 : High order bits are from the STATUS register




                                                                        - 23 -
On en a parlé au moment de voir les Timer1 et Timer2 ; on a deux modules CCP sur
le PIC. CCP pour « Capture, Compare, PWM ».
En association avec les deux timers, ils vont nous permettre de générer des signaux
à modulation de largeur d’impulsion (PWM) pour, par exemple, faire varier la vitesse
d’un moteur à courant continu, réguler le courant (et donc la luminosité) dans une
ampoule…
Ils vont également nous permettre de comparer l’occurrence d’un signal en entrée
avec la valeur du compteur Timer1, réalisant ainsi un chronométrage de l’événement
en question (par exemple : indication de la fréquence de rotation d’un moteur).
Ils vont encore nous permettre de générer des signaux carrés, et cela de manière
quasi-indépendante du reste du microcontrôleur qui pourra continuer à vaquer à ses
occupations.




                                       - 24 -
Programmation des pic_en_c_part1
Programmation des pic_en_c_part1
Programmation des pic_en_c_part1
Programmation des pic_en_c_part1
Programmation des pic_en_c_part1
Programmation des pic_en_c_part1
Programmation des pic_en_c_part1
Programmation des pic_en_c_part1
Programmation des pic_en_c_part1
Programmation des pic_en_c_part1
Programmation des pic_en_c_part1
Programmation des pic_en_c_part1
Programmation des pic_en_c_part1
Programmation des pic_en_c_part1

Contenu connexe

Tendances

QCM basique sur les réseaux informatiques
QCM basique sur les réseaux informatiquesQCM basique sur les réseaux informatiques
QCM basique sur les réseaux informatiquesFrust Rados
 
Equipements d'interconnexion
Equipements d'interconnexionEquipements d'interconnexion
Equipements d'interconnexionInes Kechiche
 
Pour Écrire un Bon Rapport en Informatique
Pour Écrire un Bon Rapport en InformatiquePour Écrire un Bon Rapport en Informatique
Pour Écrire un Bon Rapport en InformatiqueLilia Sfaxi
 
Programmation de systèmes embarqués : Bus et périphériques de communication
Programmation de systèmes embarqués : Bus et périphériques de communicationProgrammation de systèmes embarqués : Bus et périphériques de communication
Programmation de systèmes embarqués : Bus et périphériques de communicationECAM Brussels Engineering School
 
TD2 - UML - Correction
TD2 - UML - CorrectionTD2 - UML - Correction
TD2 - UML - CorrectionLilia Sfaxi
 
Cours1_Architecture_Logicielle.ppt
Cours1_Architecture_Logicielle.pptCours1_Architecture_Logicielle.ppt
Cours1_Architecture_Logicielle.pptSylia3
 
Projet fin d’étude Conception et Mise en place d'un système fleet-tracking
Projet fin d’étude Conception et Mise en place d'un système fleet-trackingProjet fin d’étude Conception et Mise en place d'un système fleet-tracking
Projet fin d’étude Conception et Mise en place d'un système fleet-trackingBorhane Eddine Boulhila
 
Base des systèmes à microprocesseur
Base des systèmes à microprocesseurBase des systèmes à microprocesseur
Base des systèmes à microprocesseurPeronnin Eric
 
Ch4 circuitscombinatoires
Ch4 circuitscombinatoiresCh4 circuitscombinatoires
Ch4 circuitscombinatoiresmickel iron
 
Les règles de passage
Les règles de passageLes règles de passage
Les règles de passagemarwa baich
 
Rapport de stage PFE - Mémoire master: Développement d'une application Android
Rapport de stage PFE - Mémoire master: Développement d'une application AndroidRapport de stage PFE - Mémoire master: Développement d'une application Android
Rapport de stage PFE - Mémoire master: Développement d'une application AndroidBadrElattaoui
 
exercices Corrigées du merise
exercices Corrigées du  meriseexercices Corrigées du  merise
exercices Corrigées du meriseYassine Badri
 
rapport PFE ingénieur génie logiciel INSAT
rapport PFE ingénieur génie logiciel INSATrapport PFE ingénieur génie logiciel INSAT
rapport PFE ingénieur génie logiciel INSATSiwar GUEMRI
 
les-automates-programmables-industriels
les-automates-programmables-industrielsles-automates-programmables-industriels
les-automates-programmables-industrielselectrolouhla
 
Pour une présentation PPT idéale
Pour une présentation PPT idéalePour une présentation PPT idéale
Pour une présentation PPT idéaleKew Sama
 
Rapport stage onee-be_2
Rapport stage onee-be_2Rapport stage onee-be_2
Rapport stage onee-be_2Mounir Kaali
 
Qcm en-informatique-avec-correction
Qcm en-informatique-avec-correction Qcm en-informatique-avec-correction
Qcm en-informatique-avec-correction Jamal Yasser
 
Tp1 compte rendu en langage c
Tp1 compte rendu en langage cTp1 compte rendu en langage c
Tp1 compte rendu en langage cEbrima NJIE
 
Systèmes d'Exploitation - chp6-synchronisation
Systèmes d'Exploitation - chp6-synchronisationSystèmes d'Exploitation - chp6-synchronisation
Systèmes d'Exploitation - chp6-synchronisationLilia Sfaxi
 
logistic_regression_ml.pdf
logistic_regression_ml.pdflogistic_regression_ml.pdf
logistic_regression_ml.pdfSidiAbdallah1
 

Tendances (20)

QCM basique sur les réseaux informatiques
QCM basique sur les réseaux informatiquesQCM basique sur les réseaux informatiques
QCM basique sur les réseaux informatiques
 
Equipements d'interconnexion
Equipements d'interconnexionEquipements d'interconnexion
Equipements d'interconnexion
 
Pour Écrire un Bon Rapport en Informatique
Pour Écrire un Bon Rapport en InformatiquePour Écrire un Bon Rapport en Informatique
Pour Écrire un Bon Rapport en Informatique
 
Programmation de systèmes embarqués : Bus et périphériques de communication
Programmation de systèmes embarqués : Bus et périphériques de communicationProgrammation de systèmes embarqués : Bus et périphériques de communication
Programmation de systèmes embarqués : Bus et périphériques de communication
 
TD2 - UML - Correction
TD2 - UML - CorrectionTD2 - UML - Correction
TD2 - UML - Correction
 
Cours1_Architecture_Logicielle.ppt
Cours1_Architecture_Logicielle.pptCours1_Architecture_Logicielle.ppt
Cours1_Architecture_Logicielle.ppt
 
Projet fin d’étude Conception et Mise en place d'un système fleet-tracking
Projet fin d’étude Conception et Mise en place d'un système fleet-trackingProjet fin d’étude Conception et Mise en place d'un système fleet-tracking
Projet fin d’étude Conception et Mise en place d'un système fleet-tracking
 
Base des systèmes à microprocesseur
Base des systèmes à microprocesseurBase des systèmes à microprocesseur
Base des systèmes à microprocesseur
 
Ch4 circuitscombinatoires
Ch4 circuitscombinatoiresCh4 circuitscombinatoires
Ch4 circuitscombinatoires
 
Les règles de passage
Les règles de passageLes règles de passage
Les règles de passage
 
Rapport de stage PFE - Mémoire master: Développement d'une application Android
Rapport de stage PFE - Mémoire master: Développement d'une application AndroidRapport de stage PFE - Mémoire master: Développement d'une application Android
Rapport de stage PFE - Mémoire master: Développement d'une application Android
 
exercices Corrigées du merise
exercices Corrigées du  meriseexercices Corrigées du  merise
exercices Corrigées du merise
 
rapport PFE ingénieur génie logiciel INSAT
rapport PFE ingénieur génie logiciel INSATrapport PFE ingénieur génie logiciel INSAT
rapport PFE ingénieur génie logiciel INSAT
 
les-automates-programmables-industriels
les-automates-programmables-industrielsles-automates-programmables-industriels
les-automates-programmables-industriels
 
Pour une présentation PPT idéale
Pour une présentation PPT idéalePour une présentation PPT idéale
Pour une présentation PPT idéale
 
Rapport stage onee-be_2
Rapport stage onee-be_2Rapport stage onee-be_2
Rapport stage onee-be_2
 
Qcm en-informatique-avec-correction
Qcm en-informatique-avec-correction Qcm en-informatique-avec-correction
Qcm en-informatique-avec-correction
 
Tp1 compte rendu en langage c
Tp1 compte rendu en langage cTp1 compte rendu en langage c
Tp1 compte rendu en langage c
 
Systèmes d'Exploitation - chp6-synchronisation
Systèmes d'Exploitation - chp6-synchronisationSystèmes d'Exploitation - chp6-synchronisation
Systèmes d'Exploitation - chp6-synchronisation
 
logistic_regression_ml.pdf
logistic_regression_ml.pdflogistic_regression_ml.pdf
logistic_regression_ml.pdf
 

En vedette

Micocontroleur16 fxxx (1)
Micocontroleur16 fxxx (1)Micocontroleur16 fxxx (1)
Micocontroleur16 fxxx (1)Karim Touati
 
Conception avec pic
Conception avec pic Conception avec pic
Conception avec pic nawzat
 
Programmation des pic_en_c_part2
Programmation des pic_en_c_part2Programmation des pic_en_c_part2
Programmation des pic_en_c_part2oussamada
 
Microcontroleur Pic16 F84
Microcontroleur Pic16 F84Microcontroleur Pic16 F84
Microcontroleur Pic16 F84guest1e7b02
 
Microcontrôleur PIC Microchip part1/2
Microcontrôleur PIC Microchip part1/2Microcontrôleur PIC Microchip part1/2
Microcontrôleur PIC Microchip part1/2Mohammed Lamghari
 
Architecture du microprocesseur
Architecture du microprocesseurArchitecture du microprocesseur
Architecture du microprocesseurOndernemersschool
 
Le Micro Processeur
Le Micro ProcesseurLe Micro Processeur
Le Micro Processeurrazman
 
Logiques sequentielle
Logiques sequentielleLogiques sequentielle
Logiques sequentielleAbdelAm20
 
Cours technologie electrique pneumatique
Cours technologie electrique   pneumatiqueCours technologie electrique   pneumatique
Cours technologie electrique pneumatiqueSalah Hammami
 
Tp transcodage logique combinatoire
Tp transcodage logique combinatoireTp transcodage logique combinatoire
Tp transcodage logique combinatoirebilal001
 
Circuits Base Hydraulique
Circuits Base HydrauliqueCircuits Base Hydraulique
Circuits Base Hydrauliqueyouri59490
 
Café Numérique Bruxelles - Les Makers - Arduino
Café Numérique Bruxelles - Les Makers - ArduinoCafé Numérique Bruxelles - Les Makers - Arduino
Café Numérique Bruxelles - Les Makers - ArduinoQuentin Geluyckens
 

En vedette (20)

Cours pics16 f877
Cours pics16 f877Cours pics16 f877
Cours pics16 f877
 
Micocontroleur16 fxxx (1)
Micocontroleur16 fxxx (1)Micocontroleur16 fxxx (1)
Micocontroleur16 fxxx (1)
 
Conception avec pic
Conception avec pic Conception avec pic
Conception avec pic
 
Programmation des pic_en_c_part2
Programmation des pic_en_c_part2Programmation des pic_en_c_part2
Programmation des pic_en_c_part2
 
Microcontroleur Pic16 F84
Microcontroleur Pic16 F84Microcontroleur Pic16 F84
Microcontroleur Pic16 F84
 
Pic16f84
Pic16f84Pic16f84
Pic16f84
 
Microcontroleur
MicrocontroleurMicrocontroleur
Microcontroleur
 
Microcontrôleur PIC Microchip part1/2
Microcontrôleur PIC Microchip part1/2Microcontrôleur PIC Microchip part1/2
Microcontrôleur PIC Microchip part1/2
 
Architecture du microprocesseur
Architecture du microprocesseurArchitecture du microprocesseur
Architecture du microprocesseur
 
mourad 2eme
mourad 2ememourad 2eme
mourad 2eme
 
Le Micro Processeur
Le Micro ProcesseurLe Micro Processeur
Le Micro Processeur
 
Corrige tp java
Corrige tp javaCorrige tp java
Corrige tp java
 
Cours de c
Cours de cCours de c
Cours de c
 
Logiques sequentielle
Logiques sequentielleLogiques sequentielle
Logiques sequentielle
 
Compteur ARDUINO
Compteur ARDUINOCompteur ARDUINO
Compteur ARDUINO
 
Compteur synchrone
Compteur synchroneCompteur synchrone
Compteur synchrone
 
Cours technologie electrique pneumatique
Cours technologie electrique   pneumatiqueCours technologie electrique   pneumatique
Cours technologie electrique pneumatique
 
Tp transcodage logique combinatoire
Tp transcodage logique combinatoireTp transcodage logique combinatoire
Tp transcodage logique combinatoire
 
Circuits Base Hydraulique
Circuits Base HydrauliqueCircuits Base Hydraulique
Circuits Base Hydraulique
 
Café Numérique Bruxelles - Les Makers - Arduino
Café Numérique Bruxelles - Les Makers - ArduinoCafé Numérique Bruxelles - Les Makers - Arduino
Café Numérique Bruxelles - Les Makers - Arduino
 

Similaire à Programmation des pic_en_c_part1

Etude bibliographique sur les algorithmes de compression sans perte
Etude bibliographique sur les algorithmes de compression sans perteEtude bibliographique sur les algorithmes de compression sans perte
Etude bibliographique sur les algorithmes de compression sans perteIbtihejHamdi
 
Algorithmique_et_programmation_part2
Algorithmique_et_programmation_part2Algorithmique_et_programmation_part2
Algorithmique_et_programmation_part2Emeric Tapachès
 
Rapport Projet Application Web De Domotique Arduino - Liotard Roulleau
Rapport Projet Application Web De Domotique Arduino - Liotard RoulleauRapport Projet Application Web De Domotique Arduino - Liotard Roulleau
Rapport Projet Application Web De Domotique Arduino - Liotard RoulleauNicolas Roulleau
 
Electronique et-loisirs-n011
Electronique et-loisirs-n011Electronique et-loisirs-n011
Electronique et-loisirs-n011Cecilia Bevilaqua
 
Projet de-recherche-Tuteuré
Projet de-recherche-TuteuréProjet de-recherche-Tuteuré
Projet de-recherche-TuteuréRullier Anthony
 
Projet réalisé par ameny Khedhira & Arij Mekki
Projet réalisé par  ameny Khedhira & Arij MekkiProjet réalisé par  ameny Khedhira & Arij Mekki
Projet réalisé par ameny Khedhira & Arij MekkiAmeny Khedhira
 
Tp3 automate programmable siemens s7 200
Tp3 automate programmable siemens s7 200Tp3 automate programmable siemens s7 200
Tp3 automate programmable siemens s7 200FATIMAZAHRAELGHEMARY
 
Embedded intro 2006
Embedded intro 2006Embedded intro 2006
Embedded intro 2006mcbinene
 
Veriso be manuel _utilisateur_v2_5_f
Veriso be manuel _utilisateur_v2_5_fVeriso be manuel _utilisateur_v2_5_f
Veriso be manuel _utilisateur_v2_5_fNikolausausBern
 
Tp python dauphine
Tp python dauphineTp python dauphine
Tp python dauphinenoussa krid
 
Conception et implémentation d'un nouveau langage de programmation
Conception et implémentation d'un nouveau langage de programmationConception et implémentation d'un nouveau langage de programmation
Conception et implémentation d'un nouveau langage de programmationAymen Bouein
 
Projet boat loader avec le pic16F887_rapport
Projet boat loader avec le pic16F887_rapportProjet boat loader avec le pic16F887_rapport
Projet boat loader avec le pic16F887_rapportMouhcine Nid Belkacem
 
Android VoIP/SIP Softphone
Android VoIP/SIP SoftphoneAndroid VoIP/SIP Softphone
Android VoIP/SIP SoftphoneHamza Lazaar
 

Similaire à Programmation des pic_en_c_part1 (20)

Etude bibliographique sur les algorithmes de compression sans perte
Etude bibliographique sur les algorithmes de compression sans perteEtude bibliographique sur les algorithmes de compression sans perte
Etude bibliographique sur les algorithmes de compression sans perte
 
Algorithmique_et_programmation_part2
Algorithmique_et_programmation_part2Algorithmique_et_programmation_part2
Algorithmique_et_programmation_part2
 
Rapport Projet Application Web De Domotique Arduino - Liotard Roulleau
Rapport Projet Application Web De Domotique Arduino - Liotard RoulleauRapport Projet Application Web De Domotique Arduino - Liotard Roulleau
Rapport Projet Application Web De Domotique Arduino - Liotard Roulleau
 
Cours python
Cours pythonCours python
Cours python
 
Electronique et-loisirs-n011
Electronique et-loisirs-n011Electronique et-loisirs-n011
Electronique et-loisirs-n011
 
Projet de-recherche-Tuteuré
Projet de-recherche-TuteuréProjet de-recherche-Tuteuré
Projet de-recherche-Tuteuré
 
Langage c
Langage cLangage c
Langage c
 
Preparation tpcisco reseaux
Preparation tpcisco reseauxPreparation tpcisco reseaux
Preparation tpcisco reseaux
 
Projet réalisé par ameny Khedhira & Arij Mekki
Projet réalisé par  ameny Khedhira & Arij MekkiProjet réalisé par  ameny Khedhira & Arij Mekki
Projet réalisé par ameny Khedhira & Arij Mekki
 
47750479 cours-c
47750479 cours-c47750479 cours-c
47750479 cours-c
 
Tp3 automate programmable siemens s7 200
Tp3 automate programmable siemens s7 200Tp3 automate programmable siemens s7 200
Tp3 automate programmable siemens s7 200
 
Embedded intro 2006
Embedded intro 2006Embedded intro 2006
Embedded intro 2006
 
Veriso be manuel _utilisateur_v2_5_f
Veriso be manuel _utilisateur_v2_5_fVeriso be manuel _utilisateur_v2_5_f
Veriso be manuel _utilisateur_v2_5_f
 
Tp python dauphine
Tp python dauphineTp python dauphine
Tp python dauphine
 
Tp python
Tp pythonTp python
Tp python
 
Conception et implémentation d'un nouveau langage de programmation
Conception et implémentation d'un nouveau langage de programmationConception et implémentation d'un nouveau langage de programmation
Conception et implémentation d'un nouveau langage de programmation
 
Twido guide de programmation
Twido guide de programmationTwido guide de programmation
Twido guide de programmation
 
Projet boat loader avec le pic16F887_rapport
Projet boat loader avec le pic16F887_rapportProjet boat loader avec le pic16F887_rapport
Projet boat loader avec le pic16F887_rapport
 
Android VoIP/SIP Softphone
Android VoIP/SIP SoftphoneAndroid VoIP/SIP Softphone
Android VoIP/SIP Softphone
 
Rapport
RapportRapport
Rapport
 

Programmation des pic_en_c_part1

  • 1. Programmation des PIC en C Microcontrôleur facile pour électronicien amateur PARTIE 1 Noxyben 2007 -1-
  • 2. Introduction ................................................................................................................................ 3 Intérêt de la programmation en langage C ................................................................................. 4 Choix du compilateur ................................................................................................................. 5 Choix d’un PIC : le 16F877 ....................................................................................................... 6 Choix du programmateur ........................................................................................................... 7 Structure du PIC 16F877............................................................................................................ 8 Le cœur du PIC : le microprocesseur ..................................................................................... 9 La mémoire .......................................................................................................................... 11 La Pile et le Compteur Programme ...................................................................................... 13 Les Ports d’Entrées/Sorties généraux : PORTA, PORTB, PORTC, PORTD, PORTE....... 15 Le Port Parallèle Esclave (PSP : Parallel Slave Port) .......................................................... 17 Le circuit de génération d’horloge ....................................................................................... 18 Le TIMER0 .......................................................................................................................... 19 Le TIMER1 .......................................................................................................................... 20 Le TIMER2 .......................................................................................................................... 22 Les modules CCP1 et CCP2................................................................................................. 23 Le convertisseur Analogique – Digital 10bits :.................................................................... 25 L’USART ............................................................................................................................. 27 Le SSP, Synchronous Serial Port ......................................................................................... 29 La logique de RESET........................................................................................................... 31 L’In-Circuit Debugger.......................................................................................................... 33 Low-Voltage Programming et ICSP (In-Circuit Serial Programming) ............................... 34 Les Bits de Configuration .................................................................................................... 36 Les Interruptions .................................................................................................................. 36 Le mode SLEEP ................................................................................................................... 37 Brochage du PIC16F877 .......................................................................................................... 38 Conclusion................................................................................................................................ 38 -2-
  • 3. Introduction Dans un passé pas très lointain, l’électronique pour les amateurs (éclairés) se résumait essentiellement aux circuits analogiques et éventuellement en logique câblée (portes logiques, compteurs, registres à décalage…). L’usage des microprocesseurs était plutôt réservé à un public averti d’ingénieurs sachant les interfacer avec différents circuits périphériques (eprom, ram…) et programmer en assembleur. Au fil du temps on a vu apparaître de nouveaux circuits regroupant dans une seule puce le microprocesseur et ses circuits périphériques : les microcontrôleurs. On en trouve maintenant partout : automobile, lave-vaisselle, rasoir, brosse à dent électrique… L’offre en microcontrôleurs s’est développée d’autant : plus de périphériques intégrés, capacité de calcul accrue, plus de mémoire embarquée. Il y a maintenant de nombreux fabricants de microcontrôleurs, possédant chacun plusieurs gammes allant du circuit « généraliste », véritable couteau suisse électronique, à la puce spécialisée dédiée par exemple, à la régulation de vitesse d’un moteur de ventilateur. La voie royale pour tirer le maximum des performances de ces circuits est toujours la programmation en assembleur. On accède alors au moindre bit enfoui dans n’importe quel registre du circuit. Cela nécessite néanmoins un investissement en temps conséquent, l’assembleur n’étant pas un langage très « naturel ». De plus, d’un constructeur à l’autre, voire d’un circuit à l’autre dans la même gamme, il existe des différences qui obligent à réapprendre tout ou partie du langage lorsque l’on change de microcontrôleur. C’est un investissement intéressant pour un professionnel qui cherche à produire un code optimisé sur la puce la moins chère possible, mais pénible pour un amateur qui ne dispose que de relativement peu de temps pris sur ses loisirs. Heureusement, avec la montée en puissance des microcontrôleurs, on voit apparaître actuellement des compilateurs en langage C (voire même C++) qui permettent de gagner un temps considérable pour le développement et le débogage des programmes. Pour tous ceux qui se sont retrouvé largué sur le bord du chemin à cause de ces de microcontrôleurs, c’est à mon avis une formidable opportunité de sauter dans le train de l’électronique numérique et d’apprivoiser ces étranges petites bêtes. Et pourquoi pas un ampli à tubes piloté par microcontrôleur ? Les capacités étonnantes de ces circuits vous ouvrent un espace de créativité infini. Ce serait vraiment dommage de se passer de leurs services… Une fois la décision prise « je vais me lancer dans les micros ! » se pose la question du comment. On trouve sur internet toutes les informations nécessaires, la difficulté serait plutôt de les trier. Vous pouvez commencer par exemple par lire la documentation de Microchip sur la gamme de PIC « mid-range », c’est une excellente idée, mais ça va vous prendre du temps (plus de 800 pages !) Dans le but de vous simplifier la tâche, je vais essayer dans le présent ouvrage de synthétiser quelque peu ces informations. Et pour éviter la frustration du « je saurais utiliser un microcontrôleur PIC, mais avant je dois me taper un bouquin de 1000 pages » je vais tâcher d’utiliser une approche progressive permettant de, très rapidement, créer de véritables petits circuits. -3-
  • 4. Intérêt de la programmation en langage C Tout d’abord, les inconvénients : Un compilateur C produit du code plus volumineux et moins performant que ce que sait faire un bon programmeur en assembleur. De plus, selon le compilateur employé, on n’accède plus difficilement, voire pas du tout à certaines ressources de bas niveau. Et n’ayant plus besoin de plonger les mains dans le cambouis, on risque également de moins approfondir l’étude du microcontrôleur utilisé. Un dernier point : les compilateurs C sont souvent payants. En contrepartie, il y a de sacrés avantages : connaître la programmation en C permet de créer des programmes sur de multiples plateformes, à commencer par les PC. Autrement dit, les connaissances utilisées sont en grande partie réutilisables. Le C est un langage de « haut niveau », comparé à l’assembleur, qui permet d’écrire des programmes nettement plus intelligibles et donc plus faciles à relire et corriger ou modifier. Le compilateur contrôle la cohérence du code au moment de la compilation et signale bon nombre d’erreurs, qui seront autant de bogues en moins à corriger. Le compilateur prend en charge la gestion d’un certain nombre de mécanismes fastidieux : par exemple, pas besoin de spécifier la page mémoire dans laquelle on veut écrire, le compilateur s’en charge ! De plus, certains compilateurs permettent tout de même d’accéder à des ressources de bas niveau, voir même d’insérer dans le code des portions d’assembleur. A vrai dire, à moins d’être un « pro » de l’assembleur, vous pourrez certainement créer avec un bon compilateur C un code plus propre et plus robuste, en nettement moins de temps. Et, cerise sur le gâteau, le portage d’un de vos programmes sur un nouveau microcontrôleur sera nettement simplifié. Pour bien fixer les idées sur la différence de niveau de langage entre assembleur et C, je vais donner un exemple. Soit à décrire une action simple : ouvrir la fenêtre de la pièce dans laquelle vous êtes actuellement. En assembleur ça donnerait : - soulever pied droit - avancer pied droit - poser pied droit - soulever pied gauche - avancer pied gauche - poser pied gauche - soulever pied droit - avancer pied droit - …. - Sélectionner bras gauche - Soulever bras - Avancer bras - Prendre poignée fenêtre dans main gauche - Tourner poignée de -90° - Tirer poignée - Etc.… En C ce serait plutôt : - Ouvrir la fenêtre Et c’est le compilateur qui se chargerait de traduire la fonction « ouvrir la fenêtre » en instructions élémentaires compréhensibles par le microcontrôleur. Alors, merci qui ? Merci le C ! -4-
  • 5. Choix du compilateur Il y a sur le marché plusieurs compilateurs C. Le microcontrôleur étudié ici étant un PIC Microchip, la solution la plus évidente consiste à voir ce que propose Microchip : Si on nous propose bien des compilateurs, ceux-ci sont payants et ne couvrent que le haut de la gamme des PIC, ce qui est un peu luxueux pour un amateur désirant s’initier à l’utilisation de ces petites bêtes. D’autres éditeurs proposent également des compilateurs dont certains sont très complets, livrés avec des bibliothèques simplifiant l’utilisation des périphériques du PIC. Malheureusement, ici encore c’est assez cher, jusqu’à plusieurs centaines d’euros pour un environnement de développement intégré couvrant l’essentiel de la gamme des PIC. Heureusement il existe des alternatives moins onéreuses. Par exemple, en cherchant bien sur internet on peut dénicher des compilateurs freeware en ligne de commande. Mon choix s’est porté sur le compilateur BoostC de la société SourceBoost, pour les raisons suivantes : Il existe une version gratuite avec quelques limitations mineures (taille du code généré…) permettant de se faire la main et de créer des applications personnelles, les versions payantes (à des tarifs très raisonnables) permettent de créer des applications commerciales et d’avoir accès au code source des bibliothèques. BoostC est livré avec un environnement de développement intégré facilitant le développement d’applications. Le langage est du C « ANSI », avec toutefois quelques extensions destinées à tirer pleinement parti de toutes les spécificités des microcontrôleurs PIC. Et surtout, BoostC reste assez proche du matériel : on peut très facilement accéder à tous les bits d’un registre quelquonque. On peut faire l’essentiel de ce qu’il est possible de faire en assembleur, avec les contraintes en moins. Ce qui sous-entend néanmoins de s’intéresser d’assez près à la structure du PIC et de des différents sous-ensembles. A noter que SourceBoost propose également un compilateur C++ pour PIC, ainsi qu’un compilateur Basic. http://www.sourceboost.com -5-
  • 6. Choix d’un PIC : le 16F877 Pour apprendre, la meilleurs solution est de se faire la main sur du concret. On va donc étudier un vrai microcontrôleur, sachant que ce qui aura été vu sera assez facilement transposable à d’autres PIC. Le 16F877 est un PIC de la série « Mid- range » qui se prête particulièrement bien à la programmation en C. Les PIC de la série inférieure sont un peu justes en performance et en capacité mémoire pour accueillir un programme issu d’un compilateur C ; mieux vaut les programmer en assembleur. Les gammes supérieures (16 ou 32 bits) supportent sans problème la programmation en C, mais comme se sont des circuits plus complexes (et plus chers), commençons par quelque chose de plus simple et de plus didactique. Le 16F877 (F comme « Flash ») convient parfaitement : mémoire programme de taille suffisante (8K), nombreux périphériques intégrés, fréquence de fonctionnement jusqu’à 20 MHz. Tout ce qu’il faut pour créer des applications sympa en s’amusant ! -6-
  • 7. Choix du programmateur Une fois le programme créé, il faudra le transférer dans la mémoire programme du PIC. Pour cela, il existe plusieurs solutions : Vous pouvez construire votre propre programmateur. De nombreuses variantes existent, il suffit de faire une recherche sur le net pour s’en rendre compte. Ces programmateurs se raccordent sur un port série RS232 ou parallèle. A vrai dire la majorité des circuits ont un air de famille. Pas sûr néanmoins que tous fonctionnent. Si vous vous engagez dans cette voie, un des « design » les plus rigoureux est certainement celui proposé par Microchip dans une de ses « Application Note » (à voir sur le site de Microchip). Vous pouvez aussi acheter un programmateur tout fait, en état de marche. Il en existe pour port série, parallèle et, USB ! Sachant que les ports série RS232 et parallèle tendent à disparaître au profit de l’USB, cette dernière option, bien que souvent un peu plus onéreuse semble être un bon choix. Il existe en outre des outils permettant à la fois de programmer le microcontrôleur, mais aussi de le déboguer en temps réel et tout ça avec le microcontrôleur en place dans son circuit d’application (voir les outils proposés par Microchip à ce sujet). Enfin, il y a la solution du programmateur en kit. Après m’être lancé dans un premier temps dans la réalisation d’un programmateur « home made » (décrit dans un livre fort onéreux) qui n’a jamais daigné fonctionner, je me suis tourné vers cette dernière solution : Un programmateur en kit Velleman K8076 pour une quarantaine d’euros (c'est-à-dire moins cher que le prix des composants de celui que j’ai vainement tenté de réaliser moi-même), équipé d’un support ZIF (Zéro Insertion Force). Il permet en outre la programmation « in-circuit », et est livré avec un logiciel de transfert compatible avec l’essentiel de la gamme des PIC. Des mises à jour étant disponibles sur le site de Velleman pour les circuits les plus récents. Il faut procéder au montage soi-même, mais ça marche du premier coup ! (du moins si vous êtes rigoureux au moment du montage). Le seul inconvénient : il s’agit ici d’un programmateur à raccorder sur port RS232, donc impossible à raccorder sur un pc portable récent. Un jour ou l’autre il faudra bien passer par l’USB… http://www.velleman.be -7-
  • 8. Structure du PIC 16F877 13 DATA Bus 8 PORTA Program Counter RA0 / AN0 FLASH RA1 / AN1 RA2 / AN2 / Vref- Program Memory RAM RA3 / AN3 / Vref+ 8 Level Stack ( 13-bit ) File RA4 / T0CKl Registers RA5 / AN4 / SS Program 14 PORTB Bus RAM Addr (1) 9 RB0 / INT Addr MUX RB1 Instruction reg RB2 Direct Addr 7 Indirect 8 RB3 / PGM Addr RB4 FSR reg RB5 RB6 / PGC STATUS reg RB7 / PGD 8 PORTC RC0 / T1OSO / T1CKL 3 MUX Power-up RC1 / T1OSI / CCP2 Timer RC2 / CCP1 Instruction RC3 / SCK / SCL Oscillator Decode & Start-up Timer RC4 / SDI / SDA ALU Control RC5 / SD0 Power-on RC6 / TX / CK Reset 8 RC7 / RX / DT Timing Watchdog W reg Generation Timer PORTD OSC1 / CLKIN Brown-out RD0 / PSP0 OSC2 / CLKOUT Reset RD1 / PSP1 In-Circuit RD2 / PSP2 Debugger RD3 / PSP3 Low-Voltage RD4 / PSP4 Programming Parallel Slave Port RD5 / PSP5 RD6 / PSP6 RD7 / PSP7 PORTE MCLR VDD, Vss RE0 / AN5 / RD RE1 / AN6 / WR RE2 / AN7 / CS Timer0 Timer1 Timer2 10-bit A/D Synchronous Data EEPROM CCP1,2 USART Serial Port Note 1 : High order bits are from the STATUS register Le schéma ci-dessus représente les différents modules du PIC 16F877. Ca a l’air un peu complexe au premier abord, une visite guidée nous permettra d’y voir plus clair. -8-
  • 9. Le cœur du PIC : le microprocesseur Un microcontrôleur, c’est avant tout un microprocesseur, une unité de traitement logique qui effectue l’une après l’autre les opérations contenues dans un microprogramme stocké en mémoire (la mémoire FLASH). On peut le voir sur le schéma (en jaune ci-dessous), il est essentiellement composé de l’ « ALU » (Unité Arithmétique et Logique) qui effectue les opérations sur les donnés, le registre de travail « W reg. », le multiplexeur « MUX », le registre de statut « status reg », le registre « FSR reg » utilisé pour l’adressage indirect (en assembleur…), le multiplexeur d’adresse « Addr mux », le compteur programme « Program Counter » qui pointe les instructions à exécuter, la pile à 8 niveaux « 8 level Stack », le registre d’instruction « Instruction reg », ainsi que les différents bus qui relient tous ces éléments entre eux. 13 DATA Bus 8 PORTA Program Counter RA0 / AN0 FLASH RA1 / AN1 RA2 / AN2 / Vref- Program Memory RAM RA3 / AN3 / Vref+ 8 Level Stack ( 13-bit ) File RA4 / T0CKl Registers RA5 / AN4 / SS Program 14 PORTB Bus RAM Addr (1) 9 RB0 / INT Addr MUX RB1 Instruction reg RB2 Direct Addr 7 Indirect 8 RB3 / PGM Addr RB4 FSR reg RB5 RB6 / PGC STATUS reg RB7 / PGD 8 PORTC RC0 / T1OSO / T1CKL 3 MUX Power-up RC1 / T1OSI / CCP2 Timer RC2 / CCP1 Instruction RC3 / SCK / SCL Oscillator Decode & Start-up Timer RC4 / SDI / SDA ALU Control RC5 / SD0 Power-on RC6 / TX / CK Reset 8 RC7 / RX / DT Timing Watchdog W reg Generation Timer PORTD OSC1 / CLKIN Brown-out RD0 / PSP0 OSC2 / CLKOUT Reset RD1 / PSP1 In-Circuit RD2 / PSP2 Debugger RD3 / PSP3 Low-Voltage RD4 / PSP4 Programming Parallel Slave Port RD5 / PSP5 RD6 / PSP6 RD7 / PSP7 PORTE MCLR VDD, Vss RE0 / AN5 / RD RE1 / AN6 / WR RE2 / AN7 / CS Timer0 Timer1 Timer2 10-bit A/D Synchronous Data EEPROM CCP1,2 USART Serial Port Note 1 : High order bits are from the STATUS register -9-
  • 10. On n’entrera pas ici dans les détails du fonctionnement d’un microprocesseur ; c’est très intéressant à connaître, indispensable même si on programme en assembleur. Mais en ce qui nous concerne, on veut programmer en C, et c’est donc le compilateur qui se chargera de traduire notre code source en instructions de bas- niveau pour le microprocesseur contenu dans le PIC. C’est là le principal avantage de la programmation en C : on prend du recul par rapport au fonctionnement intime du système. On se concentre d’avantage sur « ce que fait le programme » que sur « comment fonctionne le programme ». On va tout de même jeter un petit coup d’œil sur le schéma ci-dessus, histoire de comprendre quelques particularités du PIC, déroutantes au premier abord. On s’aperçoit que les bus autour de l’ALU ont un format de 8 bits : le PIC 16F877 travaille sur des données de 8 bits, c’est donc bien un microcontrôleur 8 bits ! (logique…). Pourquoi donc ce cas le « Program Bus » est-il, lui, large de 14 bits ? C’est simple, certaines instructions peuvent être codées sur plus de 8 bits. Si ce bus n’était large que de 8 bits, il faudrait plus d’un cycle d’horloge pour transmettre ces instructions, alors qu’avec un bus plus large, ça passe en une fois. De plus, la mémoire programme, indépendante du bus de données, est elle-même adressée avec un bus large : le « Program Counter », qui pointe sur l’instruction en cours, à une largeur de 13 bits. Et avec 13 bits on peut coder environ 8000 adresses. Autrement dit, on à 8000 cases de mémoire programme pouvant contenir chacune 1 instruction complète. Cette architecture avec bus de données et de programme séparés (architecture « Harvard ») permet donc d’optimiser le fonctionnement du PIC. La plupart du temps, votre PIC exécute une instruction et charge la suivante simultanément en un seul cycle d’horloge. En comparaison, un microcontrôleur 8 bits construit selon l’architecture concurrente « Von Neumann » (mémoire programme et données reliés au microprocesseur par un unique bus 8 bits) devra faire plusieurs cycles pour chercher les instructions en mémoire (en plusieurs fois si c’est une instruction longues) et les exécuter ensuite. En conséquence, à fréquence d’horloge égales, un microprocesseur « Harvard » sera plus rapide qu’un « Von Neumann ». - 10 -
  • 11. La mémoire Sur le PIC, il n’y a pas une mais trois mémoires : 13 DATA Bus 8 PORTA Program Counter RA0 / AN0 FLASH RA1 / AN1 RA2 / AN2 / Vref- Program Memory RAM RA3 / AN3 / Vref+ 8 Level Stack ( 13-bit ) File RA4 / T0CKl Registers RA5 / AN4 / SS Program 14 PORTB Bus RAM Addr (1) 9 RB0 / INT Addr MUX RB1 Instruction reg RB2 Direct Addr 7 Indirect 8 RB3 / PGM Addr RB4 FSR reg RB5 RB6 / PGC STATUS reg RB7 / PGD 8 PORTC RC0 / T1OSO / T1CKL 3 MUX Power-up RC1 / T1OSI / CCP2 Timer RC2 / CCP1 Instruction RC3 / SCK / SCL Oscillator Decode & Start-up Timer RC4 / SDI / SDA ALU Control RC5 / SD0 Power-on RC6 / TX / CK Reset 8 RC7 / RX / DT Timing Watchdog W reg Generation Timer PORTD OSC1 / CLKIN Brown-out RD0 / PSP0 OSC2 / CLKOUT Reset RD1 / PSP1 In-Circuit RD2 / PSP2 Debugger RD3 / PSP3 Low-Voltage RD4 / PSP4 Programming Parallel Slave Port RD5 / PSP5 RD6 / PSP6 RD7 / PSP7 PORTE MCLR VDD, Vss RE0 / AN5 / RD RE1 / AN6 / WR RE2 / AN7 / CS Timer0 Timer1 Timer2 10-bit A/D Synchronous Data EEPROM CCP1,2 USART Serial Port Note 1 : High order bits are from the STATUS register La Mémoire Programme, de type FLASH sur le 16F877. Capacité : 8K. C’est dans celle-ci qu’est stocké le programme du PIC. Après compilation de votre code, le compilateur génère un fichier « .hex », une suite de codes hexadécimaux. Celui-ci est transféré ensuite dans la mémoire programme du PIC à l’aide du programmateur. Cette mémoire n’est pas reliée au bus de données (DATA Bus), sa vocation est de stocker le programme du PIC, mais PAS les variables de votre programme. Le gros avantage de la mémoire FLASH c’est que vous pouvez la réécrire, donc implanter un nouveau programme dans le PIC. Les PIC existent également avec d’autres versions de mémoire programme (non-FLASH), certaines ne pouvant être programmée qu’une seule fois. - 11 -
  • 12. La Mémoire RAM, qui fait partie de la zone d’adressage des données. Elle comprend tous les registres spéciaux permettant de contrôler le cœur du PIC ainsi que ses périphériques. Elle contient également des cases mémoires à usage générique dans lesquelles pourront être stockées les variables de nos futurs programmes. La Mémoire EEPROM. L’EEPROM est plutôt une mémoire de stockage de données à long terme, alors que la RAM est utilisée pour les variables du programme. Sur le PIC 16F877, on a 256 octets d’EEPROM disponible. Les mémoires de type EEPROM sont limitées en nombre de cycles d’effacement / écriture. Ce nombre de cycle est tout de même de l’ordre du million pour le PIC, mais si on l’utilisait pour stocker des variables modifiées plusieurs milliers de fois par secondes, cette limite pourrais être atteinte plus vite qu’on ne le croît. Par contre, pour stocker toute les heures une mesure de température, c’est tout bon ! - 12 -
  • 13. La Pile et le Compteur Programme On les a déjà évoqués dans le paragraphe « le cœur du PIC : le microprocesseur », mais puisqu’on vient de parler de la mémoire, une petite remarque s’impose. 13 DATA Bus 8 PORTA Program Counter RA0 / AN0 FLASH RA1 / AN1 RA2 / AN2 / Vref- Program Memory RAM RA3 / AN3 / Vref+ 8 Level Stack ( 13-bit ) File RA4 / T0CKl Registers RA5 / AN4 / SS Program 14 PORTB Bus RAM Addr (1) 9 RB0 / INT Addr MUX RB1 Instruction reg RB2 Direct Addr 7 Indirect 8 RB3 / PGM Addr RB4 FSR reg RB5 RB6 / PGC STATUS reg RB7 / PGD 8 PORTC RC0 / T1OSO / T1CKL 3 MUX Power-up RC1 / T1OSI / CCP2 Timer RC2 / CCP1 Instruction RC3 / SCK / SCL Oscillator Decode & Start-up Timer RC4 / SDI / SDA ALU Control RC5 / SD0 Power-on RC6 / TX / CK Reset 8 RC7 / RX / DT Timing Watchdog W reg Generation Timer PORTD OSC1 / CLKIN Brown-out RD0 / PSP0 OSC2 / CLKOUT Reset RD1 / PSP1 In-Circuit RD2 / PSP2 Debugger RD3 / PSP3 Low-Voltage RD4 / PSP4 Programming Parallel Slave Port RD5 / PSP5 RD6 / PSP6 RD7 / PSP7 PORTE MCLR VDD, Vss RE0 / AN5 / RD RE1 / AN6 / WR RE2 / AN7 / CS Timer0 Timer1 Timer2 10-bit A/D Synchronous Data EEPROM CCP1,2 USART Serial Port Note 1 : High order bits are from the STATUS register - 13 -
  • 14. Le « Program Counter » ou PC est le compteur qui pointe dans la mémoire programme la prochaine instruction à exécuter. Il est lié à la pile système (Pile = Stack en anglais) qui est sur le PIC 16F877 une pile 8 niveaux. Qu’est ce que cela signifie ? Simplement qu’on peut avoir jusqu'à 8 niveaux d’imbrication d’appels de sous-programme ou fonctions. Ce point est surtout critique pour la programmation en assembleur : un sous-programme peut appeler un autre sous-programme qui appelle à son tour un autre sous-programme… jusqu’à une « profondeur » de 8. Au-delà, c’est la cata : votre programme est buggé et va faire n’importe quoi, étant donné que le PIC ne peut « dépiler » que 8 niveaux. Le Compteur Programme n’arrivera pas à revenir à la racine des appels. La programmation en C apporte là un peu de souplesse : un bon compilateur veillera pour vous à ce que la limite de 8 niveaux ne soit pas dépassée, quitte à recopier localement une fonction pour éviter un saut à l’adresse mémoire où cette fonction est déjà présente. Au détriment donc de l’occupation en mémoire. Ainsi, mieux vaut-il éviter de créer trop de niveaux d’imbrication d’appels de fonctions dans nos programmes. - 14 -
  • 15. Les Ports d’Entrées/Sorties généraux : PORTA, PORTB, PORTC, PORTD, PORTE 13 DATA Bus 8 PORTA Program Counter RA0 / AN0 FLASH RA1 / AN1 RA2 / AN2 / Vref- Program Memory RAM RA3 / AN3 / Vref+ 8 Level Stack ( 13-bit ) File RA4 / T0CKl Registers RA5 / AN4 / SS Program 14 PORTB Bus RAM Addr (1) 9 RB0 / INT Addr MUX RB1 Instruction reg RB2 Direct Addr 7 Indirect 8 RB3 / PGM Addr RB4 FSR reg RB5 RB6 / PGC STATUS reg RB7 / PGD 8 PORTC RC0 / T1OSO / T1CKL 3 MUX Power-up RC1 / T1OSI / CCP2 Timer RC2 / CCP1 Instruction RC3 / SCK / SCL Oscillator Decode & Start-up Timer RC4 / SDI / SDA ALU Control RC5 / SD0 Power-on RC6 / TX / CK Reset 8 RC7 / RX / DT Timing Watchdog W reg Generation Timer PORTD OSC1 / CLKIN Brown-out RD0 / PSP0 OSC2 / CLKOUT Reset RD1 / PSP1 In-Circuit RD2 / PSP2 Debugger RD3 / PSP3 Low-Voltage RD4 / PSP4 Programming Parallel Slave Port RD5 / PSP5 RD6 / PSP6 RD7 / PSP7 PORTE MCLR VDD, Vss RE0 / AN5 / RD RE1 / AN6 / WR RE2 / AN7 / CS Timer0 Timer1 Timer2 10-bit A/D Synchronous Data EEPROM CCP1,2 USART Serial Port Note 1 : High order bits are from the STATUS register - 15 -
  • 16. Le PIC 16F877 est généreusement doté de 5 ports, ce qui est plutôt confortable. Un examen plus attentif du schéma ci-dessus nous montre cependant que les lignes d’entrées/sorties (les pattes du composant) correspondantes sont également utilisées par d’autres modules du PIC. Ainsi, les pattes du PORTA servent également au convertisseur Analogique/Numérique, les pattes du PORTD au Port Parallèle Esclave, etc. Il faudra faire des choix au moment de la conception du schéma électronique ! On voit également que les ports B, C et D ont 8 lignes d’entrée/sortie, alors que le port A n’en a que 6 et le port E que 3. Ils sont tous connectés au bus de donnée (DATA BUS), on pourra donc librement les adresser pour y lire ou écrire des données, et donc allumer des LED, commander des moteurs pas à pas, des afficheurs LCD, lire les données envoyées par un clavier ou un bouton poussoir… On peut configurer les entrées/sorties de chaque port en entrée ou en sortie, grâce à un registre spécial dédié à chaque port. De plus, un des ports (le port B) possède des résistances de « pull-up » internes qui peuvent êtres validées ou non par logiciel. - 16 -
  • 17. Le Port Parallèle Esclave (PSP : Parallel Slave Port) 13 DATA Bus 8 PORTA Program Counter RA0 / AN0 FLASH RA1 / AN1 RA2 / AN2 / Vref- Program Memory RAM RA3 / AN3 / Vref+ 8 Level Stack ( 13-bit ) File RA4 / T0CKl Registers RA5 / AN4 / SS Program 14 PORTB Bus RAM Addr (1) 9 RB0 / INT Addr MUX RB1 Instruction reg RB2 Direct Addr 7 Indirect 8 RB3 / PGM Addr RB4 FSR reg RB5 RB6 / PGC STATUS reg RB7 / PGD 8 PORTC RC0 / T1OSO / T1CKL 3 MUX Power-up RC1 / T1OSI / CCP2 Timer RC2 / CCP1 Instruction RC3 / SCK / SCL Oscillator Decode & Start-up Timer RC4 / SDI / SDA ALU Control RC5 / SD0 Power-on RC6 / TX / CK Reset 8 RC7 / RX / DT Timing Watchdog W reg Generation Timer PORTD OSC1 / CLKIN Brown-out RD0 / PSP0 OSC2 / CLKOUT Reset RD1 / PSP1 In-Circuit RD2 / PSP2 Debugger RD3 / PSP3 Low-Voltage RD4 / PSP4 Programming Parallel Slave Port RD5 / PSP5 RD6 / PSP6 RD7 / PSP7 PORTE MCLR VDD, Vss RE0 / AN5 / RD RE1 / AN6 / WR RE2 / AN7 / CS Timer0 Timer1 Timer2 10-bit A/D Synchronous Data EEPROM CCP1,2 USART Serial Port Note 1 : High order bits are from the STATUS register Le Port Parallèle Esclave est un port 8 bits permettant d’interfacer le PIC avec, par exemple, un autre microprocesseur. Les données transitent via les lignes PSP0 à PSP7, qui physiquement utilisent les mêmes broches que le PORTD. Le flux de données est contrôlé par les lignes RD, WR et CS qui correspondent aux broches du PORTE. C’est le microprocesseur externe qui est le chef d’orchestre : il valide notre PIC par la ligne CS (Chip Select), et indique au PIC s’il lit ou écrit grâce aux lignes RD (Read) et WR (Write). D’où l’appellation de port parallèle ESCLAVE. Esclave, puisque c’est le microprocesseur externe qui donne les ordres, notre PIC ne fait qu’exécuter. - 17 -
  • 18. Le circuit de génération d’horloge 13 DATA Bus 8 PORTA Program Counter RA0 / AN0 FLASH RA1 / AN1 RA2 / AN2 / Vref- Program Memory RAM RA3 / AN3 / Vref+ 8 Level Stack ( 13-bit ) File RA4 / T0CKl Registers RA5 / AN4 / SS Program 14 PORTB Bus RAM Addr (1) 9 RB0 / INT Addr MUX RB1 Instruction reg RB2 Direct Addr 7 Indirect 8 RB3 / PGM Addr RB4 FSR reg RB5 RB6 / PGC STATUS reg RB7 / PGD 8 PORTC RC0 / T1OSO / T1CKL 3 MUX Power-up RC1 / T1OSI / CCP2 Timer RC2 / CCP1 Instruction RC3 / SCK / SCL Oscillator Decode & Start-up Timer RC4 / SDI / SDA ALU Control RC5 / SD0 Power-on RC6 / TX / CK Reset 8 RC7 / RX / DT Timing Watchdog W reg Generation Timer PORTD OSC1 / CLKIN Brown-out RD0 / PSP0 OSC2 / CLKOUT Reset RD1 / PSP1 In-Circuit RD2 / PSP2 Debugger RD3 / PSP3 Low-Voltage RD4 / PSP4 Programming Parallel Slave Port RD5 / PSP5 RD6 / PSP6 RD7 / PSP7 PORTE MCLR VDD, Vss RE0 / AN5 / RD RE1 / AN6 / WR RE2 / AN7 / CS Timer0 Timer1 Timer2 10-bit A/D Synchronous Data EEPROM CCP1,2 USART Serial Port Note 1 : High order bits are from the STATUS register Pour faire battre le cœur de notre PIC, on a besoin d’un circuit de génération d’horloge. Avec les PIC « Mid Range », plusieurs options possibles : circuit RC (résistance + condensateur), ou circuit résonateur céramique, ou oscillateur à quartz... Le mode de fonctionnement est déterminé au moment de la programmation du PIC par des « bits de configuration » qui sont en fait des emplacements de mémoire non-volatile. Pour générer un « cycle d’instruction », il faut 4 cycles d’horloge. Autrement dit, si votre quartz bat à 20 MHz, les instructions du programme s’exécutent à une cadence de 5 MHz. - 18 -
  • 19. Le TIMER0 13 DATA Bus 8 PORTA Program Counter RA0 / AN0 FLASH RA1 / AN1 RA2 / AN2 / Vref- Program Memory RAM RA3 / AN3 / Vref+ 8 Level Stack ( 13-bit ) File RA4 / T0CKl Registers RA5 / AN4 / SS Program 14 PORTB Bus RAM Addr (1) 9 RB0 / INT Addr MUX RB1 Instruction reg RB2 Direct Addr 7 Indirect 8 RB3 / PGM Addr RB4 FSR reg RB5 RB6 / PGC STATUS reg RB7 / PGD 8 PORTC RC0 / T1OSO / T1CKL 3 MUX Power-up RC1 / T1OSI / CCP2 Timer RC2 / CCP1 Instruction RC3 / SCK / SCL Oscillator Decode & Start-up Timer RC4 / SDI / SDA ALU Control RC5 / SD0 Power-on RC6 / TX / CK Reset 8 RC7 / RX / DT Timing Watchdog W reg Generation Timer PORTD OSC1 / CLKIN Brown-out RD0 / PSP0 OSC2 / CLKOUT Reset RD1 / PSP1 In-Circuit RD2 / PSP2 Debugger RD3 / PSP3 Low-Voltage RD4 / PSP4 Programming Parallel Slave Port RD5 / PSP5 RD6 / PSP6 RD7 / PSP7 PORTE MCLR VDD, Vss RE0 / AN5 / RD RE1 / AN6 / WR RE2 / AN7 / CS Timer0 Timer1 Timer2 10-bit A/D Synchronous Data EEPROM CCP1,2 USART Serial Port Note 1 : High order bits are from the STATUS register Dans le passé, le Timer0 s’appelait RTCC. C’est un compteur 8 bits (0 à 255) simple, qui compte des impulsions soit internes, soit d’une source externe. On peut par ailleurs lui appliquer une pré-division programmable entre 1 et 256. On peut librement lire ou écrire dans le registre de comptage associé. On peut donc le pré charger avec une valeur, à partir de laquelle il comptera jusqu’à atteindre 255. Une fois le registre de comptage plein, il peut générer une interruption. Étant donné qu’une fois configuré il fonctionne quasi-indépendamment du microprocesseur, on pourra s’en servir comme base de temps. - 19 -
  • 20. Le TIMER1 13 DATA Bus 8 PORTA Program Counter RA0 / AN0 FLASH RA1 / AN1 RA2 / AN2 / Vref- Program Memory RAM RA3 / AN3 / Vref+ 8 Level Stack ( 13-bit ) File RA4 / T0CKl Registers RA5 / AN4 / SS Program 14 PORTB Bus RAM Addr (1) 9 RB0 / INT Addr MUX RB1 Instruction reg RB2 Direct Addr 7 Indirect 8 RB3 / PGM Addr RB4 FSR reg RB5 RB6 / PGC STATUS reg RB7 / PGD 8 PORTC RC0 / T1OSO / T1CKL 3 MUX Power-up RC1 / T1OSI / CCP2 Timer RC2 / CCP1 Instruction RC3 / SCK / SCL Oscillator Decode & Start-up Timer RC4 / SDI / SDA ALU Control RC5 / SD0 Power-on RC6 / TX / CK Reset 8 RC7 / RX / DT Timing Watchdog W reg Generation Timer PORTD OSC1 / CLKIN Brown-out RD0 / PSP0 OSC2 / CLKOUT Reset RD1 / PSP1 In-Circuit RD2 / PSP2 Debugger RD3 / PSP3 Low-Voltage RD4 / PSP4 Programming Parallel Slave Port RD5 / PSP5 RD6 / PSP6 RD7 / PSP7 PORTE MCLR VDD, Vss RE0 / AN5 / RD RE1 / AN6 / WR RE2 / AN7 / CS Timer0 Timer1 Timer2 10-bit A/D Synchronous Data EEPROM CCP1,2 USART Serial Port Note 1 : High order bits are from the STATUS register - 20 -
  • 21. Le Timer1 fonctionne sur le même principe que le Timer0, mais avec un registre de comptage plus gros : 16 bits au lieu de 8, ce qui étend notablement ces capacités de comptage. De plus, il possède un mode de fonctionnement particulier : on peut l’utiliser en association avec un des modules CCP (modules de capture et de comparaison, voir plus loin). Voyons rapidement le mode « capture » : lorsqu’un événement survient sur l’entrée du module CCP, la valeur du Timer1 est lue. Comme on connaît la fréquence de comptage, on peut en quelque sorte « chronométrer » la survenue d’un événement. Exemple : si l’entrée du module CCP est reliée à un capteur qui délivre une impulsion à chaque tour de l’arbre d’un moteur, la valeur contenue dans le registre du Timer1 au moment de l’impulsion est le reflet de la vitesse de rotation. Voyons maintenant le mode « comparaison » : Le Timer1 compte en continu, et une interruption est générée chaque fois que la valeur du compteur est égale à celle qu’on aura pré chargée dans le registre de comparaison. On peut s’en servir pour, par exemple, générer un signal carré. - 21 -
  • 22. Le TIMER2 13 DATA Bus 8 PORTA Program Counter RA0 / AN0 FLASH RA1 / AN1 RA2 / AN2 / Vref- Program Memory RAM RA3 / AN3 / Vref+ 8 Level Stack ( 13-bit ) File RA4 / T0CKl Registers RA5 / AN4 / SS Program 14 PORTB Bus RAM Addr (1) 9 RB0 / INT Addr MUX RB1 Instruction reg RB2 Direct Addr 7 Indirect 8 RB3 / PGM Addr RB4 FSR reg RB5 RB6 / PGC STATUS reg RB7 / PGD 8 PORTC RC0 / T1OSO / T1CKL 3 MUX Power-up RC1 / T1OSI / CCP2 Timer RC2 / CCP1 Instruction RC3 / SCK / SCL Oscillator Decode & Start-up Timer RC4 / SDI / SDA ALU Control RC5 / SD0 Power-on RC6 / TX / CK Reset 8 RC7 / RX / DT Timing Watchdog W reg Generation Timer PORTD OSC1 / CLKIN Brown-out RD0 / PSP0 OSC2 / CLKOUT Reset RD1 / PSP1 In-Circuit RD2 / PSP2 Debugger RD3 / PSP3 Low-Voltage RD4 / PSP4 Programming Parallel Slave Port RD5 / PSP5 RD6 / PSP6 RD7 / PSP7 PORTE MCLR VDD, Vss RE0 / AN5 / RD RE1 / AN6 / WR RE2 / AN7 / CS Timer0 Timer1 Timer2 10-bit A/D Synchronous Data EEPROM CCP1,2 USART Serial Port Note 1 : High order bits are from the STATUS register Le Timer2 a un fonctionnement différent des Timer0 et Timer1. C’est un compteur 8 bits avec pré-diviseur et post-diviseur. On s’en sert pour générer des signaux carrés, ou, en association avec le module CCP, des signaux PWM. PWM étant l’acronyme de « Pulse Width Modulation » ou, en français, Modulation de Largeur d’Impulsion (MLI). - 22 -
  • 23. Les modules CCP1 et CCP2 13 DATA Bus 8 PORTA Program Counter RA0 / AN0 FLASH RA1 / AN1 RA2 / AN2 / Vref- Program Memory RAM RA3 / AN3 / Vref+ 8 Level Stack ( 13-bit ) File RA4 / T0CKl Registers RA5 / AN4 / SS Program 14 PORTB Bus RAM Addr (1) 9 RB0 / INT Addr MUX RB1 Instruction reg RB2 Direct Addr 7 Indirect 8 RB3 / PGM Addr RB4 FSR reg RB5 RB6 / PGC STATUS reg RB7 / PGD 8 PORTC RC0 / T1OSO / T1CKL 3 MUX Power-up RC1 / T1OSI / CCP2 Timer RC2 / CCP1 Instruction RC3 / SCK / SCL Oscillator Decode & Start-up Timer RC4 / SDI / SDA ALU Control RC5 / SD0 Power-on RC6 / TX / CK Reset 8 RC7 / RX / DT Timing Watchdog W reg Generation Timer PORTD OSC1 / CLKIN Brown-out RD0 / PSP0 OSC2 / CLKOUT Reset RD1 / PSP1 In-Circuit RD2 / PSP2 Debugger RD3 / PSP3 Low-Voltage RD4 / PSP4 Programming Parallel Slave Port RD5 / PSP5 RD6 / PSP6 RD7 / PSP7 PORTE MCLR VDD, Vss RE0 / AN5 / RD RE1 / AN6 / WR RE2 / AN7 / CS Timer0 Timer1 Timer2 10-bit A/D Synchronous Data EEPROM CCP1,2 USART Serial Port Note 1 : High order bits are from the STATUS register - 23 -
  • 24. On en a parlé au moment de voir les Timer1 et Timer2 ; on a deux modules CCP sur le PIC. CCP pour « Capture, Compare, PWM ». En association avec les deux timers, ils vont nous permettre de générer des signaux à modulation de largeur d’impulsion (PWM) pour, par exemple, faire varier la vitesse d’un moteur à courant continu, réguler le courant (et donc la luminosité) dans une ampoule… Ils vont également nous permettre de comparer l’occurrence d’un signal en entrée avec la valeur du compteur Timer1, réalisant ainsi un chronométrage de l’événement en question (par exemple : indication de la fréquence de rotation d’un moteur). Ils vont encore nous permettre de générer des signaux carrés, et cela de manière quasi-indépendante du reste du microcontrôleur qui pourra continuer à vaquer à ses occupations. - 24 -