© ELECTRONIQUE-NUMERIQUE.COM, Octobre 2002.
Vous devez commencer à avoir sérieusement envie de savoir ce qui se cache derrière ce sigle 16F877 ! Le 16F877 est un microprocesseur à mémoire FLASH de la famille des PIC de Microchip. Son petit frère, le plus connu, est le 16F84. Ce petit CI a permis de faire découvrir au plus grand nombre les microprocesseurs faciles à programmer. Le cousin du 16F877 est le 16F876. La différence entre les 2 concerne uniquement les entrées sorties, le reste des possibilités étant globalement communes.
Avec le
16F877, on a le microprocesseur de la famille PIC le mieux équipé
et qui par conséquent présente le maximum de possibilités !!
Le Javamok J16877 n’est autre qu’un 16F877 dans lequel Digimok a implanté son merveilleux processeur BASIC. Le Javamok J16877 est donc un Biprocesseur.
Le Picpro 77 n’est autre qu’un 16F877 préprogrammé pour recevoir du code compilé à partir de la version gratuite du Basic Pic Pro. Le picpro 77 est donc quasiment un 16F877 « nature » mais très facilement programmable et utilisable.
Mais avant toute chose faisons les présentations : le 16F877 est un circuit intégré contenu dans un boîtier dit « DIL 40 ». Il présente donc 40 broches, 20 de chaque côté. Les broches sont virtuellement numérotées de 1 à 40, la broche 1 étant celle qui se trouve dans le coin situé à gauche de l’encoche de repérage.
Comme pour tout circuit intégré, chacune de ses broches a une ou plusieurs fonctions qui sont résumées par un sigle mnémotechnique. La description complète présentée ci-dessous se trouve dans le datasheet de Microchip. Nous vous présentons également un schéma simplifié du 16F877 avec les fonctions principales (que nous utiliserons le plus) de ses 40 broches. Voici ce que ça donne :
PAS DE
PANIQUE ! C’EST BEAUCOUP MOINS COMPLIQUE QU’IL N’Y PARAIT !!
Nous allons décrire les différentes broches du CI. Nous les avons classé de façon arbitraire :
Les broches de « fonctionnement » sont les broches qui permettent au microprocesseur de fonctionner. Ces broches doivent obligatoirement être connectées pour que le 16F877 fonctionne d’où leur nom.
Tout d’abord, comme tout CI, le 16F877 a des broches d’alimentation : 2 pour le 0V (Bleu) et 2 pour le +5V (Rouge). Il suffit de connecter une de chaque à l’alimentation pour que le CI fonctionne.
Ensuite, comme pour tout microprocesseur, le 16F877 va avoir besoin d’un « chef d’orchestre » pour « battre la mesure ». Ce « chef d’orchestre » va fixer la vitesse d’exécution des instructions. On utilise pour ce faire un quartz dont le rôle est de créer une impulsion de fréquence élevée. Dans le cas du 16F877, le quartz utilisé est typiquement un quartz de 20Mhz, c'est-à-dire qu’il va fournir 20 millions d’impulsions par secondes ! Non, ce n’est pas de la science fiction… 20 millions ça fait 20 000 000 d’impulsions par seconde. Le temps qui s’écoule entre 2 impulsions s’appelle un cycle d’horloge. Un cycle d’horloge dure donc 50 nanosecondes (c'est-à-dire 50 milliardième de seconde !).
Le microprocesseur va se baser sur cette fréquence pour son fonctionnement interne. Sachez que le 16F877 va exécuter une instruction élémentaire de langage assembleur en 4 cycles d’horloge. Il va donc pouvoir exécuter 5 millions d’opérations élémentaires par seconde ! Cela peut paraître énorme, mais ce n’est pas très rapide si l’on considère les PC actuels qui fonctionnent à 2 GigaHertz c'est-à-dire 2 milliards de cycle d’horloge par seconde.
Le quartz de 20Mhz est connecté sur les 2 broches OSC1 et OSC2. Sachez qu’il est possible d’utiliser des fréquences plus basses ou un circuit oscillateur externe. (Voir le datasheet) Mais cela n’a pas d’intérêt en ce qui nous concerne.
Une broche particulière du microprocesseur est la broche /MCLR (pour Master Clear ?). Cette broche est davantage une broche de « contrôle » que de fonctionnement. Cette broche a pour effet de provoquer la réinitialisation du microprocesseur lorsqu’elle est connectée à 0. Ceci provoque l’arrêt du programme qui va recommencer à la première instruction, l’ensemble des registres du microprocesseur vont par ailleurs être également remis à leur valeur de démarrage.
Pour que le microprocesseur fonctionne, il faut donc que cette broche soit connectée au +5V en permanence. Sur la carte Javamok, un bouton poussoir est prévu pour provoquer le reset par l’utilisateur. L’appui sur le BP va mettre transitoirement la broche MCLR à 0.
NB : Si un sigle de broche est précédé d’un slatch, cela signifie que la broche est active au niveau bas. Ainsi si on note /MCLR, cela signifie que le reset a lieu sur le niveau bas, si on note MCLR, cela signifie que le reset a lieu sur le niveau Haut.
Toutes les autres broches du 16F877 sont des broches de port. Elles peuvent aussi avoir d’autres rôles si les modules internes du 16F877 sont activés, comme nous allons le voir ultérieurement. Mais dans une première approche, il n’est pas nécessaire de s’encombrer l’esprit inutilement. Toutes les autres broches peuvent donc être utilisées comme des broches de Port.
|
Le 16F877 possède 5 ports différents : - le port A (6 broches) en bleu - le port B (8 broches) en orange - le port C (8 broches) en vert - le port D (8 broches) en violet - le port E (3 broches) en jaune NB : le 16F876 ne comporte pas les ports D et E soit 11 broches E/S de moins ! Les broches de chaque port sont numérotées de 0 à n. Les broches de ports sont désignées par un P suivi de la lettre du port et du numéro de broche. Ainsi, la broche 0 du port A est désignée par PA0, la broche 4 du port B par PB4, etc… Attention : tout comme pour la numérotation des bits d’un registre, la 5e broche du port B porte le numéro 4 (et non pas 5) Les sigles qui sont situés à côté du nom des broches de port rappelle les autres fonctions de ces broches. Seules les fonctions les plus importantes sont indiquées. |
Si vous faîtes le total, ça fait 33 broches d’entrées-sorties (E/S) disponibles ! C’est çà qui fait le gros avantage du 16F877 : avec autant de broches, on va pouvoir faire énormément de choses sans être limité ! A titre de comparaison, le PIC 16F84 ne possède qu’une petite 10aine de broches E/S. Toutes ces broches ne seront pas forcément disponibles en tant que broche E/S car plusieurs sont également utilisées par l’un ou l’autre des modules internes du 16F877. Elles ne seront pas disponibles en tant que broche E/S si le module concerné est activé.
Dans le cas du javamok J16877, comme nous le verrons, un certain nombre de broches sont également utilisées de façon fixe pour l’EEPROM externe et la liaison série. Généralement donc, au final, il reste une 20 aine de broches E/S disponibles, qui seront elles-mêmes vite utilisées si on connecte un clavier et un module LCD par exemple. Donc 33 broches, c’est pas de trop pour faire des applications élaborées sans être en permanence en train de se prendre la tête pour savoir où connecter tel ou tel module externe.
Concernant le picpro 77, les broches « déjà occupées » se limitent aux 2 broches PC6 et PC7. Toutes les autres broches E/S sont donc libres.
Toutes les broches de ces ports sont des broches E/S, c'est-à-dire que l’on va pouvoir les configurer en entrée ou en sortie. Avec ses broches, on va donc pouvoir soit « sortir » des données du 16F877 sous forme de 1 et de 0 correspondant respectivement à une mise des broches au niveau HAUT ou BAS. On va également pouvoir « lire » des données sous forme de 1 et de 0 correspondant respectivement à un niveau HAUT ou bas présent sur les broches. La toute première étape dans l’apprentissage de l’utilisation du processeur, c’est la lecture et l’écriture sur les broches de port. On va déjà pouvoir faire énormément de chose rien qu’avec cette notion.
Les caractéristiques électriques de ces broches de port sont spécifiées dans le datasheet du microprocesseur. Il n’est pas nécessaire de le détailler pour l’instant. Nous le ferons au fur et à mesure. Une chose à savoir cependant : l’intensité maximale que peut fournir une broche en sortie est de 20mA, ce qui permet de connecter directement sur la broche une LED avec une résistance. Pas besoin d’utiliser un circuit d’amplification. C’est bien vu de la part de Microchip…
La structure de chaque port, à quelques variations près, est grosso modo la même :
- chaque port est configuré par un registre de port, nommé TRIS dans le datasheet, suivi de la lettre du port. Ainsi le port A est configuré par le registre TRISA. Ne retenez pas cette dénomination. Par contre, habituez-vous au nom suivant : le registre de port s’appelle DDR suivi de la lettre du port en Basic Javamok. Ainsi le port B est configuré par le registre DDRB. Chaque bit de ces registres (TRIS ou DDR, c’est pareil) détermine le sens Entrée ou Sortie des broches du port. La numérotation est la même. Ainsi la broche 0 du port B est configurée par le bit 0 du registre DDRB. Notez qu’il est possible de configurer de façon distincte les différentes broches d’un même port : on peut ainsi configurer la broche 0 et la broche 1 en entrée et les autres broches en sortie. Nous verrons cela plus en détail ultérieurement.
- chaque port possède assez logiquement un registre de données associé. Pour chaque broche configurée en sortie, chaque bit du registre de donnée détermine le niveau BAS ou HAUT présent sur cette broche. Pour chaque broche configurée en entrée, à chaque bit du registre de donnée correspond le niveau BAS ou HAUT présent sur cette broche. Le registre peut être nommé de différente façon. En basic Javamok, on utilise la notation PORTA, PORTB, PORTC, PORTD et PORTE. Un bit de ce port est désigné par le nom du port suivi du numéro du bit qui correspond en fait au numéro de la broche. Ainsi le bit PORTA<1> correspond à la broche PA1. Nous reprendrons toutes les notations utilisées en Basic Javamok lorsque nous aborderons la programmation des ports.
EN RESUME :
- le sens E/S des broches est configuré
dans un registre appelé TRIS (16F877) ou DDR (J16877)
- un registre de données est attaché à
chaque port.
- on peut brancher une LED via une
résistance directement sur les broches de port en sortie.
La mémoire du 16F877 est de 3 types distincts :
C’est la mémoire programme proprement dite. Chaque « case » mémoire unitaire fait 13 bits. La mémoire FLASH est un type de mémoire stable, réécrivable à volonté. C’est ce nouveau type de mémoire qui a fait le succès de microprocesseur PIC. Dans le cas du 16F877, cette mémoire flash fait 8K. Lorsque l’on programme en assembleur, on écrit le programme directement dans cette mémoire. Mais lorsque l’on programme le Javamok, on n’utilise pas directement cette mémoire. En fait, le processeur software Basic de Digimok occupe cette mémoire qui n’est donc plus disponible directement dans le cas de J16877. Lorsque l’on programme en Basic Javamok, le programme est écrit dans une mémoire EEPROM externe au microprocesseur. Le gros avantage de ce système, c’est une simplification très importante de la programmation ainsi que de la gestion de la mémoire qui est vite compliquée lorsque l’on programme en assembleur. Avec le système Javamok, il n’y a pas de limitation contraignante de la taille théorique des programmes : les programmes peuvent faire 64K. En pratique, une EEPROM de 8K est déjà très largement suffisante.
C’est de la mémoire d’accès rapide, mais labile (c'est-à-dire qu’elle s’efface lorsqu’elle n’est plus sous tension). Cette mémoire contient les registres de configuration du PIC ainsi que les différents registres de données. Elle contient également les variables utilisées par le programme. Dans le cas de la programmation en Basic Javamok, il n’est pas nécessaire de s’occuper de la gestion de la mémoire RAM. Le compilateur Basic Javamok s’en charge.
Le PIC 16F877 contient également de la mémoire Electriquement effaçable, réécrivable et stable (appelée EEPROM). Ce type de mémoire est d’accès plus lent. Sauf cas particulier, lorsque l’on va programmer en Basic javamok, on ne s’occupe pas de cette mémoire.
Nous allons vous présenter ici une vue d’ensemble des différents modules utilisables qui sont présent dans la structure interne du 16F877. Nous expliquerons brièvement leur intérêt. Leur configuration et leur utilisation seront expliqués ultérieurement en fonction des besoins rencontrés dans le cadre de la programmation. Le but de cette présentation est uniquement de donner un aperçu des possibilités du 16F877. Bien évidemment, il n’est absolument pas nécessaire de retenir toutes ces informations pour commencer à programmer le système javamok.
Le 16F877 comprend donc :
1. Trois timers / compteurs :
- le timer 0
- le timer 1
- le timer 2
2. Un convertisseur analogique-numérique (CAN) 10 bits
3. Un module de génération d’impulsion à période réglable (PWM)
4. Un module de communication série synchrone
5. Une USART
6. Un module de communication en « port parallèle »
7. Un « chien de garde »
Voici le schéma de la structure interne du 16F877, issu du datasheet de Microchip. On distingue très bien les différents modules et les différents ports :
Le gros intérêt des modules de comptage, c’est qu’il permettent de tenir compte d’évènements qui surviennent de façon répétée sans que le microprocesseur soit monopolisé par cette tâche. Dans la plupart des cas, une interruption a lieu que lorsque le compteur déborde (overflow).
Le timer 0 est un compteur 8 bits qui peut compter (de 0 à 255) :
- soit les impulsions de l’horloge via un prédiviseur
- soit des impulsions externes, via la broche PA4
Le débordement (=overflow) du compteur, qui a lieu lorsque le compteur passe de 255 à 0, provoque une interruption.
Nous utiliserons ce module essentiellement pour réaliser des comptages d’évènements externes
Le timer 1 est un compteur 16 bits qui peut compter (de 0 à 65535) :
- soit les impulsions de l’horloge
- soit les impulsions externe, et en particulier les impulsions d’un quartz externe.
Là aussi, le débordement provoque une interruption.
Dans les projets que nous développerons, le timer 1 sera utilisé essentiellement pour la création d’une horloge « Temps réel » en utilisant un quartz horloger de 32,768 Khz. Cette utilisation est décrite dans la documentation Digimok.
Le timer 2 est un timer couplé au module dit CCP. Nous l’utiliserons essentiellement pour la génération d’impulsions à période ajustable (PWM).
Le CAN présent dans le 16F877 est un CAN 10bits. Un CAN convertit une tension analogique en une valeur numérique binaire, qui pourra ensuite être utilisée pour des calculs ou autres. Sa résolution de 10bits donne une précision en 5V de 5mv environ, ce qui est une précision tout à fait intéressante pour la plupart des besoins de l’électronicien amateur.
Par ailleurs, ce CAN peut convertir les tensions de 8 voies analogiques disponibles sur ce microprocesseur, ce qui est là encore tout à fait intéressant pour l’électronicien amateur. On peut par exemple envisager la lecture de la température ou de toute autre grandeur physique (humidité, distance, …) grâce à plusieurs capteurs différents connectés chacun sur une voie analogique.
Ce CAN étant associé au microprocesseur, il va être possible d’envisager de l’acquisition de données. On pourra par exemple envisager une application de mesure de la température sur une journée ou une semaine et lire les données acquises dans un second temps, éventuellement sur un écran de PC.
Ce CAN va permettre de créer des applications de processus régulés type thermostat, arrosage, surveillance aquarium, etc…
Ce module est très puissant pour créer des impulsions à des fréquences élevées, par exemple à 38 Khz, dans le cadre d’une communication infrarouge. On pourra définir la période, la durée du niveau haut pendant cette période. Tout çà sans que le processeur passe tout son temps à cette tâche…
Ce module sera utilisé dans des applications de détection d’obstacle par exemple.
Le 16F877 dispose d’un module de communication série synchrone.
Le 16F877 dispose d’un module de communication parallèle intégré, utilisant les 3 broches de contrôle habituelles CS, RS et WR.
Le chien de garde est un oscillateur qui est capable de réveiller le microprocesseur mis à l’arrêt par le programme. Dans le cadre de la programmation en Basic Javamok, je n’utilise quasiment pas ce module.
Et voilà, on a fait le tour ….Et vous avez tout çà dans la « bête » pour à peine plus de 100FF ! C’est fou non ?
Le 16F877 possède de nombreuses sources d’interruptions. En tout, pas moins de 14 sources différentes d’interruption sont disponibles avec le 16F877. Les plus importantes à connaître, car ce sont les plus utilisées en pratique courante, sont :
Le débordement (c'est-à-dire le passage de 255 à 0 ) du timer 0 provoque une interruption.
Le débordement (c'est-à-dire le passage de 65535 à 0) du timer 0 provoque une interruption.
La broche PB0 peut être configurée pour déclencher une interruption à l’apparition d’un front Montant ou Descendant sur cette broche. Cette interruption peut être utile pour rendre le microprocesseur sensible à une action sur un module externe type clavier par exemple, ou encore un simple bouton poussoir.
Une modification sur une ou plusieurs broches des 4 broches PB4, 5, 6 et 7 (demi port B) provoque une interruption. Cette interruption disponible sur le 16F877 ne semble pas utilisable avec le J16877 car les 3 broches PB5,6 et 7 sont utilisées pour la communication avec l’EEPROM externe.
Le module CAN peut générer une interruption lorsqu’une conversion analogique numérique est terminée.
- interruption du port parallèle
- interruption du port série (réception et émission)
- interruption du module CCP1
- interruption du timer2
Nous ne faisons que les citer ici, afin que l’on sache qu’elles existent mais leur connaissance n’est pas utile dans un premier temps. Il sera toujours temps d’y revenir le moment voulu.
Maintenant que nous en savons un peu plus le 16F877, processeur « natif » sur lequel est basé le J16877, découvrons enfin le Biprocesseur Javamok J16877.
Electronique-numerique.com – Tous droits réservés 2002
Mis à jour le 10/09/2002.