Programmation des PIC en CMicrocontrôleur facile pour électronicien amateur                   PARTIE 1                    ...
Introduction ................................................................................................................
IntroductionDans un passé pas très lointain, l’électronique pour les amateurs (éclairés) serésumait essentiellement aux ci...
Intérêt de la programmation en langage CTout d’abord, les inconvénients : Un compilateur C produit du code plus volumineux...
Choix du compilateurIl y a sur le marché plusieurs compilateurs C. Le microcontrôleur étudié ici étant unPIC Microchip, la...
Choix d’un PIC : le 16F877Pour apprendre, la meilleurs solution est de se faire la main sur du concret. On vadonc étudier ...
Choix du programmateurUne fois le programme créé, il faudra le transférer dans la mémoire programme duPIC. Pour cela, il e...
Structure du PIC 16F877                                          13                                      DATA Bus         ...
Le cœur du PIC : le microprocesseurUn microcontrôleur, c’est avant tout un microprocesseur, une unité de traitementlogique...
On n’entrera pas ici dans les détails du fonctionnement d’un microprocesseur ; c’esttrès intéressant à connaître, indispen...
La mémoireSur le PIC, il n’y a pas une mais trois mémoires :                                           13                 ...
La Mémoire RAM, qui fait partie de la zone d’adressage des données. Ellecomprend tous les registres spéciaux permettant de...
La Pile et le Compteur ProgrammeOn les a déjà évoqués dans le paragraphe « le cœur du PIC : le microprocesseur »,mais puis...
Le « Program Counter » ou PC est le compteur qui pointe dans la mémoireprogramme la prochaine instruction à exécuter. Il e...
Les Ports d’Entrées/Sorties généraux : PORTA, PORTB, PORTC,PORTD, PORTE                                          13       ...
Le PIC 16F877 est généreusement doté de 5 ports, ce qui est plutôt confortable. Unexamen plus attentif du schéma ci-dessus...
Le Port Parallèle Esclave (PSP : Parallel Slave Port)                                           13                        ...
Le circuit de génération d’horloge                                          13                                      DATA B...
Le TIMER0                                           13                                      DATA Bus           8     PORTA...
Le TIMER1                                         13                                      DATA Bus           8     PORTA  ...
Le Timer1 fonctionne sur le même principe que le Timer0, mais avec un registre decomptage plus gros : 16 bits au lieu de 8...
Le TIMER2                                          13                                      DATA Bus           8     PORTA ...
Les modules CCP1 et CCP2                                          13                                      DATA Bus        ...
On en a parlé au moment de voir les Timer1 et Timer2 ; on a deux modules CCP surle PIC. CCP pour « Capture, Compare, PWM »...
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
Prochain SlideShare
Chargement dans…5
×

Programmation des pic_en_c_part1

3 245 vues

Publié le

Publié dans : Industrie automobile
2 commentaires
2 j’aime
Statistiques
Remarques
Aucun téléchargement
Vues
Nombre de vues
3 245
Sur SlideShare
0
Issues des intégrations
0
Intégrations
1
Actions
Partages
0
Téléchargements
206
Commentaires
2
J’aime
2
Intégrations 0
Aucune incorporation

Aucune remarque pour cette diapositive

Programmation des pic_en_c_part1

  1. 1. Programmation des PIC en CMicrocontrôleur facile pour électronicien amateur PARTIE 1 Noxyben 2007 -1-
  2. 2. Introduction ................................................................................................................................ 3Intérêt de la programmation en langage C ................................................................................. 4Choix du compilateur ................................................................................................................. 5Choix d’un PIC : le 16F877 ....................................................................................................... 6Choix du programmateur ........................................................................................................... 7Structure 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 ................................................................................................................... 37Brochage du PIC16F877 .......................................................................................................... 38Conclusion................................................................................................................................ 38 -2-
  3. 3. IntroductionDans un passé pas très lointain, l’électronique pour les amateurs (éclairés) serésumait essentiellement aux circuits analogiques et éventuellement en logiquecâblée (portes logiques, compteurs, registres à décalage…). L’usage desmicroprocesseurs était plutôt réservé à un public averti d’ingénieurs sachant lesinterfacer avec différents circuits périphériques (eprom, ram…) et programmer enassembleur.Au fil du temps on a vu apparaître de nouveaux circuits regroupant dans une seulepuce 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ériquesintégrés, capacité de calcul accrue, plus de mémoire embarquée. Il y a maintenantde nombreux fabricants de microcontrôleurs, possédant chacun plusieurs gammesallant du circuit « généraliste », véritable couteau suisse électronique, à la pucespé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 laprogrammation en assembleur. On accède alors au moindre bit enfoui dansn’importe quel registre du circuit. Cela nécessite néanmoins un investissement entemps 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 existedes différences qui obligent à réapprendre tout ou partie du langage lorsque l’onchange de microcontrôleur. C’est un investissement intéressant pour unprofessionnel qui cherche à produire un code optimisé sur la puce la moins chèrepossible, mais pénible pour un amateur qui ne dispose que de relativement peu detemps pris sur ses loisirs.Heureusement, avec la montée en puissance des microcontrôleurs, on voitapparaître actuellement des compilateurs en langage C (voire même C++) quipermettent de gagner un temps considérable pour le développement et le débogagedes 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é desauter dans le train de l’électronique numérique et d’apprivoiser ces étranges petitesbê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 seraitvraiment dommage de se passer de leurs services…Une fois la décision prise « je vais me lancer dans les micros ! » se pose la questiondu 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 ladocumentation de Microchip sur la gamme de PIC « mid-range », c’est uneexcellente 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 desynthétiser quelque peu ces informations. Et pour éviter la frustration du « je sauraisutiliser un microcontrôleur PIC, mais avant je dois me taper un bouquin de 1000pages » je vais tâcher d’utiliser une approche progressive permettant de, trèsrapidement, créer de véritables petits circuits. -3-
  4. 4. Intérêt de la programmation en langage CTout d’abord, les inconvénients : Un compilateur C produit du code plus volumineuxet moins performant que ce que sait faire un bon programmeur en assembleur. Deplus, 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 mainsdans le cambouis, on risque également de moins approfondir l’étude dumicrocontrô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 permetde 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 Cest un langage de « haut niveau », comparé à l’assembleur, qui permet d’écrire desprogrammes nettement plus intelligibles et donc plus faciles à relire et corriger oumodifier. Le compilateur contrôle la cohérence du code au moment de la compilationet signale bon nombre d’erreurs, qui seront autant de bogues en moins à corriger. Lecompilateur prend en charge la gestion d’un certain nombre de mécanismesfastidieux : par exemple, pas besoin de spécifier la page mémoire dans laquelle onveut écrire, le compilateur s’en charge ! De plus, certains compilateurs permettenttout de même d’accéder à des ressources de bas niveau, voir même d’insérer dansle code des portions d’assembleur. A vrai dire, à moins d’être un « pro » del’assembleur, vous pourrez certainement créer avec un bon compilateur C un codeplus propre et plus robuste, en nettement moins de temps. Et, cerise sur le gâteau, leportage d’un de vos programmes sur un nouveau microcontrôleur sera nettementsimplifié.Pour bien fixer les idées sur la différence de niveau de langage entre assembleur etC, je vais donner un exemple. Soit à décrire une action simple : ouvrir la fenêtre de lapiè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êtreEt c’est le compilateur qui se chargerait de traduire la fonction « ouvrir la fenêtre » eninstructions élémentaires compréhensibles par le microcontrôleur.Alors, merci qui ? Merci le C ! -4-
  5. 5. Choix du compilateurIl y a sur le marché plusieurs compilateurs C. Le microcontrôleur étudié ici étant unPIC 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 quele haut de la gamme des PIC, ce qui est un peu luxueux pour un amateur désirants’initier à l’utilisation de ces petites bêtes.D’autres éditeurs proposent également des compilateurs dont certains sont trèscomplets, livrés avec des bibliothèques simplifiant l’utilisation des périphériques duPIC. Malheureusement, ici encore c’est assez cher, jusqu’à plusieurs centainesd’euros pour un environnement de développement intégré couvrant l’essentiel de lagamme des PIC.Heureusement il existe des alternatives moins onéreuses. Par exemple, encherchant bien sur internet on peut dénicher des compilateurs freeware en ligne decommande.Mon choix s’est porté sur le compilateur BoostC de la société SourceBoost, pour lesraisons 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 applicationspersonnelles, les versions payantes (à des tarifs très raisonnables) permettent decréer des applications commerciales et d’avoir accès au code source desbibliothèques. BoostC est livré avec un environnement de développement intégréfacilitant le développement d’applications. Le langage est du C « ANSI », avectoutefois quelques extensions destinées à tirer pleinement parti de toutes lesspécificités des microcontrôleurs PIC. Et surtout, BoostC reste assez proche dumaté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 lescontraintes 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 SourceBoostpropose également un compilateur C++ pour PIC, ainsi qu’un compilateur Basic.http://www.sourceboost.com -5-
  6. 6. Choix d’un PIC : le 16F877Pour apprendre, la meilleurs solution est de se faire la main sur du concret. On vadonc étudier un vrai microcontrôleur, sachant que ce qui aura été vu sera assezfacilement 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 lasérie inférieure sont un peu justes en performance et en capacité mémoire pouraccueillir un programme issu d’un compilateur C ; mieux vaut les programmer enassembleur. Les gammes supérieures (16 ou 32 bits) supportent sans problème laprogrammation en C, mais comme se sont des circuits plus complexes (et pluschers), commençons par quelque chose de plus simple et de plus didactique. Le16F877 (F comme « Flash ») convient parfaitement : mémoire programme de taillesuffisante (8K), nombreux périphériques intégrés, fréquence de fonctionnementjusqu’à 20 MHz. Tout ce qu’il faut pour créer des applications sympa en s’amusant ! -6-
  7. 7. Choix du programmateurUne fois le programme créé, il faudra le transférer dans la mémoire programme duPIC. Pour cela, il existe plusieurs solutions :Vous pouvez construire votre propre programmateur. De nombreuses variantesexistent, il suffit de faire une recherche sur le net pour s’en rendre compte. Cesprogrammateurs se raccordent sur un port série RS232 ou parallèle. A vrai dire lamajorité 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 estcertainement 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 enexiste pour port série, parallèle et, USB ! Sachant que les ports série RS232 etparallèle tendent à disparaître au profit de l’USB, cette dernière option, bien quesouvent un peu plus onéreuse semble être un bon choix. Il existe en outre des outilspermettant à la fois de programmer le microcontrôleur, mais aussi de le déboguer entemps 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 premiertemps dans la réalisation d’un programmateur « home made » (décrit dans un livrefort onéreux) qui n’a jamais daigné fonctionner, je me suis tourné vers cette dernièresolution : Un programmateur en kit Velleman K8076 pour une quarantaine d’euros(cest-à-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 enoutre la programmation « in-circuit », et est livré avec un logiciel de transfertcompatible avec l’essentiel de la gamme des PIC. Des mises à jour étant disponiblessur le site de Velleman pour les circuits les plus récents. Il faut procéder au montagesoi-même, mais ça marche du premier coup ! (du moins si vous êtes rigoureux aumoment 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. Unjour ou l’autre il faudra bien passer par l’USB…http://www.velleman.be -7-
  8. 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 registerLe schéma ci-dessus représente les différents modules du PIC 16F877. Ca a l’air unpeu complexe au premier abord, une visite guidée nous permettra d’y voir plus clair. -8-
  9. 9. Le cœur du PIC : le microprocesseurUn microcontrôleur, c’est avant tout un microprocesseur, une unité de traitementlogique qui effectue l’une après l’autre les opérations contenues dans unmicroprogramme stocké en mémoire (la mémoire FLASH). On peut le voir sur lesché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 detravail « W reg. », le multiplexeur « MUX », le registre de statut « status reg », leregistre « FSR reg » utilisé pour l’adressage indirect (en assembleur…), lemultiplexeur d’adresse « Addr mux », le compteur programme « Program Counter »qui pointe les instructions à exécuter, la pile à 8 niveaux « 8 level Stack », le registred’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. 10. On n’entrera pas ici dans les détails du fonctionnement d’un microprocesseur ; c’esttrè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 lecompilateur 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 avantagede la programmation en C : on prend du recul par rapport au fonctionnement intimedu 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 decomprendre quelques particularités du PIC, déroutantes au premier abord. Ons’aperçoit que les bus autour de l’ALU ont un format de 8 bits : le PIC 16F877travaille 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 largeque 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émoireprogramme, indépendante du bus de données, est elle-même adressée avec un buslarge : le « Program Counter », qui pointe sur l’instruction en cours, à une largeur de13 bits. Et avec 13 bits on peut coder environ 8000 adresses. Autrement dit, on à8000 cases de mémoire programme pouvant contenir chacune 1 instructioncomplète. Cette architecture avec bus de données et de programme séparés(architecture « Harvard ») permet donc d’optimiser le fonctionnement du PIC. Laplupart du temps, votre PIC exécute une instruction et charge la suivantesimultanément en un seul cycle d’horloge. En comparaison, un microcontrôleur 8 bitsconstruit selon l’architecture concurrente « Von Neumann » (mémoire programme etdonnées reliés au microprocesseur par un unique bus 8 bits) devra faire plusieurscycles pour chercher les instructions en mémoire (en plusieurs fois si c’est uneinstruction 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. 11. La mémoireSur 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 registerLa Mémoire Programme, de type FLASH sur le 16F877. Capacité : 8K. C’est danscelle-ci qu’est stocké le programme du PIC. Après compilation de votre code, lecompilateur génère un fichier « .hex », une suite de codes hexadécimaux. Celui-ciest 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 destocker le programme du PIC, mais PAS les variables de votre programme. Le grosavantage de la mémoire FLASH c’est que vous pouvez la réécrire, donc implanter unnouveau programme dans le PIC. Les PIC existent également avec d’autres versionsde mémoire programme (non-FLASH), certaines ne pouvant être programméequ’une seule fois. - 11 -
  12. 12. La Mémoire RAM, qui fait partie de la zone d’adressage des données. Ellecomprend tous les registres spéciaux permettant de contrôler le cœur du PIC ainsique ses périphériques. Elle contient également des cases mémoires à usagegénérique dans lesquelles pourront être stockées les variables de nos futursprogrammes.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 lePIC 16F877, on a 256 octets d’EEPROM disponible. Les mémoires de typeEEPROM sont limitées en nombre de cycles d’effacement / écriture. Ce nombre decycle est tout de même de l’ordre du million pour le PIC, mais si on l’utilisait pourstocker des variables modifiées plusieurs milliers de fois par secondes, cette limitepourrais être atteinte plus vite qu’on ne le croît. Par contre, pour stocker toute lesheures une mesure de température, c’est tout bon ! - 12 -
  13. 13. La Pile et le Compteur ProgrammeOn 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. 14. Le « Program Counter » ou PC est le compteur qui pointe dans la mémoireprogramme 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 celasignifie ? Simplement qu’on peut avoir jusquà 8 niveaux d’imbrication d’appels desous-programme ou fonctions. Ce point est surtout critique pour la programmation enassembleur : 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é quele 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 desouplesse : un bon compilateur veillera pour vous à ce que la limite de 8 niveaux nesoit 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 del’occupation en mémoire. Ainsi, mieux vaut-il éviter de créer trop de niveauxd’imbrication d’appels de fonctions dans nos programmes. - 14 -
  15. 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. 16. Le PIC 16F877 est généreusement doté de 5 ports, ce qui est plutôt confortable. Unexamen plus attentif du schéma ci-dessus nous montre cependant que les lignesd’entrées/sorties (les pattes du composant) correspondantes sont égalementutilisées par d’autres modules du PIC. Ainsi, les pattes du PORTA servent égalementau convertisseur Analogique/Numérique, les pattes du PORTD au Port ParallèleEsclave, 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 dedonnée (DATA BUS), on pourra donc librement les adresser pour y lire ou écrire desdonnées, et donc allumer des LED, commander des moteurs pas à pas, desafficheurs 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 quipeuvent êtres validées ou non par logiciel. - 16 -
  17. 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 registerLe Port Parallèle Esclave est un port 8 bits permettant d’interfacer le PIC avec, parexemple, un autre microprocesseur. Les données transitent via les lignes PSP0 àPSP7, qui physiquement utilisent les mêmes broches que le PORTD. Le flux dedonnées est contrôlé par les lignes RD, WR et CS qui correspondent aux broches duPORTE.C’est le microprocesseur externe qui est le chef d’orchestre : il valide notre PIC par laligne CS (Chip Select), et indique au PIC s’il lit ou écrit grâce aux lignes RD (Read) etWR (Write). D’où l’appellation de port parallèle ESCLAVE. Esclave, puisque c’est lemicroprocesseur externe qui donne les ordres, notre PIC ne fait qu’exécuter. - 17 -
  18. 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 registerPour faire battre le cœur de notre PIC, on a besoin d’un circuit de générationd’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 programmationdu PIC par des « bits de configuration » qui sont en fait des emplacements demémoire non-volatile. Pour générer un « cycle d’instruction », il faut 4 cyclesd’horloge. Autrement dit, si votre quartz bat à 20 MHz, les instructions du programmes’exécutent à une cadence de 5 MHz. - 18 -
  19. 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 registerDans 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 parailleurs lui appliquer une pré-division programmable entre 1 et 256.On peut librement lire ou écrire dans le registre de comptage associé. On peut doncle 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 dumicroprocesseur, on pourra s’en servir comme base de temps. - 19 -
  20. 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. 21. Le Timer1 fonctionne sur le même principe que le Timer0, mais avec un registre decomptage plus gros : 16 bits au lieu de 8, ce qui étend notablement ces capacités decomptage. De plus, il possède un mode de fonctionnement particulier : on peutl’utiliser en association avec un des modules CCP (modules de capture et decomparaison, 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. Commeon connaît la fréquence de comptage, on peut en quelque sorte « chronométrer » lasurvenue d’un événement. Exemple : si l’entrée du module CCP est reliée à uncapteur qui délivre une impulsion à chaque tour de l’arbre d’un moteur, la valeurcontenue dans le registre du Timer1 au moment de l’impulsion est le reflet de lavitesse de rotation.Voyons maintenant le mode « comparaison » : Le Timer1 compte en continu, et uneinterruption est générée chaque fois que la valeur du compteur est égale à cellequ’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. 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 registerLe Timer2 a un fonctionnement différent des Timer0 et Timer1. C’est un compteur 8bits 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 deLargeur d’Impulsion (MLI). - 22 -
  23. 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. 24. On en a parlé au moment de voir les Timer1 et Timer2 ; on a deux modules CCP surle 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 vitessed’un moteur à courant continu, réguler le courant (et donc la luminosité) dans uneampoule…Ils vont également nous permettre de comparer l’occurrence d’un signal en entréeavec la valeur du compteur Timer1, réalisant ainsi un chronométrage de l’événementen 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èrequasi-indépendante du reste du microcontrôleur qui pourra continuer à vaquer à sesoccupations. - 24 -

×